3

システムテストの多くはBDDスタイルで記述されており、重複を最小限に抑えるために継承された動作を適切に利用しています。たとえば、これは購入テストの基本的な階層である可能性があります。

class BehavesLikeSuccessfulPurchase
class BehavesLikePurchaseWithValidCreditCard : BehavesLikeSuccessfulPurchase

この場合、BehavesLikeSuccessfulPurchaseアカウントステートメントにデビットエントリが必要であるなどの一般的な動作をBehavesLikePurchaseWithValidCreditCard定義し、クラスは有効なクレジットカードを使用して任意のタイプの製品を購入するためのテストワークフローを定義するため、テストは具体的な製品インスタンスを提供するだけの小さな派生クラスです。 、例えば

[Concern(typeof(Video))]
class WhenPurchasedWithValidCreditCard : BehavesLikePurchaseWithValidCreditCard

ただし、具体的な製品タイプによっては、追加のチェックも必要です。たとえば、ビデオが正常に購入されるたびに、ユーザーのビデオライブラリに追加されていることを確認します。理想的には、これは別のクラスによって定義され、架空の構文を使用して混合される可能性があります。

class BehavesLikeSuccessfulVideoPurchase

[Concern(typeof(Video))]
class WhenPurchasedWithValidCreditCard : BehavesLikePurchaseWithValidCreditCard
    mixin BehavesLikeSuccessfulVideoPurchase
{
}

ただし、もちろんC#は多重継承やミックスインをサポートしていないため、追加の動作に呼び出しを転送するボイラープレートメソッドを大量に作成することになります。この動作は、動作が変わるたびに変更する必要があります。

私たちが本当に必要としているのは、観察すべき追加の動作のタイプを提供するだけで、テストからの複数の動作をサポートする独自のメカニズムを備えたフレームワークです。私はxUnitと仕様の例を見てきましたが、そのトリックを実行できるいくつかの拡張機能を考え出すことは可能であるように見えますが、すでに存在するものはありますか?

4

2 に答える 2

3

Machine.Specificationsプロジェクトにはこのアイデアがあり、Behaviors属性を使用してクラスを指定してから、別のクラスで次のように指定できます。

Behaves_like<SomePredefinedBehaviour> some_predefined_behaviour;

仕様で複数回使用できるため、必要な数のクラスから動作を継承できます。このスタイルは、従来の単体テストのバックグラウンドから来る場合には慣れるのに時間がかかりますが、動作をサポートします。プロジェクトをダウンロードして例を見ると、動作のあるプロジェクトが表示されます。

于 2009-11-04T12:17:31.503 に答える
0

Linfuを使用すると、Mixinsを実行できます:http://www.codeproject.com/KB/cs/LinFuPart2.aspx

しかし、私にはよくわかりませんが、BDDフレームワークがLinFu動的オブジェクトでうまく機能するかどうかです。

私自身はLinFuのMixinsを使用する機会がなかったので、適度に複雑なシナリオで使用した場合の簡単/複雑さや、大きな欠点があるかどうかを知りたいと思います。

于 2009-11-03T16:51:39.733 に答える