647

単体テストクラスとテストメソッドに名前を付けるためのベストプラクティスは何ですか?

これは以前にSOで議論されましたが、ユニットテストの一般的な命名規則は何ですか?

これが非常に優れたアプローチであるかどうかはわかりませんが、現在のテストプロジェクトでは、各本番クラスとテストクラスの間に1対1のマッピングがProductありProductTestます。

次に、テストクラスに、テストしているメソッドの名前、アンダースコア、状況、および予想される結果を含むメソッドがありますSave_ShouldThrowExceptionWithNullName()

4

11 に答える 11

607

更新 (2021 年 7 月)

私の最初の回答 (ほぼ 12 年) からかなりの時間が経過しており、この間にベスト プラクティスが大きく変化しています。そのため、私は自分の回答を更新し、読者にさまざまな命名戦略を提供したいと思っています.

多くのコメントと回答は、私が最初の回答で提案した命名戦略はリファクタリングに耐性がなく、名前を理解するのが難しいことを指摘しており、私は完全に同意します.

ここ数年、 Vladimir Khorikovによって記述された行で、テスト名がテストしたいものを説明する、より人間が読める命名スキーマを使用することになりました。

いくつかの例は次のとおりです。

  • Add_credit_updates_customer_balance
  • Purchase_without_funds_is_not_possible
  • Add_affiliate_discount

しかし、ご覧のとおり、非常に柔軟なスキーマですが、最も重要なことは、時間の経過とともに変化する可能性のある技術的な詳細を含めずに、名前を読んでテストの内容を理解できることです。

プロジェクトとテスト クラスに名前を付けるには、元の回答スキーマを引き続き使用します。

元の回答 (2009 年 10 月)

Roy Osherove の命名戦略が好きです。それは次のとおりです。

[UnitOfWork_StateUnderTest_ExpectedBehavior]

メソッド名に必要なすべての情報が構造化された方法で含まれています。

作業単位は、単一のメソッドやクラスのように小さくすることも、複数のクラスのように大きくすることもできます。これは、このテスト ケースでテストされ、管理されているすべてのものを表す必要があります。

アセンブリの場合、私は典型的な.Tests末尾を使用します。これは非常に広く普及していると思いますが、クラスでも同じです (末尾はTests):

[NameOfTheClassUnderTestTests]

以前は、Tests ではなく Fixture をサフィックスとして使用していましたが、後者の方が一般的だと思い、命名戦略を変更しました。

于 2009-10-20T11:47:58.217 に答える
89

私はこの命名スタイルが好きです:

OrdersShouldBeCreated();
OrdersWithNoProductsShouldFail();

等々。問題が何であるかを非テスターに​​本当に明確にします。

于 2008-09-30T22:56:33.367 に答える
56

ケント・ベックは次のように提案しています。

  • 「ユニット」 (プログラムのクラス) ごとに 1 つのテスト フィクスチャ。テストフィクスチャはクラスそのものです。テスト フィクスチャ名は次のようになります。

    [name of your 'unit']Tests
    
  • テスト ケース (テスト フィクスチャ メソッド) には、次のような名前があります。

    test[feature being tested]
    

たとえば、次のクラスがあります。

class Person {
    int calculateAge() { ... }

    // other methods and properties
}

テスト フィクスチャは次のようになります。

class PersonTests {

    testAgeCalculationWithNoBirthDate() { ... }

    // or

    testCalculateAge() { ... }
}
于 2008-09-30T22:54:31.250 に答える
19

クラス名。テスト フィクスチャの名前については、「テスト」は多くのドメインのユビキタス言語で非常に一般的であることがわかりました。たとえば、エンジニアリング ドメインStressTestでは 、化粧品ドメインでは ですSkinTest。Kent に同意できなくて申し訳ありませんが、私のテスト フィクスチャ ( StressTestTest?) で "Test" を使用するのは混乱を招きます。

「ユニット」もドメインでよく使われます。例MeasurementUnitMeasurementUnitTest「Measurement」または「MeasurementUnit」のテストと呼ばれるクラスですか?

したがって、すべてのテスト クラスに「Qa」プレフィックスを使用するのが好きです。例QaSkinTestQaMeasurementUnit. ドメイン オブジェクトと混同されることはありません。接尾辞ではなく接頭辞を使用することは、すべてのテスト フィクスチャが視覚的に一緒に存在することを意味します (テスト プロジェクトに偽物やその他のサポート クラスがある場合に役立ちます)。

名前空間。私は C# で作業しており、テスト クラスをテスト対象のクラスと同じ名前空間に保持しています。個別のテスト名前空間を持つよりも便利です。もちろん、テスト クラスは別のプロジェクトにあります。

メソッド名をテストします。メソッドに WhenXXX_ExpectYYY という名前を付けるのが好きです。前提条件を明確にし、自動化されたドキュメント (TestDox 風) に役立ちます。これは、Google テスト ブログのアドバイスに似ていますが、前提条件と期待がより分離されています。例えば:

