LoginSignup
2
1

More than 3 years have passed since last update.

PHPUnitを使えるようにする。

Last updated at Posted at 2019-02-21
  • 環境
    • macOS Mojave バージョン10.14.2
    • Composer version 1.8.0

前提

  • Composerがインストールされていること
    • ComposerはPHP向けのツールで、ライブラリなどの依存関係を管理してくれます。

プロジェクトの情報や依存関係を記述するcomposer.jsonを作る

$ composer init


  Welcome to the Composer config generator  



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [hoge/fuga]: 好きに/書く
Description []: 説明文を書く
Author [ponsuke <ponsukeのメールアドレス>, n to skip]: n
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: お好きに

Define your dependencies.

# 必要なパッケージを定義します。
Would you like to define your dependencies (require) interactively [yes]? yes
Search for a package: php
Enter the version constraint to require (or leave blank to use the latest version): 7.3.1
Search for a package: 

# 開発やテストに必要なパッケージを定義します。
Would you like to define your dev dependencies (require-dev) interactively [yes]? yes
Search for a package: phpunit/phpunit
Enter the version constraint to require (or leave blank to use the latest version): 7.5.2
Search for a package: 

# 以下の内容が、composer.jsonとして出力されます。
{
    "name": "tryphp/qiita",
    "description": "Sample For Qiita post.",
    "type": "project",
    "require": {
        "php": "7.3.1"
    },
    "require-dev": {
        "phpunit/phpunit": "7.5.2"
    },
    "license": "MIT",
    "minimum-stability": "dev"
}

Do you confirm generation [yes]? yes

依存するライブラリをComposerでインストールする

$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 28 installs, 0 updates, 0 removals
  - Installing sebastian/version (2.0.1): Downloading (100%)         
  - Installing sebastian/resource-operations (dev-master 4d7a795): Cloning 4d7a795d35 from cache
  - Installing sebastian/object-reflector (dev-master 7707193): Cloning 7707193304 from cache
  - Installing sebastian/recursion-context (dev-master dbe1869): Cloning dbe1869c13 from cache
  - Installing sebastian/object-enumerator (dev-master e6be0a5): Cloning e6be0a5481 from cache
  - Installing sebastian/global-state (2.0.0): Downloading (100%)         
  - Installing sebastian/exporter (dev-master c8c4f19): Cloning c8c4f196e3 from cache
  - Installing sebastian/environment (dev-master 585fbcd): Cloning 585fbcdeff from cache
  - Installing sebastian/diff (dev-master 6906fbe): Cloning 6906fbe334 from cache
  - Installing sebastian/comparator (dev-master 33825cd): Cloning 33825cd25f from cache
  - Installing phpunit/php-timer (dev-master 9ef9968): Cloning 9ef9968ba2 from cache
  - Installing phpunit/php-text-template (1.2.1): Downloading (100%)         
  - Installing phpunit/php-file-iterator (dev-master 2da97ea): Cloning 2da97ea973 from cache
  - Installing theseer/tokenizer (1.1.0): Downloading (100%)         
  - Installing sebastian/code-unit-reverse-lookup (dev-master 22f5f5f): Cloning 22f5f5ff89 from cache
  - Installing phpunit/php-token-stream (dev-master 6df086c): Cloning 6df086c042 from cache
  - Installing phpunit/php-code-coverage (dev-master afe4b8a): Cloning afe4b8aa75 from cache
  - Installing doctrine/instantiator (dev-master 8c8c1af): Cloning 8c8c1afee0 from cache
  - Installing symfony/polyfill-ctype (v1.10.0): Downloading (100%)         
  - Installing webmozart/assert (1.4.0): Downloading (100%)         
  - Installing phpdocumentor/reflection-common (1.0.1): Downloading (100%)         
  - Installing phpdocumentor/type-resolver (0.4.0): Downloading (100%)         
  - Installing phpdocumentor/reflection-docblock (4.3.0): Downloading (100%)         
  - Installing phpspec/prophecy (dev-master 7e27218): Cloning 7e27218052 from cache
  - Installing phar-io/version (2.0.1): Downloading (100%)         
  - Installing phar-io/manifest (dev-master 7761fca): Cloning 7761fcacf0 from cache
  - Installing myclabs/deep-copy (1.x-dev 3e01bda): Cloning 3e01bdad3e from cache
  - Installing phpunit/phpunit (7.5.2): Downloading (100%)         
sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (^2.6.1)
phpunit/phpunit suggests installing phpunit/php-invoker (^2.0)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files

$ ls -l
total 136
-rw-r--r--@  1 mana  staff    344  1 20 19:11 composer.json
# composer.lockは、ダウンロードしたパッケージとそのバージョンが書き込まれていて、プロジェクトをそれらの特定のバージョンに固定します。
-rw-r--r--@  1 mana  staff  52362  1 20 16:37 composer.lock
# vendorディレクトリが作成されて、その配下にライブラリがインストールされます。
drwxr-xr-x@ 15 mana  staff    480  1 20 19:03 vendor

PHPUnitのパスを通す

# .bash_profileにphpunitのパスを書いて
$ echo 'export PATH="/Path/To/vendor/bin/phpunit:$PATH"' >> ~/.bash_profile
# 反映して
$ source ~/.bash_profile
# 確認します。
$ phpunit --version
PHPUnit 7.5.2 by Sebastian Bergmann and contributors.

ソースを格納する srctests を作る

# srcディレクトリは、ソースファイルを格納するディレクトリ
$ mkdir src

# testsは、テストコードのファイルを格納するディレクトリ
$ mkdir tests

$ ls -l
total 136
-rw-r--r--@  1 mana  staff    344  1 20 19:11 composer.json
-rw-r--r--@  1 mana  staff  52362  1 20 16:37 composer.lock
drwxr-xr-x@  2 mana  staff     64  2  4 22:09 src
drwxr-xr-x@  2 mana  staff     64  2  4 22:10 tests
drwxr-xr-x@ 15 mana  staff    480  1 20 19:03 vendor

scr ディレクトリをマッピングするために autoload をcomposer.json定義する

名前空間からパスへの相対的なマッピングを定義します。
名前空間のプリフィックス"App\"でsrc/ を定義すると、App\Hoge\Fugaクラスをソースでロードする場合は、オートローダーが src/App/Hoge/fuga.php という名前のファイルを探します。
名前空間のプリフィックスは、似たプリフィックスと区別できるように\\で終わらせる決まりです。

composer.json
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },

対応付けのためのクラスマップ生成

$ composer dump-autoload
Generated autoload files containing 543 classes

# PSR-4の参照はすべて、vendor/composer/autoload_psr4.phpにある連想配列に定義されます。
$ cat vendor/composer/autoload_psr4.php 
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
    'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
    'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
    'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
    'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
    'App\\' => array($baseDir . '/src'),
);

PHPUnitの設定ファイルとなるphpunit.xmlを作る

phpunit.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- <phpunit>要素で、PHPUnitのコア機能を設定します。 -->
<phpunit colors="true" bootstrap="vendor/autoload.php">
    <!--<testsuites>要素と<testsuite>要素で、テストスイート群やテストケース群の中からテストスイートを構成します。-->
    <testsuites>
        <testsuite name="Test suite">
            <!--テストコードを作成するディレクトリとして作成したtestsディレクトリを指定します。-->
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
    <!-- <filter>要素とその子要素で、コードカバレッジ対象のファイルのホワイトリストを設定します。 -->
    <filter>
        <whitelist>
            <directory suffix=".php">./src/</directory>
        </whitelist>
    </filter>
</phpunit>
$ ls -l
total 136
-rw-r--r--@  1 mana  staff    856  1 20 15:17 associativeArray.php
-rw-r--r--@  1 mana  staff    345  2  4 22:46 composer.json
-rw-r--r--@  1 mana  staff    263  1 20 18:41 composer.json.bak
-rw-r--r--@  1 mana  staff  52362  1 20 16:37 composer.lock
-rw-r--r--@  1 mana  staff    612  2  7 22:15 phpunit.xml
drwxr-xr-x@  2 mana  staff     64  2  4 22:09 src
drwxr-xr-x@  2 mana  staff     64  2  4 22:10 tests
drwxr-xr-x@ 15 mana  staff    480  1 20 19:03 vendor

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1