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コマンドを利用します。
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)
以上です。次回はコンソール出力のテストを書いてみます。