前回の PHP 単体テスト ツール: PHPUNIT の予備記事では、phpunit について予備的な理解をしました。この記事では、引き続き phpunit の使用法を詳しく説明します。
1. markTestSkipped と markTestIncomplete
phpunit には、markTestSkipped と markTestIncomplete という 2 つの便利なメソッドがあります。これらを使用すると、単に合格または不合格という結果以上の単体テストを作成できます。 markTestSkipped は、PHPUNIT がすでに記述されたテスト メソッドを実行するのを防ぎます。次のプログラムのような例を示します:
php
パブリック 関数 testThisMightHaveADb()
{
$myObject->createObject();
試してください {
$db = new Database();
$this->assertTrue($db->rowExists( ));
} catch (DatabseException $e) {
$this->markTestSkipped("データベースに問題があったため、このテストはスキップされました");
}
}
?>
上記のプログラムでは、データベース接続後にデータが存在するかどうかを判定するテストメソッドですが、データベース接続例外を考慮する場合は、markTestSkipped を使用して、データベース接続時にテストメソッドを無視することを示す必要があります。はい、例外が発生したため、注意すると、この時点で作成したコードは正しい可能性がありますが、例外が発生したため、phpunit は出力時に単純に失敗を出力しません。
MarkTestIncomplete は多少似ていますが、開発者が未完了のテスト メソッドを作成するときに使用され、テスト結果が同じではなく失敗するだけであるという点が異なります。テストメソッドがまだ書かれていないことを phpunit に伝えます。例は次のとおりです:
php
public function testAreNotEnoughHours()
{
$this->markTestIncomplete("テストは緑色になります");
$trueVariable = true;
$this->assertTrue($trueVariable);
}
?>
2. phpunit のアサーションについて詳しく学ぶ
前回の記事では、phpunit でのいくつかの基本的なアサーションの使用について基本的に説明しました。次に、クラスのコードを示します。
php
クラス テスト可能
{
public $trueProperty = true ;
public $resetMe = true ;
public $testArray = array (
"最初のキー" => 1 、
"2 番目のキー" => 2
);
private $testString = " いくつかの文字列が大好きです";
public function __construct()
{
}
public function addValues($valueOne,$ valueTwo) {
return $valueOne+$valueTwo;
}
public function getTestString()
{
return $this->testString;
}
}
?>
私たちが作成した単体テスト コードの暫定的なフレームワークは次のとおりです。
php
クラス TestableTest 拡張 PHPUnit_Framework_TestCase
{
プライベート $_testable = null ;
public function setUp()
{
$this->_testable = 新しいテスト可能();
}
public functiontearDown()
{
$this->_testable = null ;
}
/** テストメソッドはここに移動します */
}
?>
前回の記事でsetUpメソッドとtearDownメソッドを紹介しましたが、ここでのsetUpメソッドではTestable()インスタンスを確立して変数$_testableに保存しますが、tearDownメソッドではオブジェクトを破棄します。
次に、テストするアサーションの作成を開始します。まず、assertTrue とassertFalase を確認します。
php
public function testTruePropertyIsTrue()
{
$this->assertTrue($this->_testable->trueProperty,"trueProperty は true ではありません" );
}
public function testTruePropertyIsFalse()
{
$this->assertFalse($this->_testable->trueProperty, "trueProperty は false ではありません");
}
?>
AssertTrue とassertFalse は前の記事で紹介しましたが、ここで 2 番目のパラメータに注目してください。これはアサーションのテストが失敗したときにカスタマイズされた情報を表示することを意味します。たとえば、このテスト メソッドでは、trueProperty が true でない場合、「trueProperty isn"t true」というメッセージが表示されます。
php
public function testValueEquals()
{
$valueOne = 4;
$valueTwo = 2;
$this->assertEquals($this->_testable->addValues($valueOne,$valueTwo),6);
}
public function testValueGreaterThan()
{
$valueOne = 4;
$valueTwo = 2;
$this->assertGreaterThan($valueTwo,$valueOne);
}
public function testLessThanOrEqual()
{
$valueOne = 4;
$valueTwo = 2;
$this->assertLessThanOrEqual($valueTwo,$valueOne);
}
public function testAreObjectsEqual()
{
$testTwo = new Testable();
$this->_testable->resetMe = false;
$this->assertEquals($this->_testable,$testTwo);
}
?>
このうち、assertEqualsは等しいかどうかの判定に使用され、assertGreaterThanはより大きいかどうかの判定に使用され、assertLessThanOrEqualは以下かどうかの判定に使用され、ここで注目すべきはassertEqualsです。たとえば、$testTwo は、Testable クラスのこのインスタンスが新しく設定されたresetMe オブジェクトと等しいかどうかを判断するためにも使用されます。
数値アサーションに加えて、文字に関するアサーション関数も多数あります。次のコードを参照してください。
php
public function testStringEnding()
{
$testString = $this-> _testable->getTestString();
$this->assertStringEndsWith("frood",$testString);
}
public function testStringStarts()
{
$testString = $this-> _testable->getTestString();
$this->assertStringStartsWith("フーピー",$testString);
}
public function testEqualFileContents()
{
$this->assertStringEqualsFile("/path/to/textfile.txt"、"ふー");
}
public function testDoesStringMatchFormat()
{
$testString = $this-> _testable->getTestString();
$this->assertStringMatchesFormat("%s" ,$testString);
}
?>
このうち、assertStringStartsWith アサーションは指定した文字列で始まるかどうかを判定し、assertStringEndsWith アサーションは指定した文字列で終わるかどうかを判定します。 assertStringEqualsFile アサーションは、指定されたファイルに指定された文字が含まれているかどうかを判断します。たとえば、ここではファイル textfile.txt に文字列 foo が含まれているかどうかが判断されます。
また、assertStringMatchesFormat を使用すると、$this->assertStringMatchesFormat("%s",$testString);
など、文字列が要件を満たしているかどうかを判断するための一致パターンを指定できます。ここでは、$testString が文字列型であるかどうかを判断します。詳細については、phpunit のマニュアルを参照してください。
次のコードを見てみましょう:
php
public function testStringIsNotNull()
{
$notANull = 「私"は null ではありません!";
$this->assertNull($notANull);
}
パブリック関数 testStringIsSame()
{
$numberAsString = "1234";
$this->assertSame(1234,$numberAsString);
}
?>
このうち、assertNull は変数が null であるかどうかを判断しますが、assertSame は 2 つの変数が同じ型であるかどうかを厳密に判断します。PHP は弱い型指定言語ですが、assertSame は $numberAsString が文字列型であるかどうかを判断できません。予想される 1234 数値型と一致するため、テストは失敗します。
最後に、一般的には使用されないかもしれないが、単体テストの作業に非常に役立つ可能性があるアサーションを見てみましょう。まず、次のコードを見てみましょう。
php
public function testArrayKeyExists()
{
$this->assertArrayHasKey("最初のキー" ,$this->_testable->testArray);
}
public function testAttributeExists()
{
$this->assertClassHasAttribute("resetMe",get_class($this->_testable));
}
public function testFileIsReal()
{
$this->assertFileExists("/path/to/file.txt");
}
public function testIsInstance()
{
$this->assertInstanceOf("OtherClass",$this->_testable);
}
php
public function testDoesMatchRegex()
{
$testString = $this-> _testable->getTestString();
$this->assertRegExp("/[a-z]+/ ",$testString);
}
?>
コード内の最初のアサーション、assertArrayHasKey は、配列内の各キー値が存在するかどうかを確認するために使用されます。たとえば、配列では、値「firstkey」に対応するキー 1 があるため、テストに合格できます。 。また、assertClassHasAttribute は、特定のクラスに対応する属性があるかどうかを判断できます。この例では、
もテストに合格します。そして、assertFileExists は、指定されたファイルがローカル ファイル システムに存在するかどうかを判断します。そして、assertInstanceOf は、作成しているオブジェクトがクラスのインスタンスであるかどうかを決定します。 assertRegExp これは、特定の文字列が特定の正規表現に一致するかどうかを判断するためのものであることは誰もが知っていると思います。
概要
この記事では、PHPUNIT のいくつかの重要なメソッドとアサーションについてさらに説明します。PHPUNIT には、単体テストの改善に非常に役立つ豊富なアサーションも多数あります。詳細については、PHPUNIT ユーザー マニュアルを参照してください。