2009-04-17 128 views
5

如果您正在測試一個像下面那樣的計數函數,那麼在一個函數中爲函數測試多個事情,是否認爲是「正確」或「錯誤」,而不是每個測試都具有測試函數?在單個測試中斷言多個條件,還是分成多個測試?

function testGetKeywordCount() { 
    $tester = $this -> getDatabaseTester($this -> CompleteDataFile); 
    $tester -> onSetUp(); 

    $KeywordID = 0; 
    $this -> setExpectedException('InvalidArgumentException'); 
    $this -> keyword -> getKeywordCount($KeywordID,'Active'); 

    $KeywordID = 1; 
    $this -> setExpectedException('InvalidArgumentException'); 
    $this -> keyword -> getKeywordCount($KeywordID,'InvalidStatus'); 

    $this -> assertEquals(1, $this -> keyword -> getKeywordCount($KeywordID,'Active')); 

    $tester -> onTearDown(); 
} 

回答

4

您應該有多個測試功能,其中每個測試功能測試其自身的條件。這樣不用調試就能更容易發現故障。

4

每個場景都有一個測試用例是理想的。但是,在某些情況下,在一個測試用例中測試多個場景會更方便(從實施工作的角度來看效率更高)。如果您使用的框架在首次失敗時不會停止,但會盡可能在測試用例中執行,那麼該框架適用於每個測試用例的多個場景。

我更喜歡在單元測試上花費盡可能少的時間,並且在那段時間仍儘可能多地覆蓋覆蓋範圍。最後,重要的是你如何實現單元測試,而不是那些測試的正確性。

+0

如果我理解正確,那麼您會說它更容易,但在一個測試用例中擁有更多場景的「正確」程度卻更低。 如果這意味着您將多個場景放入一個測試用例中,因爲製作多個測試用例的工作太多了,我會說:抽象它,讓它更容易,更乾燥來製作另一個場景。 測試也是編程imho和應該做或多或少相同的原則,如DRY。 – 2010-01-31 21:17:15

1

測試框架並不總是值得你努力遵循每個測試規則的一個斷言。

爲Ruby做的一件事是RSpec,它允許您設置nested example groups。例如:

  • A用戶
    • 沒有密碼
      • 無效
      • 拋出異常
    • 用密碼
      • 已使用前
        • 無效
        • 拋出異常,尚未使用之前
          • 有效
          • 重定向到帳戶頁面
        • 旅行安全警告

通過逐步建立場景和測試一路走來的每一步,它更容易堅持,每個測試方法的一個斷言。這也使得更容易發現未經測試的情況。

0

我不會在上面的示例代碼中談論單元測試。
你的例子更多的是一個自動功能測試,測試一個功能流。

BUT 在這種情況下,它是精細有多個斷言。

只要確保2個斷言不是一前一後。

爲例如

public void ValidateRulesEntry_Valid_ValidConditionsFromFile() 
{ 
    string condition = "Target.HasValue"; 
    string returnMessage; 

    bool successFul = CodeParserTryParseCondition(condition, out returnMessage); 


    Assert.IsTrue(successFul); 
    Assert.IsFalse(string.IsNullOrEmpty(returnMessage)); 
    Assert.IsTrue(returnMessage == "OK"); 

} 

的2個最後斷言是依賴於第一斷言的IsTrue運算(成功)。

想想:如果測試失敗 - >告訴我爲什麼(沒有尋找到調試輸出)

1

有一種說法爲分裂主張分成兩個單獨的測試是,如果斷言之一失敗,則」會有一次失敗;如果兩個斷言都失敗了,你會得到兩個失敗。

而且,通過使每個測試的名稱暗示可能,你會當東西壞了獲得額外的線索。

0

這是取決於你問它誰不同答案的問題,主要取決於他/她的個人意見或專業經驗。有些超理論的人會告訴你,在測試中有一個以上的斷言是一個至高無上的罪,你就要永遠註定。但其他具有更多實際經驗的人可能會告訴你,每次測試中有10次甚至50次斷言是完美的。

那麼,誰是正確的?

在面對這樣的困境時,我總是儘量做到客觀,並且選擇我決定用當今由認證和經驗豐富的專業人士開發的一些最流行的github回購庫進行小型研究。

那麼,如何大玩家測試他們自己的項目?更重要的是,單元測試框架是如何進行單元測試的?

讓我們看幾個例子:

休眠

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/engine/spi/EntityEntryTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/engine/spi/NonSortedExecutableListTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/engine/spi/SortedExecutableListTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-envers/src/test/java/org/hibernate/envers/test/JpaStaticMetamodelTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-hikaricp/src/test/java/org/hibernate/test/hikaricp/HikariCPConnectionProviderTest.java https://github.com/hibernate/hibernate-orm/blob/master/hibernate-proxool/src/test/java/org/hibernate/test/proxool/ProxoolConnectionProviderTest.java

https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/AntPathMatcherTests.java https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/ClassUtilsTests.java https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.javahttps://github.com/spring-projects/spring-framework/blob/master/spring-core/src/test/java/org/springframework/util/AutoPopulatingListTests.java

的junit 4

https://github.com/junit-team/junit4/blob/master/src/test/java/junit/tests/extensions/ActiveTestTest.java https://github.com/junit-team/junit4/blob/master/src/test/java/junit/tests/extensions/RepeatedTestTest.java https://github.com/junit-team/junit4/blob/master/src/test/java/junit/tests/runner/ResultTest.java https://github.com/junit-team/junit4/blob/master/src/test/java/org/junit/rules/TimeoutRuleTest.java

的junit 5

https://github.com/junit-team/junit5/blob/master/platform-tests/src/test/java/org/junit/platform/launcher/core/DefaultLauncherTests.javahttps://github.com/junit-team/junit5/blob/master/platform-tests/src/test/java/org/junit/platform/launcher/core/LauncherDiscoveryRequestBuilderTests.java https://github.com/junit-team/junit5/blob/master/platform-tests/src/test/java/org/junit/platform/launcher/listener/SummaryGenerationTests.java https://github.com/junit-team/junit5/blob/master/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/StandardTestClassTests.java https://github.com/junit-team/junit5/blob/master/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/DiscoveryFilterApplierTests.java

谷歌真相

https://github.com/google/truth/blob/master/core/src/test/java/com/google/common/truth/DoubleSubjectTest.java https://github.com/google/truth/blob/master/core/src/test/java/com/google/common/truth/BigDecimalSubjectTest.java https://github.com/google/truth/blob/master/core/src/test/java/com/google/common/truth/DoubleSubjectTest.java

正如我們在上面的例子中看到,專業開發人員似乎並不那麼在意單個斷言誡。事實上,他們大多數時候都違反了這條規則,看起來他們完全沒有問題。也許他們忽略它,因爲它不是一個嚴格的規則,而只是一個建議。 值得一提的是,即使是單元測試框架在大多數情況下每次測試都會測試多個斷言。

所以我的結論很清楚:關於這個問題,在單個測試中擁有儘可能多的斷言是完全有效的。如果專業開發人員這樣做,你也可以這樣做。

相關問題