3

プロパティを持つクラス (多数) があります。ロジックがあるものとないものがあります。これらのプロパティをテストしたい場合、どうすればよいでしょうか?

最近、ユニットテストを作成するBDDスタイルに興味があります。

ここここを参照してください。

したがって、コンテキストのセットアップを行います。基本的には、SUT を作成し、必要なものをロードします。次に、各 Observation (テスト メソッド) で、特定のプロパティに含まれるべきものが含まれていることを確認します。

これが私の質問です。SUT に 20 個のプロパティがある場合、20 個の観測/テストを作成する必要がありますか? プロパティの 1 つにもっと興味深いロジックが含まれていれば、それ以上になる可能性があります。

[Observation]
public void should_load_FirstName()
{
    Assert.Equals<string>("John", SUT.FirstName);
}

[Observation]
public void should_load_LastName()
{
    Assert.Equals<string>("Doe", SUT.LastName);
}

[Observation]
public void should_load_FullName()
{
    Assert.Equals<string>("John Doe", SUT.FullName);
}

しかし、単純なものを 1 回の観察に集約した方がよいでしょうか?

[Observation]
public void should_load_properties()
{
    Assert.Equals<string>("John", SUT.FirstName);
    Assert.Equals<string>("Doe", SUT.LastName);
    Assert.Equals<string>("John Doe", SUT.FullName);
}

または、カスタム属性 (メソッドに複数回適用できる) を使用した場合はどうなるでしょうか。私ができるように、次のようなものです:

[Observation(PropertyName="FirstName", PropertyValue="John")]
[Observation(PropertyName="LastName", PropertyValue="Doe")]
[Observation(PropertyName="FullName", PropertyValue="John Doe")]
public void should_load_properties()
{
}
4

2 に答える 2

4

一般に、テストごとに論理アサーションが 1つだけになるように努力する必要があります。優れた本xUnit Test Patternsには、それについての優れた議論が含まれていますが、重要な点は、テストが失敗する可能性がある理由が 1 つしかない場合に、違反が発生した場所を理解しやすくなるということです。ただし、これはおそらくBDDよりも回帰テストに少し関連性があります...

これはすべて、すべてのプロパティを検証する単一のテストを作成するオプションがおそらく最も魅力的でないことを意味しますが、すべてのプロパティを検証することは単一の論理的アサーションであると主張することはできます...

xDD (TDD、BDD など) のより中心的な原則は、テストがExecutable Specificationsとして機能する必要があるということです。つまり、テストを見れば、がテストされているかだけでなく、期待値がそのままである理由もすぐにわかるはずです。あなたの例では、SUT.FirstNameが「Jane」ではなく「John」であると予想される理由があまり明確ではありません。

可能であれば、ハードコードされた値の代わりに派生値を使用するようにこれらのテストを作成します。

書き込み可能なプロパティについては、getter が setter に割り当てられた値を返すことを確認するだけのテストを書くことがよくあります。

読み取り専用プロパティの前に、値がコンストラクターの引数と一致することを確認するテストをよく作成します。

このようなテストは、一般的なテスト方法をカプセル化した再利用可能なテスト コードにカプセル化できます。私は現在、まさにそれを行うことができるライブラリに取り組んでいます。

于 2009-10-09T08:25:12.577 に答える
0

他の SubSpec 構文 ([Specification]例) を見てください。この場合、Assert末尾の s のそれぞれは、テストの個別の実行を表します。私はもともとこの構文をラムダの乱用として軽視していましたが、今では気に入ってしばらく使用しています。

于 2010-04-13T08:15:44.890 に答える