なぜPHPUnitは物事をOOのやり方でやろうと主張するのですか?

oop php phpunit

燃え上がる危険があります…​ 文脈が暗黙的である文脈では、関数ではなくメソッドへの呼び出しを強制することにはどのような利点があります。

PHPの構文がメソッドを呼び出すのにはあまりにも醜いことを考えると、PHPUnitの作成者はなぜその使用を強制したのでしょうか。

フレームワークがグローバルな “currentTestCase”オブジェクトを設定し、それから透過的に失敗したアサーションをそのオブジェクトに関連付けたなら、我々は書くことができます:

assertEquals( "blah"、$ text);

同等のものとは異なり、冗長です。

$ this-> assertEquals( "blah"、$ text);

この文脈でオブジェクト指向を使用することによって正確に何が得られますか。

私を啓発してください。

  1  0


ベストアンサー

PHPUnitはxUnitから派生したものであり、それがhttps://secure.wikimedia.org/wikipedia/en/wiki/XUnit[xUnit]によるものです。

どうしてxUnitはそんなことをするの? 頼んでよかったです。 Robertが指摘したように、最初の理由はxUnitがSmalltalkから来ていて、JavaのJUnitによって普及したからです。 どちらもオブジェクト指向言語であるため、選択できませんでした。

これは他の利点がないと言っているのではありません。 オブジェクト指向テストは継承することができます。 つまり、サブクラスをテストしたい場合は、親のすべてのテストを実行して、変更した動作に対して少数のテストメソッドをオーバーライドするだけで済みます。 これにより、テストコードを複製しなくても、サブクラスの優れたカバレッジが得られます。

PHPUnitでassertメソッドを簡単に追加および上書きできます。 `+ PHPUnit_Framework_TestCase `をサブクラス化し、独自の ` assert `メソッドを記述して、テストクラスに新しいサブクラスを継承させます。 デフォルトの ` setup `と ` teardown +`メソッドを書くこともできます。

最後に、テストフレームワークのメソッドがテスト対象のものと衝突しないことを保証します。 テストフレームワークがその機能をテストにダンプしたばかりで、 `+ setup +`メソッドを持つものをテストしたい場合…​ あなたは問題を抱えています。

それは言った、私はあなたの痛みを聞きます。 大きなテストフレームワークは面倒で面倒でもろくなることがあります。 PerlはxUnitスタイルを使わず、短いテスト関数名を持つ手続き型スタイルを使います。 例としてhttp://search.cpan.org/perldoc?Test::More[Test::More]を参照してください。 舞台裏でそれはあなたが提案したことをまさに行います、すべての機能が使うシングルトンテストインスタンスオブジェクトがあります。 Test::Classと呼ばれるOOテストメソッドモジュールとのハイブリッド手続きアサート関数もあります。

_
PHPの構文はメソッドの呼び出しには非常に見苦しいと考える
_

あなたは `+→ +`が好きではないと思います。 私はあなたがそれと共に生きることを学ぶことを勧めます。 オブジェクト指向PHPは、他のものよりもはるかに優れています。

6


正当な理由の1つは、メソッド名としての `+ assertXXX +`が衝突を命名するリスクが高いことです。

もう1つは、それが_xUnit_ファミリーから派生しているということです。それは通常オブジェクト指向言語を扱います – 最初はSmalltalkです。 これにより、例えばからあなたの “兄弟”に自分自身を関連付けることが容易になります。 JavaとRuby

3


直接的な答えではありませんが、PHPUnit 3.5以降では、 `+ $ this→ +`を記述する必要はありません。 PHPUnit 3.5ではアサーション用の関数ライブラリが追加されました。

require_once 'PHPUnit/Framework/Assert/Functions.php';

それからあなたはできる

assertEquals('foo', $bar);

それについてのSebastian Bergmannのブログ投稿を参照してください。

2


テストメソッドをクラスメソッドに含めることで、PHPUnitの手間が省けます。 組み込みのインテリジェンスが欠如しているため、PHPUnitは純粋なテスト関数を見つけることも扱うこともできませんでした。 単純なブールチェーンで – > assert *()メッセージを認識するだけで、処理ロジックを節約できます(PHPUnitではテストケース作成者ではありません)。 PHPUnit / SimpleTestの観点から見たオーバーヘッドを削減するのは、すべて構文上の塩です。

エラー/警告メッセージ、例外の捕捉、またはPHPのネイティブなassert()ステートメントの認識は技術的な問題ではありません。 難しいAPIはもっと企業的に見えるので、それはされていません。

0


タイトルとURLをコピーしました