品質の高いコードを書くには、TDD(テスト駆動開発)ではなくてもテストを念頭に置いてコーディングする必要があります。ところが、数あるPHPのテストツールから必要な機能は備えつつも、重すぎない適したツールを選ぶのは大変です。
そこで2017年時点でおすすめする、8つのテストツールを紹介します。
PHPUnit
PHPUnitは幅広く使えるテストフレームワークです。2014年にSebastian Bergmannが開発し、最新版はバージョン6。PHP 7が必要です。
Cucumber
Cucumberは仕様に基づいて受入れテストを作成するフレームワークです。自然な文章の説明文を生成することで有名です。Cucumberの公式なPHPの実装はBehatです。
Behatの初心者向けチュートリアルです。以下のサンプルで、期待される動作がどう表現するのか分かります。
Feature: Listing command
In order to change the structure of the folder I am currently in
As a UNIX user
I need to be able see the currently available files and folders there
Scenario: Listing two files in a directory
Given I am in a directory "test"
And I have a file named "foo"
And I have a file named "bar"
When I run "ls"
Then I should get:
"""
bar
foo
"""
Atoum
AtoumもPHPのユニットテストフレームワークです。スタンドアローンパッケージで、実行ファイルをGitHub、Composer、PHARからインストールできます。
Atoumには理解しやすいメソッド名とメソッドチェーンがあり、読みやすいテストが書けます。
$this->integer($classInstance->myMethod())
->isEqualTo(10);
$this->string($classInstance->myMethod())
->contains("Something heppened");
Atoumを使ったPHPのユニットテストは、チュートリアルを読んでください。
Selenium
Seleniumはブラウザーテスト(統合と受入れテスト)を自動化するツールです。テストをブラウザーAPIコマンドに変換して、期待される結果が得られることを確認します。ほぼすべてのブラウザーをサポートしています。
SeleniumではPHPUnitを拡張機能として使えます。
composer require --dev phpunit/phpunit
composer require --dev phpunit/phpunit-selenium
簡単な使用例を示します。
class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase
{
public function testFormSubmissionWithUsername()
{
$this->byName('username')->value('name');
$this->byId('subscriptionForm')->submit();
}
}
PHPUnitとSeleniumを使ったテストはこのシリーズを読んでください。
Dusk
LaravelのDuskもブラウザー自動化ツールで、スタンドアローン(chromedriverとセット)かSeleniumで使用できます。使いやすいAPIで、エレメント待機、ファイルアップロード、マウスコントロールなど多くのテストケースをカバーできます。簡単な例を示します。
class LanguagesControllerTest extends DuskTestCase
{
public function testCreate()
{
$this->browse(function (Browser $browser) {
$user = $this->getAdminUser();
$browser->loginAs($user)
->visit('/panel/core/languages')
->click('#add')
->assertPathIs('/panel/core/languages/create')
->type('name', 'Arabic')
->select('direction', 'rtl')
->press('Submit')
->assertSee('Language: Arabic')
->assertSee('ar')
->assertSee('rtl')
->assertSee('Language created');
});
}
}
Duskを使い始めるには、このチュートリアルがおすすめです。
Kahlan
KahlanはUnitとBDDの多機能なテストフレームワークで、文法「describe」と「it」を使います。
describe("Positive Expectation", function() {
it("expects that 5 > 4", function() {
expect(5)->toBeGreaterThan(4);
});
});
この文法はBehatテストに似ています。Kahlanは追加の依存オブジェクトやstubやmockをサポートしていて、コードカバレッジやレポートなどもあります。
it("makes a instance double with a parent class", function() {
$double = Double::instance(['extends' => 'Kahlan\Util\Text']);
expect(is_object($double))->toBe(true);
expect(get_parent_class($double))->toBe('Kahlan\Util\Text');
});
php_testability
最後に紹介するのはPHP Testabilityです。静的分析ツールで、プログラムのテスト実施に関する問題を検知して詳細なレポートを生成します。
このパッケージは現時点でタグのついたリリース版は存在しませんが、開発段階のもので問題なく使用できます。Composer経由でインストールします。
composer require edsonmedina/php_testability "dev-master"
次のコマンドで実行します。
vendor/bin/testability . -x vendor
継続的インテグレーション(CI)サービス
チームでコーディングするには、プロジェクトの公式なレポジトリに統合する前にコードを自動的にチェックする機能が重要です。多くのCIサービスやツールには、異なるプラットホームや設定でコードをテストして、安全に統合できることを確認する機能が備わっています。
適正な価格のサービスもたくさん存在していますが、オープンソースのツールも使えます。
- PHPCI:(オープンソース)入門記事
- TravisCI:(オープンソースプロジェクト向けは無償)入門記事
- SemaphoreCI:(オープンソースプロジェクト向けは無償)入門記事
- Jenkins:入門記事
最後に
テストを重視する文化を醸成するのは難しいものの、根気よく取り組めば少しずつ広がります。コードを大切にするなら、テストすべきです。ここで紹介したツールやリソースがその手掛かりになるでしょう。
最新のテクノロージーとツールを反映して、2017年6月30日に改稿しました。
(原文:8 Must Have PHP Quality Assurance Tools)
[翻訳:内藤 夏樹/編集:Livit]