2

私は...ユニットテストの初心者のようなものです。

ユニットテストのベストプラクティスをいくつか読みました。単体テストは、アプリケーションを破壊するコードに加えられた変更を防ぐことを目的としていることを理解してください。また、すべてのオブジェクトのパブリックAPI(getter、メソッド)でテストケースを作成して、オブジェクトの動作をテストし、期待どおりかどうかを確認します。

だから今..私はテストする必要がある少し簡単なクラスがあります:

public class Foo{
   private readonly string _text;

   public Foo(string initialText)
   {
      this._text = initialText;
   }

   public string Text {get;}

   //Some other methods that will use this Text property to parsing, comparasion etc
   public string RichTextFormat {....}
}

ここでは、これはコメントのように、このTextプロパティは、解析、比較などのために多くの場所を使用しています。

したがって、 Textプロパティがコンストラクター内で渡したものを正確に返すようにすることが非常に重要だと思います。

これが私が書いたテストケースです...

[TestMethod]
public void Text_WhenInitialTextIsNull()
{
    string initalizeText = null;
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

[TestMethod]
public void Text_WhenInitialTextIsEmpty()
{
    string initalizeText = string.Empty;
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

[TestMethod]
public void Text_WhenInitialTextIsOneLetter()
{
    string initalizeText = "A";
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

[TestMethod]
public void Text_WhenInitialTextIsOneSpecialCharacter()
{
    string initalizeText = "!";
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

[TestMethod]
public void Text_WhenInitialTextIsOneSentense()
{
    string initalizeText = "Hello, World!";
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

[TestMethod]
public void Text_WhenInitialTextIsOneParagraph()
{
    string initalizeText = "Who's the Smartphone Winner? " + System.Environment.NewLine +
                           " On the smartphone front, however, iSuppli put Apple at number one," +
                           " while Strategy Analytics pointed to Samsung. " + System.Environment.NewLine +
                           " According to iSuppli, Apple shipped 35 million smartphones in the first quarter" +
                           " to Samsung's 32 million. Strategy Analytics, however, said Samsung's total was" +
                           " 44.5 million to Apple's 35.1 million. Nokia landed at number three on both lists" +
                           " with 12 percent market share. ";
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

これは…重すぎるのかな?

4

4 に答える 4

4

そのため、Text プロパティがコンストラクター内で渡したものを正確に返すようにすることが非常に重要だと思います。

ゲッターです。_textコンストラクターで設定されているフィールドを取得します。

クラスが初期化された後に getter から返された値をチェックする以上のことを行うのはやり過ぎです。

基本的な C# 機能が期待どおりに機能することをテストしても意味がありません...

于 2012-04-27T14:59:39.027 に答える
2

渡された値を操作していないため、値が正しく設定されていることを確認するために 1 つのテストを実行することをお勧めします。それを考えると、次のテストで十分です。

[TestMethod]
public void TextReturnsTextPassedToConstructor()
{
    string text = "A string";
    Foo foo = new Foo(text);

    Assert.AreEqual(text, foo.Text);
}

コンストラクターで追加のロジックまたは文字列操作が行われている場合にのみ、他のテストを追加する価値があります。たとえば、文字列が null または空の場合に例外をスローした場合、または文字の置換などを行っていた場合。

于 2012-04-27T15:01:37.170 に答える
0

あなたの財産の単純な性質を考えると、これは少しやり過ぎだと思います。文字列の簡単なテストでは、null、空、何かの3つのテストを維持するのが好きです。

[TestMethod]
public void Test_Text_Null()
{
    Assert.AreEqual(null, new Foo(null).Text);
}

[TestMethod]
public void Test_Text_Empty()
{
    Assert.AreEqual("", new Foo("").Text);
}

[TestMethod]
public void Test_Text_Something()
{
    Assert.AreEqual("abc", new Foo("abc").Text);
}

一般的に、私はそのような単純なものについて、考えられるすべての入力のバリエーションを単体テストしようとはしません。誰かがFooを変更したために将来バグが発生した場合は、コンマが含まれていると壊れます。それをユニットテストスイートに追加してください。途中で単体テストを行うのは良いことですが、プロジェクトの完了に進む能力を麻痺させないでください。

于 2012-04-27T15:08:30.123 に答える
0

テストのコンテキストを変更する必要があると思います。つまり、テストをTextプロパティに集中させず、代わりに次のようにします。

[TestMethod]
public void given_null_string_expect_null()
{
    string initalizeText = null;
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

[TestMethod]
public void given_special_character_string_expect_that_character()
{
    string initalizeText = "!";
    Foo realFoo = new Foo(initalizeText);
    Assert.AreEqual(initalizeText, realFoo.Text);
}

等々。

重要なのは、プロパティの名前を別の名前に変更するとどうなるかTextということです。これに対応するために名前を変更する必要がある多くの単体テストがあります。私の提案は、何が起こっているかという文脈に基づいてテストに名前を付けることです (たとえば、1 文字の文字列が与えられた場合、その文字を期待します)。このように、コード内の名前を変更しても、テストは影響を受けません。

私のもう1つのポイントは、このレベルでテストする必要がないということです。プロパティは、実際に時間をかけてテストする価値はありません。代わりに、単なるプロパティではなく、メソッドをテストしたり、他のクラスと統合したりすることをお勧めします。

于 2012-04-27T15:02:23.703 に答える