0

単体テストは統一されるべきであるという事実を誰もが共有していることを私は知っています。しかし、この本を読むと、テスト スイートを作成する余地があることがわかります。

Chapter 7. テストの編成 PHPUnit (Chapter 2 を参照) の目標の 1 つは、テストを構成可能にすることです。たとえば、プロジェクト全体のすべてのテストや、プロジェクトの一部であるコンポーネントのすべてのクラスのテスト、または単一のクラスのテストのみ。

例 7.2: XML 構成を使用したテスト スイートの作成

<phpunit>
  <testsuites>
    <testsuite name="Object_Freezer">
      <file>Tests/Freezer/HashGenerator/NonRecursiveSHA1Test.php</file>
      <file>Tests/Freezer/IdGenerator/UUIDTest.php</file>
      <file>Tests/Freezer/UtilTest.php</file>
      <file>Tests/FreezerTest.php</file>
      <file>Tests/Freezer/StorageTest.php</file>
      <file>Tests/Freezer/Storage/CouchDB/WithLazyLoadTest.php</file>
      <file>Tests/Freezer/Storage/CouchDB/WithoutLazyLoadTest.php</file>
    </testsuite>
  </testsuites>
</phpunit>

テスト依存関係の機能を追加する場合:

依存関係のテスト

単体テストは主に、開発者がバグを特定して修正し、コードをリファクタリングし、テスト対象のソフトウェア ユニットのドキュメントとして機能するのに役立つ優れたプラクティスとして作成されています。これらの利点を実現するために、単体テストは理想的には、プログラム内で可能なすべてのパスをカバーする必要があります。通常、1 つの単体テストは、1 つの関数またはメソッド内の 1 つの特定のパスをカバーします。ただし、テスト メソッドはカプセル化された独立したエンティティである必要はありません。多くの場合、テストの実装シナリオに隠されている、テスト メソッド間に暗黙の依存関係があります。

@depends ClassName::Function を使用して、クラス内またはクラス間で依存関係を使用し、ClassName::Function によって提供されるデータを使用できます。

たとえば、クラス A がクラス B および C でも使用されるデータを提供する場合、次のようになります。

A {
    function a()
    {
        return $data;
    }
}
B {
    /**
    * @depends A::a
    */
    function b($data)
    {
        return $data2;
    }
}
C {
    /**
    * @depends B::b
    */
    function c($data2)
    {
    }
}

なぜそんなに悪いのですか?A::a のコードをクラス B::b に複製し、クラス A::a および B::b からクラス C::c にコードを複製する方が良いですか?

私はあなたの感覚でベストプラクティスを学びたい..以前は常にテストスイートを使用しており、単体テストは独立した機能をテストするのに最適ですが、依存関係に依存するサービス全体をテストする必要がある場合は、もう少し複雑です..誰のテストのためにPHPUnitを完全に破棄しますか?代わりに何をアドバイスしますか?

4

1 に答える 1

0

markus-tharkun との議論の記録を書きます。

PHPUnit は単体テストを目的としています。つまり、次のことを意味します。

単体テストの要点は、「単体」という言葉にあります。これは、サービス全体ではなく、独立した単体をテストすることを意味します。すべての小さな単位が機能する場合、コードは機能します。単体テストは、アーキテクチャ全体が理にかなっているかどうかをテストするためのものではありません。

彼に聞いたところ、依存関係のある関数をテストする場合は、その関数に Mock オブジェクトを注入できます。セキュリティレイヤー、ユーザーオブジェクト、データベースアクセスなど、その機能のすべての外部依存関係をモックする必要があります。依存関係を本当にモックできない場合は、@depends を使用しますが、これは避けるべきです。

Markus は、Mockery フレームワークを使用するようにアドバイスしてくれました: https://github.com/padraic/mockery

于 2012-12-09T19:33:33.717 に答える