2

私はPHPSimpleTestフレームワークを初めて使用しますが、アサーションが失敗してもテストメソッドが停止しないことに驚きました。つまり、これにより、テストレポートに2つの失敗メッセージが表示されます。

function testFoo() {
    $this->assertTrue(true, 'first: %s');
    $this->assertTrue(false, 'second: %s');
    $this->assertTrue(false, 'third: %s');
}

私の単体テストの経験のほとんどはJUnitNUnitを使用したものであり、どちらも最初のアサーションが失敗するとすぐにテストメソッドを停止します。たぶん私はそれに慣れているかもしれませんが、余分な失敗メッセージはただのノイズになるようです。セミコロンがないために50個のエラーを吐き出す古いCコンパイラを思い出させます。

SimpleTestをすばやく失敗するように構成できますか、それとも別のスタイルで生活する必要がありますか?

4

4 に答える 4

5

Reporterクラスを拡張/変更して、paintFail()の後にexit()を実行することができます。
(ユニットテストの変更は必要ありません)

または

assert *関数はブール値を返します。たとえば、次のようになります。

 $this->assertTrue(false, 'second: %s') or return;

現在のテスト機能を終了します。

PS:
UnitTestCaseの代わりにPHPUnit_TestCaseクラスを使用している場合、assert*関数はブール値を返しません。

于 2010-01-30T15:15:34.383 に答える
3

これは実際にはあなたの質問に答えるものではありませんが、その価値のために、PHPUnitは常に速く失敗します。

http://www.phpunit.de/manual/current/en/goals.htmlによると:

...最初にテストが失敗すると、テストの実行が停止し、PHPUnitが失敗を報告します。

于 2010-01-30T00:45:40.277 に答える
1

assertメソッドはpassまたはfailのブール値を返すので、それを確認して、何かが失敗したときにテストを停止できます。

これはプロジェクト内のすべてのテストに拡張できるとは思いませんが、特にノイズの多いテストの中には、このメリットが得られる場合があります。

簡単な例を次に示します。

function testBar() {
    $pass = $this->assertTrue(true, 'first: %s');
    $pass = $pass && $this->assertTrue(false, 'second: %s');
    $pass = $pass && $this->assertTrue(false, 'third: %s');
}

ifステートメントを使用して、コードのより大きなチャンクをラップできます。

于 2010-01-29T23:20:05.853 に答える
1

すべてのテストは稼働中のデータベースに依存しているため、これが必要でした。データベースがダウンしている場合、10,000回失敗した画面についてはあまり気にしません。simpletestは失敗するとすぐに出力され、それは単なるphpコードであるため、単純なdieステートメントで実際にテストを停止できます。

重要な「接続されていますか」テストのコードは次のようになります。

function testDatabaseAccess()
{
  $connected = TRUE;
  GLOBAL $clients;
  $connected &= $this->assertTrue(is_object($clients), 'Clients database not connected.');

  GLOBAL $practices;
  $connected &= $this->assertTrue(is_object($practices), 'Practices database not connected.');

  GLOBAL $user;
  $connected &= $this->assertTrue(is_array($user), 'User not defined.');

  GLOBAL $practice;
  $connected &= $this->assertTrue(is_object($practice), 'Practice database not connected.');

  if (!$connected)
  {
    die('Not Connected.');
  }
}

生成するもの:

ここに画像の説明を入力してください

もちろん、要約行は取得しませんが、私のユースケースでは、要約行は必要ありません。DBも、テストの意味もありません。残りのテストでは、すぐに失敗しないことが実際に気に入っています。私は通常、1回の実行ですべての失敗を確認したいと思います。

于 2016-09-02T18:38:36.893 に答える