PHPUnit。 パート03 PHPUnitのテストの作成

翻訳者の序文
この記事では、PHPUnit公式ドキュメントのロシア語への翻訳を続けています。
パート1パート2

例4.1は、PHPUnitを使用してPHP配列の操作をテストする方法を示しています。 この例は、PHPUnitテストに共通する基本的な規則と手順を示しています。
例4.1:PHPUnitを使用してPHP配列で操作をテストする
<?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は、テスト間の明示的な依存関係の宣言をサポートしています。
このような依存関係は、テストを実行する順序を決定しません。
ただし、テスト環境(フィクスチャ)のインスタンスを返して別のテストに渡すことはできます。 ソース(プロデューサー)はレシーバー(コンシューマー)に渡されます。
例4.2は、 @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

Source: https://habr.com/ru/post/J89175/


All Articles