この記事では、PHPUnit公式ドキュメントのロシア語への翻訳を続けています。
パート1 、 パート2
例4.1は、PHPUnitを使用してPHP配列の操作をテストする方法を示しています。 この例は、PHPUnitテストに共通する基本的な規則と手順を示しています。
- テストクラスの名前は、テストされたクラスの名前にPostfix
Test
を追加することで形成されます。 たとえば、テストクラスはClass
と呼ばれ、テストクラスはClassTest
です。 -
ClassTest
(ほとんどの場合)PHPUnit_Framework_TestCaseから継承されます。 - テストメソッドの名前は、テストするメソッドの名前に
test
プレフィックスを追加することによって形成されます。 - テストメソッド内では、アサーションは特別な関数
assertEquals()
によって指定されます
( セクションPHPUnit_Framework_Assertを参照)。assertEquals()
は、実際の受信値と期待値の対応を設定します。
<?php<br>
require_once 'PHPUnit/Framework.php' ;<br>
<br>
class StackTest extends PHPUnit_Framework_TestCase<br>
{<br>
public function testPushAndPop()<br>
{<br>
$stack = array();<br>
$ this ->assertEquals(0, count($stack));<br>
<br> array_push($stack, 'foo' );<br>
$ this ->assertEquals( 'foo' , $stack[count($stack)-1]);<br>
$ this ->assertEquals(1, count($stack));<br>
<br> $ this ->assertEquals( 'foo' , array_pop($stack));<br>
$ this ->assertEquals(0, count($stack));<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
「
print
機能を使用して値を表示するかどうかに関係なく、テストを作成するか、
デバッグ式。 " Martin Fowler
依存関係をテストする
「ユニットテストは通常、開発者がバグを見つけて修正し、コードをリファクタリングし、モジュールのドキュメント化を容易にするために作成されます。
これらの目標を達成するために、テストは理想的にはプログラムで可能なすべてのパスをカバーする必要があります。
通常、1つのテストは1つの関数またはメソッドの1つの特定のパスをカバーします。
ただし、テストメソッドは、カプセル化された独立したエンティティであるとは限りません。
多くの場合、テストシナリオの実装に隠されたテスト間に明らかな依存関係はありません。
エイドリアン・クーン他 等
PHPUnitは、テスト間の明示的な依存関係の宣言をサポートしています。
このような依存関係は、テストを実行する順序を決定しません。
ただし、テスト環境(フィクスチャ)のインスタンスを返して別のテストに渡すことはできます。 ソース(プロデューサー)はレシーバー(コンシューマー)に渡されます。
- ソースは、他のモジュールメソッドが依存する値を返すテストメソッドです。
- レシーバーは、1つ以上のソースとその戻り値に依存するテストメソッドです。
@depends
アノテーションを使用してテスト間の依存関係を記述する方法を示しています。
例4.2:
@depends
アノテーションを使用して依存関係を記述する
この例では、最初のテスト<?php<br>
class StackTest extends PHPUnit_Framework_TestCase<br>
{<br>
public function testEmpty()<br>
{<br>
$stack = array();<br>
$ this ->assertTrue(empty($stack));<br>
<br>
return $stack;<br>
}<br>
<br>
/** <br>
* @depends testEmpty <br>
*/ <br>
public function testPush(array $stack)<br>
{<br>
array_push($stack, 'foo' );<br>
$ this ->assertEquals( 'foo' , $stack[count($stack)-1]);<br>
$ this ->assertFalse(empty($stack));<br>
<br>
return $stack;<br>
}<br>
<br>
/** <br>
* @depends testPush <br>
*/ <br>
public function testPop(array $stack)<br>
{<br>
$ this ->assertEquals( 'foo' , array_pop($stack));<br>
$ this ->assertTrue(empty($stack));<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
testEmpty()
は空の配列を作成し、配列が空であることを示します。 その後、テストは結果としてフィクスチャを返します。
2番目のテスト
testPush()
は
testPush()
に依存し、
testEmpty()
の結果を引数として受け取ります。 最後に、
testPop()
は
testPop()
依存します。
テストの失敗に関する重要なメッセージに注意を集中したいと考えています。これにより、欠陥をすばやく見つけることができます。
このため、ソース(メインテスト)が失敗した場合、PHPUnitは依存テストの実行をスキップします。 欠陥検出の改善は、例4.3に示すように、テスト間の依存関係を使用することで実現されます。
例4.3:テスト間の依存関係の使用
<?php<br>
class DependencyFailureTest extends PHPUnit_Framework_TestCase<br>
{<br>
public function testOne()<br>
{<br>
$ this ->assertTrue(FALSE);<br>
}<br>
<br>
/** <br>
* @depends testOne <br> */ <br>
public function testTwo()<br> {<br>
}<br>}<br>?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
phpunit --verbose DependencyFailureTest セバスチャン・バーグマンによるPHPUnit 3.4.2。 DependencyFailureTest FS 時間:0秒 1つの障害がありました。 1)testOne(DependencyFailureTest) <boolean:false>がtrueであるとのアサートに失敗しました。 /home/sb/DependencyFailureTest.php:6 1つのスキップされたテストがありました。 1)testTwo(DependencyFailureTest) このテストは、「DependencyFailureTest :: testOne」に合格することに依存しています。 失敗! テスト:2、アサーション:1、失敗:1、スキップ:1。
テストには複数の
@depends
アノテーションが含まれる場合があります。
PHPUnitは、テストが実行される順序を変更しません。
テストを開始する前に、依存関係が満たされることを確認する必要があります。
データプロバイダー
テストメソッドは、任意の引数を使用できます。
引数は、データソースメソッド(
provider()
、例4.4を参照
provider()
を使用して渡されます。
データソースメソッドは、
@dataProvider
アノテーションを使用して定義する必要があります。
データソースメソッドは
public
である必要があり、配列の配列、または反復ごとに配列を返す
Iterator
インターフェイスをサポートするオブジェクトを返す必要があります。
コレクションの一部である配列ごとに、テストメソッドが呼び出されます。 値の配列は、引数としてメソッドに渡されます。
例4.4:データソースの使用
<?php<br>
class DataTest extends PHPUnit_Framework_TestCase<br>
{<br>
/** <br>
* @dataProvider provider <br>
*/ <br>
public function testAdd($a, $b, $c)<br>
{<br>
$ this ->assertEquals($c, $a + $b);<br>
}<br>
<br>
public function provider()<br>
{<br>
return array(<br>
array(0, 0, 0),<br>
array(0, 1, 1),<br>
array(1, 0, 1),<br>
array(1, 1, 3)<br>
);<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
phpunit datatest セバスチャン・バーグマンによるPHPUnit 3.4.2。 ... F 時間:0秒 1つの障害がありました。 1)データを含むtestAdd(DataTest)(1、1、3) <integer:2>が期待値<integer:3>と一致することをアサートできませんでした。 /home/sb/DataTest.php:21 失敗! テスト:4、アサーション:4、失敗:1。
ご注意
テストメソッドがデータソース(
@dataProvider
)からのパラメーターと、依存として定義されている1つ以上のテスト(
@dataProvider
)を同時に渡す場合、データソースが最初に使用され、次に他のテストのみが使用されます。
例外テスト
例4.5は、テストのために
@expectedException
アノテーションを使用する方法を示しています
テストコード内でスローされる例外。
例4.5:@expectedExceptionアノテーションの使用
<?php<br>
require_once 'PHPUnit/Framework.php' ;<br>
<br>
class ExceptionTest extends PHPUnit_Framework_TestCase<br>
{<br>
/** <br>
* @expectedException InvalidArgumentException <br>
*/ <br>
public function testException()<br>
{<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
phpunit ExceptionTest セバスチャン・バーグマンによるPHPUnit 3.4.2。 F 時間:0秒 1つの障害がありました。 1)testException(ExceptionTest) 予期される例外InvalidArgumentException 失敗! テスト:1、アサーション:1、失敗:1。
setExpectedException()
メソッドは、テストメソッドで例外がスローされることを示す別の方法です。例4.6を参照してください。
例4.6:テストメソッドは例外をスローすることが期待されています
<?php<br>
require_once 'PHPUnit/Framework.php' ;<br>
<br>
class ExceptionTest extends PHPUnit_Framework_TestCase<br>
{<br>
public function testException()<br>
{<br>
$ this ->setExpectedException( 'InvalidArgumentException' );<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
phpunit ExceptionTest セバスチャン・バーグマンによるPHPUnit 3.4.2。 F 時間:0秒 1つの障害がありました。 1)testException(ExceptionTest) 予期される例外InvalidArgumentException 失敗! テスト:1、アサーション:1、失敗:1。
表4.1は、例外をテストする方法をまとめたものです。
表4.1(テキスト版)。 例外をテストする方法
void setExpectedException(string $exceptionName)
-予期される例外の名前の設定は、
$exceptionName
です。
String getExpectedException()
-予想される例外の名前を取得します。
例外をテストするには、例4.7に示すアプローチを使用できます。
例4.7:例外をテストするための代替アプローチ
<?php<br>
require_once 'PHPUnit/Framework.php' ;<br>
<br>
class ExceptionTest extends PHPUnit_Framework_TestCase {<br>
public function testException() {<br>
try {<br>
// ... Code that is expected to raise an exception ... <br>
}<br>
<br>
catch (InvalidArgumentException $expected) {<br>
return ;<br>
}<br>
<br>
$ this ->fail( 'An expected exception has not been raised.' );<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
例4.7に示すコードは、例外をスローすることが期待されています。 これが行われない場合、
fail()
メソッドが呼び出されます(参照
( 表22.2を参照)、テストを中断し、エラーを通知します。
例外がスローされると、
catch
ブロックが起動し、テストが成功します。
PHPエラーテスト
デフォルトでは、PHPUnitは、テスト中に表示されるエラー、警告、および通知を例外に変換します。 この機能を使用すると、たとえば、テストに同様の例外が現れるのを待つメカニズムを設定できます。例4.8を参照してください。
例4.8:@expectedExceptionを使用してPHPエラーを予期する
<?php<br>
class ExpectedErrorTest extends PHPUnit_Framework_TestCase<br>
{<br>
/** <br>
* @expectedException PHPUnit_Framework_Error <br>
*/ <br>
public function testFailingInclude()<br>
{<br>
include 'not_existing_file.php' ;<br>
}<br>
}<br>
?> <br>
<br>
* This source code was highlighted with Source Code Highlighter .
phpunit ExpectedErrorTest セバスチャン・バーグマンによるPHPUnit 3.4.2。 。 時間:0秒 OK(1テスト、1アサーション)
PHPUnit_Framework_Error_Notice
および
PHPUnit_Framework_Error_Warning
PHPの通知と警告を表します。
継続:
パート4