このページの本文へ

あなたのPHPのコード品質を高めるテストツール8選【2017年版】

2017年08月01日 17時58分更新

文●Younes Rafie

  • この記事をはてなブックマークに追加
本文印刷

品質の高いコードを書くには、TDD(テスト駆動開発)ではなくてもテストを念頭に置いてコーディングする必要があります。ところが、数あるPHPのテストツールから必要な機能は備えつつも、重すぎない適したツールを選ぶのは大変です。

そこで2017年時点でおすすめする、8つのテストツールを紹介します。

PHPUnit

PHPUnitは幅広く使えるテストフレームワークです。2014年にSebastian Bergmannが開発し、最新版はバージョン6。PHP 7が必要です。

Cucumber

Cucumberは仕様に基づいて受入れテストを作成するフレームワークです。自然な文章の説明文を生成することで有名です。Cucumberの公式なPHPの実装はBehatです。

Behat logo

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 logo

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 Logo

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 logo

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サービスやツールには、異なるプラットホームや設定でコードをテストして、安全に統合できることを確認する機能が備わっています。

Thumbs up and down in one

適正な価格のサービスもたくさん存在していますが、オープンソースのツールも使えます。

最後に

テストを重視する文化を醸成するのは難しいものの、根気よく取り組めば少しずつ広がります。コードを大切にするなら、テストすべきです。ここで紹介したツールやリソースがその手掛かりになるでしょう。

最新のテクノロージーとツールを反映して、2017年6月30日に改稿しました。

(原文:8 Must Have PHP Quality Assurance Tools

[翻訳:内藤 夏樹/編集:Livit

Web Professionalトップへ

この記事の編集者は以下の記事をオススメしています