はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

【PHPUnit】少し複雑な条件はassertThatを使う

f:id:secret_hamuhamu:20150404170600p:plain

PHPUnitや他のxUnit系に assertThat という少し複雑な条件を書くことができるアサーションがあります。
PHPUnitで、たまに使う assertThat を紹介してみようかなと思います。

環境構成

  • PHPUnit 4.8.6
  • PHP 5.6.13

assertThat使い方

assertThatは、アサーションの中に条件を指定できるというような感じです。
その他のassertXXXで、できないかというとほとんどできると思います。
できるけれども、assertThat使ったほうが分かりやすかったりテストを書くのが楽な場合は、私はこちらを使います。

サンプルコード

<?php

class Test extends PHPUnit_Framework_TestCase
{
    /** @test */
    public function 配列が指定したキーを保持していること()
    {
        // アサーションのassertArrayHasKeyで同様の事はできます
        $users = [
            '太郎' => '',
            '花子' => '',
            '芳子' => '',
            '健太' => '',
        ];

        $this->assertThat($users, $this->arrayHasKey('太郎'));
    }

    /** @test */
    public function 配列が指定した値を保持していること()
    {
        $users = [
            '太郎' => '',
            '花子' => '',
            '芳子' => '',
            '健太' => '',
        ];

        $this->assertThat($users, $this->contains(''));
    }

    /** @test */
    public function 配列が指定した型の値のみを含むこと()
    {
        $users = [
            '太郎' => '',
            '花子' => '',
            '芳子' => '',
            '健太' => '',
            // '次郎' => 1, stringではないので、エラーになる
        ];

        $this->assertThat($users, $this->containsOnly('string'));
    }

    /** @test */
    public function 10より大きいこと()
    {
        $this->assertThat(11, $this->greaterThan(10));
    }

    /** @test */
    public function 10以上であること()
    {
        $this->assertThat(10, $this->greaterThanOrEqual(10));
    }

    /** @test */
    public function 10以上20未満であること()
    {
        $this->assertThat(
            10,
            $this->logicalAnd(
                $this->greaterThanOrEqual(10),
                $this->lessThan(20)
            )
        );
    }

    /** @test */
    public function prefix_で始まること()
    {
        $this->assertThat('prefix_hoge', $this->stringStartsWith('prefix_'));
    }

    /** @test */
    public function _suffixで終わること()
    {
        $this->assertThat('hoge_suffix', $this->stringEndsWith('_suffix'));
    }
}

他にどんなことができるのか?

  • GitHubからPHPUnit_Framework_Constraintのコードを眺める
  • PHPUnitのドキュメント assertThat() を参照

おすすめの本

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

Javaのオブジェクト指向がゼッタイにわかる本―最初からそう教えてくれればいいのに!

Javaのオブジェクト指向がゼッタイにわかる本―最初からそう教えてくれればいいのに!

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

  • 作者: ロバート・C・マーチン,瀬谷啓介
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2008/07/01
  • メディア: 大型本
  • 購入: 18人 クリック: 586回
  • この商品を含むブログ (71件) を見る

知識ゼロから学ぶソフトウェアテスト 【改訂版】

知識ゼロから学ぶソフトウェアテスト 【改訂版】