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

Codeceptionを使ってみた(3) Functionalテスト

前回FizzBuzzのUnitテストを書きました。

前回までは単にFizzBuzzを生成できるようになったものの、
アプリケーションとしては成り立っていないので、
今回はコンソール出力するアプリケーションを作成し,そのテストを書いてみます。
また、コードカバレッジを取得してみます。

1. CLIアプリケーションの作成

FizzBuzzを生成して出力するだけで大したことないです。
プロジェクトルートのappディレクトリ配下に作成しました。

<?php
require_once __DIR__ . "/../vendor/autoload.php";

$generator = new DevMStudy\Tdd\FizzBuzz();
$fizzBuzz = $generator->generate(1, 100);
foreach ($fizzBuzz as $line) {
    echo $line . "\n";
}

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モジュールを組み込む

Codeceptionはテストの内容や利用しているフレームワークに応じて適切なモジュールを組み込むことにより、専用のassertを利用できるようになります。
なんだろうなぁ、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. テストの記述

  • tests/functional/fizz_buzzCept.php
<?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. コードカバレッジ

Code Coverageに沿ってやればすぐできます。

  • 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と連携してのテストも可能ですので、溜まってきたらまた書きます。