読者です 読者をやめる 読者になる 読者になる

Codeceptionを使ってみた(2) Unitテスト

前回は Codeceptionを使ってみた(1) - think it over

簡単なCLIアプリケーションをテストしてみようと思います。
前回の予告どおり、題材はFizzBuzz問題を取り上げてみます。

今回はFizzBuzzを生成する箇所のUnitテストを書いています。

1. テスト対象の作成

プロジェクトのルートにsrcディレクトリを作成し、その中にFizzBuzzを生成するクラスを実装します。

<?php
namespace DevMStudy\Tdd;

class FizzBuzz
{
    public function generate($start, $end)
    {
        $fizzBuzz = [];
        for ($i = $start; $i <= $end; $i++) {
            if ($i % 15 === 0) {
                $fizzBuzz[] = "FizzBuzz";
            } else if ($i % 3 === 0) {
                $fizzBuzz[] = "Fizz";
            } else if ($i % 5 === 0) {
                $fizzBuzz[] = "Buzz";
            } else {
                $fizzBuzz[] = $i;
            }
        }
        return $fizzBuzz;
    }
}

名前空間は適当に。コードの良し悪しはさておき。。。

2. Unitテストの作成

2.1. テストを生成

FizzBuzzが正しくgenerateされるかどうかをテストするために、unitテストを作成します。
Codeceptionではテストを作成する際には、generateコマンドを利用します。

generate
  generate:cept            Generates empty Cept file in suite
  generate:cest            Generates empty Cest file in suite
  generate:phpunit         Generates empty PHPUnit test without Codeception additions
  generate:scenarios       Generates text representation for all scenarios
  generate:suite           Generates new test suite
  generate:test            Generates empty unit test file in suite

これらです。

generate:testを使います。

C:\workspace\proj> .\vendor\bin\codecept.bat generate:test unit "DevMStudy/Tdd/FizzBuzz"
Test was created in C:\workspace\proj\tests\unit\DevMStudy\Tdd\FizzBuzzTest.php

生成されたFizzBuzzTest.phpを見ると、

  • _before
  • _after
  • testMe

の3つのメソッドが存在します。
このクラス、最終的には「PHPUnit_Framework_TestCase」を継承しており、「_before」「_after」はそれぞれPHPUnitの「setUp」「tearDown」の中で呼ばれるようになっています。

2.2. テストを記述

「testMe」をそれらしい名前に変えてテストを書いていきます。

<?php
    public function testGenerateFizzBuzzSucceed()
    {
        $I = $this->codeGuy;
        $target = new FizzBuzz();
        $fizzBuzz = $target->generate(1, 30);

        $I->expect("count(\$fizzBuzz) is 30");
        $this->assertCount(30, $fizzBuzz);

        $I->expect("1 is 1");
        $this->assertEquals(1, $fizzBuzz[0]);

        (以下略)
    }

PHPUnit_Framework_TestCase」を継承しているので、assertEqualsとか使えます。
「$I->expect」はコードおよびテストの結果出力の可読性向上のためのもので、テストの挙動には影響のないものです。

2.3. テストを実行

runコマンドでテストを実行できます。
いろいろオプションはあります。

C:\workspace\proj>vendor\bin\codecept.bat run unit --steps
Codeception PHP Testing Framework v1.6.3.1
Powered by PHPUnit 3.7.21 by Sebastian Bergmann.

Suite unit started
Trying to test generate fizz buzz succeed (DevMStudy\Tdd\FizzBuzzTest::testGenerateFizzBuzzSucceed)
* I expect count($fizzBuzz) is 30
* I expect 1 is 1
* I expect 2 is 2
* I expect 3 is Fizz
* I expect 5 is Buzz
* I expect 6 is Fizz
* I expect 10 is Buzz
* I expect 15 is FizzBuzz
* I expect 16 is 16
* I expect 30 is FizzBuzz
 - Ok


Time: 0 seconds, Memory: 4.75Mb

OK (1 test, 10 assertions)

以上です。次回はコンソール出力のテストを書いてみます。