WhenDivisorIsNonZero_ExpectDivisionResult
WhenDivisorIsZero_ExpectError
WhenInventoryIsBelowOrderQty_ExpectBackOrder
WhenInventoryIsAboveOrderQty_ExpectReducedInventory
于 2009-10-10T23:09:39.107 に答える
14

Given-When-Then の概念を使用します。この短い記事http://cakebaker.42dh.com/2009/05/28/given-when-then/をご覧ください。この記事では、この概念を BDD の観点から説明していますが、TDD でも変更なしで使用できます。

于 2010-08-31T14:08:41.610 に答える
10

私は最近、説明を最大限にするために、テスト、そのクラス、および含まれるプロジェクトに名前を付けるための次の規則を思いつきました。

名前空間Settingsのプロジェクトでクラスをテストしているとしましょう。MyApp.Serialization

まず、MyApp.Serialization.Tests名前空間を使用してテスト プロジェクトを作成します。

このプロジェクトと名前空間内に、IfSettings( IfSettings.csとして保存された) という名前のクラスを作成します。

SaveStrings()メソッドをテストしているとしましょう。-> テストに名前を付けますCanSaveStrings()

このテストを実行すると、次の見出しが表示されます。

MyApp.Serialization.Tests.IfSettings.CanSaveStrings

これは、何をテストしているのかを非常によく表していると思います。

もちろん、英語では名詞「Tests」が動詞「tests」と同じであることは便利です。

テストに名前を付ける際の創造性に制限はありません。そのため、完全な文の見出しが得られます。

通常、テスト名は動詞で始まる必要があります。

例は次のとおりです。

  • 検出 (例DetectsInvalidUserInput)
  • スロー(例ThrowsOnNotFound
  • 意志 (例WillCloseTheDatabaseAfterTheTransaction)

別のオプションは、「if」の代わりに「that」を使用することです。

ただし、後者はキーストロークを節約し、テスト済みの動作が存在するかどうかはわかりませんが、存在するかどうかをテストしているため、何をしているのかをより正確に説明しています。

[編集]

上記の命名規則をもう少し長く使用した後、インターフェイスを操作するときにIf接頭辞が混乱を招く可能性があることがわかりました。たまたま、テスト クラスIfSerializer.csが、[開くファイル] タブのインターフェイスISerializer.csと非常によく似ています。これは、テスト、テスト対象のクラス、およびそのインターフェイスの間を行ったり来たりするときに非常に煩わしくなります。その結果、接頭辞としてIfではなくThatを選択するようになりました。

さらに、他の場所ではベスト プラクティスとは見なされないため、テスト クラスのメソッドに対してのみ使用します。次のように、テスト メソッド名の単語を区切るために「_」を使用します。

[Test] public void detects_invalid_User_Input()

こちらの方が読みやすいと思います。

編集終了

テストに名前を付けることが非常に重要であると考えているため、これによりいくつかのアイデアが生まれることを願っています。これにより、テストが何をしているのかを理解するために費やされていた時間を大幅に節約できるためです (たとえば、長期間の中断後にプロジェクトを再開した後)。 .

于 2009-06-18T18:59:42.637 に答える
9

参照: http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsively.html

テストメソッドの名前については、個人的には冗長で自己文書化された名前を使用することが非常に便利だと思います (テストが何を行っているかをさらに説明する Javadoc コメントと共に)。

于 2008-09-30T22:53:00.740 に答える
7

最も重要なことの1つは、命名規則に一貫性があることだと思います(そして、チームの他のメンバーと同意します)。多くの場合、同じプロジェクトでさまざまな規則が使用されているのを目にします。

于 2013-02-27T15:31:01.690 に答える
2

テストを同じパッケージに保持するが、テスト対象のソースとは並列のディレクトリに保持することで、一連の除外パターンを実行することなく、デプロイの準備ができたらコードの肥大化を排除できることを付け加えておきます。

個人的には、 「JUnit Pocket Guide」で説明されているベスト プラクティスが気に入っています。JUnitの共著者が書いた本に勝るものはありません。

于 2008-09-30T23:12:02.517 に答える
2

VS + NUnit では、通常、プロジェクト内にフォルダーを作成して、機能テストをグループ化します。次に、単体テスト フィクスチャ クラスを作成し、テストする機能の種類に基づいて名前を付けます。[Test] メソッドは、次の行に沿って名前が付けられていますCan_add_user_to_domain

- MyUnitTestProject   
  + FTPServerTests <- Folder
   + UserManagerTests <- Test Fixture Class
     - Can_add_user_to_domain  <- Test methods
     - Can_delete_user_from_domain
     - Can_reset_password
于 2008-09-30T22:56:54.457 に答える