Codeceptionを使ってみた(3) Functionalテスト
前回までは単にFizzBuzzを生成できるようになったものの、
アプリケーションとしては成り立っていないので、
今回はコンソール出力するアプリケーションを作成し,そのテストを書いてみます。
また、コードカバレッジを取得してみます。
1. CLIアプリケーションの作成
2. functionalテストの作成
前回はunitテストでしたが、今回はfunctionalテストを生成します。
2.1. テストの生成
C:\workspace\proj>vendor\bin\codecept.bat generate:cept functional fizz_buzz Test was created in fizz_buzzCept.php
「generate:cept」のほかに、「generate:cest」っていうのもありますが、Codeception Commandsによると、
- cept
- Generates new empty test file for acceptance and functional tests. Scenario-based test is called Cept, though.
- cest
- Generates new empty test file for scenario-based unit tests. This file format is called Cest = Cept + Test.
とのこと。むむう。
2.2. CLIモジュールを組み込む
なんだろうなぁ、Guyに「がちょん!」って武器を装着するイメージ?
今回はコンソール出力のテストを行いたいので、Cli Moduleを組み込みます。
- tests/functional.suite.yml
class_name: TestGuy modules: enabled: [Filesystem, Cli, TestHelper]
「Cli」を追加します。
モジュールを組み込んだ後は、必ず「build」コマンドを用いてGuyに武器を「がちょん」します。
C:\workspace\proj> vendor\bin\codecept.bat build Building Guy classes for suites: acceptance, functional, unit WebGuy includes modules: PhpBrowser, WebHelper WebGuy.php generated successfully. 45 methods added TestGuy includes modules: Filesystem, Cli, TestHelper TestGuy.php generated successfully. 14 methods added CodeGuy includes modules: CodeHelper CodeGuy.php generated successfully. 0 methods added
2.3. テストの記述
<?php $I = new TestGuy($scenario); $I->wantTo("test app/fizz_buzz.php"); $I->runShellCommmand("php app/fizz_buzz.php"); $I->seeInShellOutput("1\n2\nFizz\n4\nBuzz"); $I->seeInShellOutput("14\nFizzBuzz\n16"); $I->seeInShellOutput("98\nFizz\nBuzz"); $I->dontSeeInShellOutput("101");
このコードであれば、どのようなテストをしているか、一目瞭然ですね!
ちなみに、「runShellCommmand」は本家がtypoしており、gitの最新版では修正されています。
参考:Fix typo in runShellCommand method by akuzemchak · Pull Request #394 · Codeception/Codeception · GitHub
【追記】バージョン1.6.4で修正がリリースされました。
2.4. テストの実行
C:\workspace\proj>vendor\bin\codecept.bat run functional --steps Codeception PHP Testing Framework v1.6.3.1 Powered by PHPUnit 3.7.21 by Sebastian Bergmann. Suite functional started Trying to test app/fizz_buzz.php (fizz_buzzCept.php) Scenario: * I run shell commmand "php app/fizz_buzz.php" * I see in shell output "1 2 Fizz 4 Buzz" * I see in shell output "14 FizzBuzz 16" * I see in shell output "98 Fizz Buzz" * I don't see in shell output "101" OK Time: 0 seconds, Memory: 4.75Mb OK (1 test, 4 assertions)
3. コードカバレッジ
- codeception.yml に以下を追加
coverage: enabled: true whitelist: include: - src/*.php exclude: ~ blacklist: include: ~ exclude: ~
あとは、コードカバレッジを出力するオプションを有効にしてrunします。
C:\workspace\proj>vendor\bin\codecept.bat run --coverage --html --xml Codeception PHP Testing Framework v1.6.3.1 Powered by PHPUnit 3.7.21 by Sebastian Bergmann. Suite acceptance started Suite functional started Trying to test app/fizz_buzz.php (fizz_buzzCept.php) - Ok Suite unit started Trying to test generate fizz buzz succeed (DevMStudy\Tdd\FizzBuzzTest::testGenerateFizzBuzzSucceed) - Ok Time: 7 seconds, Memory: 8.50Mb OK (2 tests, 14 assertions) Code Coverage Report 2013-07-08 11:04:33 Summary: Classes: 100.00% (1/1) Methods: 100.00% (1/1) Lines: 100.00% (12/12) \DevMStudy\Tdd::FizzBuzz Methods: 100.00% ( 1/ 1) Lines: 100.00% ( 12/ 12)
XML, HTML形式のレポートは「tests/_log」配下に生成されます。
以上です。
いったん「使ってみた」シリーズはこれでおしまいにします。
CodeceptionはSeleniumと連携してのテストも可能ですので、溜まってきたらまた書きます。