PHP入門:PHPUnitにおけるテストの実施方法について

スポンサーリンク
PHP入門:PHPUnitにおけるテストの実施方法について ノウハウ
PHP入門:PHPUnitにおけるテストの実施方法について
この記事は約11分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、PHPUnitにおけるテストの実施方法についてご紹介します。

スポンサーリンク

前提

この記事は下記の公式サイトのドキュメントをベースにしています。

概要

PHPUnitの目標のひとつに、テストはコンポーザブルであるべきだということがあります。たとえば、プロジェクト全体のテストを実行したり、 プロジェクトの一部であるコンポーネントの全クラスのテストを実行したり、 あるいはひとつのクラスのテストだけを実行したりといった具合です。

PHPUnit では、さまざまな方法でテストをまとめることができます。この記事では、もっともよく使われる方法を説明します。

ファイルシステムを使用したテストスイートの構成

テストスイートを作成するもっとも簡単な方法は、 テストケースのソースファイルをすべて test ディレクトリにまとめることでしょう。PHPUnit は、テストディレクトリを再帰的に走査することで テストを自動的に検出し、実行します。

sebastianbergmann/raytracer プロジェクトのテストスイートを見てみましょう。

このプロジェクトのディレクトリ構造を見ると、tests/unit ディレクトリにあるテストケースクラスは src ディレクトリにあるテスト対象システム (SUT) のパッケージやクラス構造を反映していることがわかります。

src
├── Camera.php
├── Color.php
├── PointLight.php
├── World.php
├── autoload.php
├── canvas
│   ├── AnsiMapper.php
│   ├── Canvas.php
│   ├── CanvasIterator.php
│   ├── PortablePixmapMapper.php
│   └── WebpMapper.php
├── exceptions
│   ├── Exception.php
│   ├── IntersectionHasNoHitException.php
│   ├── InvalidArgumentException.php
│   ├── OutOfBoundsException.php
│   ├── RuntimeException.php
│   └── WorldHasNoLightException.php
├── intersection
│   ├── Intersection.php
│   ├── IntersectionCollection.php
│   ├── IntersectionCollectionIterator.php
│   └── PreparedComputation.php
├── material
│   ├── CheckersPattern.php
│   ├── GradientPattern.php
│   ├── Material.php
│   ├── Pattern.php
│   ├── RingPattern.php
│   └── StripePattern.php
├── math
│   ├── Matrix.php
│   ├── Ray.php
│   ├── Transformations.php
│   └── Tuple.php
└── shapes
    ├── Plane.php
    ├── Shape.php
    ├── ShapeCollection.php
    ├── ShapeCollectionIterator.php
    └── Sphere.php
tests/unit
├── CameraTest.php
├── ColorTest.php
├── PointLightTest.php
├── WorldTest.php
├── canvas
│   ├── AnsiMapperTest.php
│   ├── CanvasTest.php
│   └── PortablePixmapMapperTest.php
├── intersection
│   ├── IntersectionCollectionTest.php
│   └── IntersectionTest.php
├── material
│   ├── CheckersPatternTest.php
│   ├── GradientPatternTest.php
│   ├── MaterialTest.php
│   ├── PatternTest.php
│   ├── RingPatternTest.php
│   └── StripePatternTest.php
├── math
│   ├── MatrixTest.php
│   ├── RayTest.php
│   ├── TransformationsTest.php
│   └── TupleTest.php
└── shapes
    ├── PlaneTest.php
    ├── ShapeCollectionTest.php
    ├── ShapeTest.php
    └── SphereTest.php

tests/integration
└── PuttingItTogetherTest.php

testing/integration ディレクトリには、tests/unit ディレクトリの単体テストとは別に保管される統合テスト ケースが含まれています。

全テストケースを実施する

このプロジェクトのすべてのテストを実行するには、PHPUnit コマンドライン テスト ランナーがテスト ディレクトリを指すようにする必要があります。

% ./tools/phpunit --bootstrap tests/bootstrap.php tests
PHPUnit 10.2.1 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.7
Configuration: /github/raytracer/phpunit.xml

...............................................................  63 / 177 ( 35%)
............................................................... 126 / 177 ( 71%)
...................................................             177 / 177 (100%)

Time: 00:15.538, Memory: 28.42 MB

OK (177 tests, 657 assertions)

PHPUnit コマンドラインのテストランナーがディレクトリを指定すると、 *Test.php ファイルを探します。

特定のテストだけを実施する

tests/unit/WorldTest.php の WorldTest テストケースクラスで宣言されたテストだけを実行するには、次のコマンドを使います。

% ./tools/phpunit --bootstrap src/autoload.php tests/unit/WorldTest.php
PHPUnit 10.2.1 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.7
Configuration: /github/raytracer/phpunit.xml

.............                                                     13 / 13 (100%)

Time: 00:00.006, Memory: 22.42 MB

OK (13 tests, 30 assertions)

条件にあったテストだけを実施する

実行するテストをより細かく制御するには、-filterオプションを使用します。

% ./tools/phpunit --bootstrap src/autoload.php tests/unit --filter test_creating_a_world
PHPUnit 10.2.1 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.7
Configuration: /github/raytracer/phpunit.xml

.                                                                   1 / 1 (100%)

Time: 00:00.003, Memory: 24.42 MB

OK (1 test, 2 assertions)

XML 設定を使用したテストスイートの作成

PHPUnit の XML 設定ファイル (The XML Configuration File) を使用してテストスイートを作成することもできます。例 4.1 に示すのは最小限の phpunit.xml ファイルで、tests ディレクトリを再帰的に走査した際に *Test.php ファイルで見つかったすべての *Test クラスを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/|version|/phpunit.xsd"
         bootstrap="tests/bootstrap.php">
    <testsuites>
        <testsuite name="unit">
            <directory>tests/unit</directory>
        </testsuite>

        <testsuite name="integration">
            <directory>tests/integration</directory>
        </testsuite>
    </testsuites>
</phpunit>

XML 設定ファイルができたので、 あとは引数 (tests など) やオプション (–bootstrap など) を指定せずに PHPUnit テストランナーをコールしてテストを実行できるようになります。

% ./tools/phpunit
PHPUnit 10.2.1 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.7
Configuration: /github/raytracer/phpunit.xml

...............................................................  63 / 177 ( 35%)
............................................................... 126 / 177 ( 71%)
...................................................             177 / 177 (100%)

Time: 00:15.576, Memory: 28.42 MB

OK (177 tests, 657 assertions)

PHPUnit テストランナーの –list-suites オプションを使用すると、 PHPUnit の XML 設定ファイルで定義されているすべてのテストスイートの一覧を表示することができます。

% ./tools/phpunit --list-suites
PHPUnit 10.2.1 by Sebastian Bergmann and contributors.

Available test suite(s):
 - unit
 - integration

PHPUnit テストランナーの –testsuite オプションを使用すると、 実行するテストを XML 設定ファイルで指定したテストスイートのテストに限定することができます。

% ./tools/phpunit --testsuite unit
PHPUnit 10.2.1 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.7
Configuration: /github/raytracer/phpunit.xml

...............................................................  63 / 172 ( 36%)
............................................................... 126 / 172 ( 73%)
..............................................                  172 / 172 (100%)

Time: 00:00.072, Memory: 24.42 MB

OK (172 tests, 637 assertions)

おわりに

今日は、PHPUnitにおけるテストの実施方法についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました