1

Statsいくつかのメソッドを含むクラスがあります。好き:

public int getAmountOfTimesAPlayerLogedIn(string playerName)

public int getHighestScoreInLeague ( string leagueName )

public int getTopPlayers ( string leagueName, int topResults )

このクラスの単体テストを作成する.cs場合、このクラスのメソッドごとに個別のファイルを作成する必要がありますか?

ユニットテストメソッドに名前を付けるのに苦労しているからです。私はWhenXXX_ThenYYY命名規則が好きです。しかし、.csのすべてのメソッドテストをカバーする1つのファイルがある場合Stats、それがテストしているメソッドを実際にどのように知ることができますか?

つまり、テストしたい場合を考えてみてgetTopPlayersください。次に、次のようなテストメソッドを作成します。

WhenLeageNameIsTest_Expect20

しかし、その名前を見て、どのメソッドがテストされているかをどのように判断できますか?getHighestScoreInLeagueまたはのいずれかである可能性がありgetTopPlayersます。

では、メソッドの各テストを別々の.csファイルに分ける必要がありますか?または、命名規則などを変更する必要がありますか?

編集

これはちょうど私に起こりました。Asserts1つの試験方法で複数回行っても大丈夫ですか?

4

2 に答える 2

4

しかし、その名前を見て、どのメソッドがテストされているかをどのように判断できますか?...命名規則を変更する必要がありますか?

一般的な規則の1つは、テストメソッドに次の形式で名前を付けることです。

 MethodUnderTest_Scenario_Expectation()

あなたにとって、そのフォームを使用する場合、それは

 public void getHighestScoreInLeague_LeagueNameIsTest_Returns20()

これは、 The Art ofUnitTestingのRoyOsheroveが推奨するフォームでもあります。何がテストされ、何が期待されているかを一目で知ることができます。あなたはほとんどあなたの名前でそこにいます、その欠けている明快さのためにメソッド名を追加してください。

通常、テスト対象のクラスごとに1つのテストファイルを用意することをお勧めします。テストしているメソッドがたくさんあり、これらのメソッドの動作をカバーするためのテストがたくさんある場合は、おそらくそれは設計を評価する機会です。あなたのクラスはやりすぎですか?それは答えがすぐに「はい」であるということではありません、それは少しの間考慮される必要があるかもしれないただの考えです。単一責任に焦点を合わせてクラスを小さく保つと、テスト(およびテストファイル)も当然小さくなります。


これはちょうど私に起こりました。1つのテスト方法で複数のアサートを実行しても大丈夫ですか?

理想的には、いいえ。1つの理由だけでテストを失敗させたい。複数のアサーションがある場合、失敗の理由は複数あります。また、失敗するのが初期のアサーションである場合、後続のアサーションは実行されません。可能な場合は、アサートを分離します。

ユニットテストは、山の頂上から特定のシナリオと期待(名前を介して)および何がうまくいかなかったのか(単一のアサートを介して)悲鳴を上げる必要があります。ユニットテストが失敗した場所を見つけるためにデバッガーを起動する必要は必ずしもありませんが、常に回避できるとは限りません。

于 2013-03-15T13:47:03.620 に答える
1

ここに説明されている素晴らしい構造があります:http://haacked.com/archive/2012/01/01/structuring-unit-tests.aspx

基本的に、SUTのすべてのメソッドには、フィクスチャに独自のネストされたクラスがあり、そのメソッドのすべてのテストはtestmethodです。組み合わせると、ほとんど文として読まれTheTitleizerMethod.ReturnsDefaultTitleForNullName()ます。リンクからのコードサンプル:

public class TitleizerFacts
{
    public class TheTitleizerMethod
    {
        [Fact]
        public void ReturnsDefaultTitleForNullName()
        {
            // Test code
        }

        [Fact]
        public void AppendsTitleToName()
        {
            // Test code
        }
    }

    public class TheKnightifyMethod
    {
        [Fact]
        public void ReturnsDefaultTitleForNullName()
        {
            // Test code
        }

        [Fact]
        public void AppendsSirToMaleNames()
        {
            // Test code
        }

        [Fact]
        public void AppendsDameToFemaleNames()
        {
            // Test code
        }
    }
}
于 2013-03-15T15:50:13.043 に答える