2008-09-30 67 views
390

哪些命名的單元測試類和測試方法的最佳實踐?單元測試命名的最佳實踐

這是在此之前討論的那樣,在What are some popular naming conventions for Unit Tests?

我不知道這是一個很好的方法,但目前在我的測試項目中,我有每個生產類之間的一對一映射一個和一個測試類,例如ProductProductTest

在我的測試類,然後我有我正在測試方法,下劃線的名稱,然後的情況,我希望發生的,例如什麼方法Save_ShouldThrowExceptionWithNullName()

+0

請參閱:http://stackoverflow.com/questions/96297/naming-conventions-for-unit-tests – 2008-09-30 22:48:25

回答

367

我喜歡Roy Osherove's naming strategy,它是下面的:

[UnitOfWork__StateUnderTest__ExpectedBehavior]

它需要對方法名和以結構化方式每信息。

工作單元可以像單個方法一樣小,也可以像多個類一樣大。它應該代表在這個測試案例中要測試的所有東西,並且處於控制之下。

對於裝配我使用典型.Tests結局,我認爲這是相當廣泛和相同的類(具有Tests結尾):

[NameOfTheClassUnderTestTests]

以前我用夾具作爲後綴來代替的測試,但我認爲後者更常見,然後我改變了命名策略。

+157

對我來說,把方法名稱放在測試方法中是沒有意義的。如果你重命名方法呢?沒有重構工具會爲你重新命名測試。最終你最終會重新命名測試方法,或者更可能是錯誤地命名了測試。這就像評論。更糟糕的是,根本沒有評論代碼。 – 2011-05-29 05:41:52

41

Kent Beck表明:每 '單位'(類你的程序的)

  • 一個測試夾具。測試裝置本身就是類。測試夾具名稱應該是:

    [name of your 'unit']Tests 
    
  • 測試用例(測試夾具方法)名稱類似:

    test[feature being tested] 
    

例如,具有下面的類:

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

    // other methods and properties 
} 

測試夾具將是:

class PersonTests { 

    testAgeCalculationWithNoBirthDate() { ... } 

    // or 

    testCalculateAge() { ... } 
} 
+4

我希望更多的人會遵循這些準則。不久之前,我不得不重命名超過20個測試方法,因爲它們的名稱如「ATest」,「BasicTest」或「ErrorTest」。 – Wedge 2008-09-30 23:44:05

+69

沒有'test'的方法前綴在類的後綴中變得多餘? – 2009-01-05 21:12:25

+0

我想添加TestDox的兼容性。 http://agiledox.sourceforge.net/ – guerda 2009-04-07 06:07:29

64

我喜歡這種命名風格:

OrdersShouldBeCreated(); 
OrdersWithNoProductsShouldFail(); 

等。 這對非測試者來說真的很清楚問題是什麼。

2

在VS + NUnit的,我通常在我的項目組功能測試,創建文件夾在一起。然後我創建單元測試夾具類並在我測試的功能類型之後命名它們。 [測試]方法是沿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 
1

我要補充的是,保持你的測試在同一個包,但在一個平行的目錄被測試的源消除了代碼的膨脹,一旦你準備部署它,而無需執行一堆排除模式。

我個人喜歡"JUnit Pocket Guide"中描述的最佳實踐...很難打敗由JUnit合着者編寫的書!

0

Foo類的測試用例的名稱應該是FooTestCase或類似的東西(FooIntegrationTestCase或FooAcceptanceTestCase) - 因爲它是一個測試用例。有關標準命名約定,如測試,測試用例,測試夾具,測試方法等,請參閱http://xunitpatterns.com/

6

我最近想出了以下約定命名我的測試中,他們班和含有以項目最大限度地發揮其descriptivenes:

比方說,我測試了設置類的項目在MyApp的。系列化命名空間。

首先我將用MyApp.Serialization.Tests命名空間創建一個測試項目。

在這個項目中,當然還有命名空間,我將創建一個名爲的類,如果設置爲(保存爲IfSettings.cs)。

假設我正在測試SaveStrings()方法。 - >我會命名測試CanSaveStrings()

當我運行這個測試,它會顯示以下標題:

MyApp.Serialization.Tests.IfSettings.CanSaveStrings

我認爲這告訴我很好,它是什麼測試。

當然,英語中的名詞「測試」與動詞「測試」相同是有用的。

您在命名測試時的創意沒有限制,因此我們可以爲他們獲取完整的句子標題。

通常,測試名稱必須以動詞開頭。

實例包括:

  • 檢測(例如DetectsInvalidUserInput)
  • 拋出(例如ThrowsOnNotFound)
  • 威爾(例如WillCloseTheDatabaseAfterTheTransaction)

另一種選擇是使用「that」而不是「if」。

後者節省了我,雖然按鍵和描述更準確地我在做什麼,因爲我不知道,測試的行爲是存在的,但正在測試如果它。

[編輯]

使用上述命名約定現在更長一點後,我發現,那如果前綴可能會造成混淆,具有界面時。恰好如此,測試類IfSerializer.cs看起來與「打開文件選項卡」中的界面ISerializer.cs非常相似。 在測試,正在測試的類和它的接口之間來回切換時,這會變得非常煩人。因此,我現在會選擇超過如果作爲前綴。

另外我現在用的 - 只有在我的測試類的方法,因爲它不被認爲是最好的做法在其他地方 - 在「_」爲在我的測試方法的名字分開的話:

  • [測試] public void detected_invalid_User_Input()*

我覺得這樣比較容易閱讀。

[結束編輯]

我希望這滋生了一些更多的想法,因爲我認爲非常重要的命名測試,因爲它可以爲您節省大量的時間,否則將已花費試圖瞭解是什麼測試正在進行(例如,在延長斷層之後恢復項目之後)。

15

類別名稱。對於測試夾具的名稱,我發現「測試」在很多領域中普遍存在的語言中很常見。例如,在工程領域:StressTest,以及化妝品領域:SkinTest。抱歉不同意肯特,但在我的測試裝置中使用「測試」(StressTestTest?)令人困惑。

「單位」也在域中使用很多。例如。 MeasurementUnit。是否有稱爲MeasurementUnitTest的測試「Measurement」或「MeasurementUnit」?

因此,我喜歡對我所有的測試類使用「Qa」前綴。例如。 QaSkinTestQaMeasurementUnit。這是從來沒有與域對象混淆,並使用前綴,而不是一個後綴意味着所有的測試夾具住在一起視覺(有用的,如果你在你的測試項目假貨或其他支持類)

命名空間。我使用C#工作,並將測試類保存在與測試類相同的名稱空間中。這比擁有單獨的測試命名空間更方便。當然,測試課程在不同的項目中。

測試方法名稱。我喜歡爲我的方法命名爲WhenXXX_ExpectYYY。它使前提變得清晰,並且有助於自動化文檔(一個TestDox)。這與Google測試博客上的建議類似,但前提條件和期望更加分離。例如:

WhenDivisorIsNonZero_ExpectDivisionResult 
WhenDivisorIsZero_ExpectError 
WhenInventoryIsBelowOrderQty_ExpectBackOrder 
WhenInventoryIsAboveOrderQty_ExpectReducedInventory 
+0

您談到了測試方法名稱和測試夾具名稱。測試夾具名稱映射到生產類別。你在哪裏寫測試中的生產方法名稱? – 2011-05-28 17:23:21

5

我使用Given-When-Then的概念。 看看這篇短文http://cakebaker.42dh.com/2009/05/28/given-when-then/。文章以BDD的形式描述了這個概念,但您也可以在TDD中使用它,而無需任何更改。

+0

考慮 - 當 - 然後是一樣的MethodName_Scenario_ExpectedBehavior,不是嗎?! – 2011-05-28 17:26:05

64

我喜歡跟着「應該」命名標準測試而被測單元(即,類)後命名測試夾具

爲了說明(使用C#和NUnit):

[TestFixture] 
public class BankAccountTests 
{ 
    [Test] 
    public void Should_Increase_Balance_When_Deposit_Is_Made() 
    { 
    var bankAccount = new BankAccount(); 
    bankAccount.Deposit(100); 
    Assert.That(bankAccount.Balance, Is.EqualTo(100)); 
    } 
} 

爲什麼「應該」

我覺得這迫使測試作家命名的測試與沿線的一句「如果[在某些狀態] [之後/之前/] [動作發生]」

是,在任何地方寫「應該」都會有點重複,但正如我所說的那樣,它會迫使作家以正確的方式思考(對新手來說也是如此)。另外它通常會產生一個可讀的英文測試名稱。

更新

我注意到,吉米·博加德也是「應該」的風扇,甚至有一個名爲Should單元測試庫。

更新(4年後...)

對於那些有興趣,我的方法來命名的測試已經發展了很多年。其中一個問題與應該模式我上面描述爲不容易知道一目瞭然哪種方法正在測試。對於OOP,我認爲用被測方法啓動測試名稱更有意義。對於設計良好的類,這應該會導致可讀的測試方法名稱。我現在使用類似於<method>_Should<expected>_When<condition>的格式。很顯然,根據上下文,你可能想用Should/When動詞替代更適合的東西。例如: Deposit_ShouldIncreaseBalance_WhenGivenPositiveValue()

4

我認爲最重要的事情之一是在你的命名約定中保持一致(並與你的團隊的其他成員一致)。很多時候,我看到在同一個項目中使用了大量不同的約定。