2009-12-04 30 views
2

是否可以告訴xUnit.net執行所有例如Assert.True()在一個測試方法?基本上,在我們的一些使用/測試用例中,所有的斷言都屬於邏輯上屬於同一個測試範圍,我有像這樣:Xunit:在一種測試方法中執行所有'斷言'?

[Fact(DisplayName = "Tr-MissImpl")] 
    public void MissingImplementationTest() 
    { 
     // parse export.xml file 
     var exportXml = Libraries.Utilities.XML.GenericClassDeserializer.DeserializeXmlFile<Libraries.MedTrace.ExportXml>(
       ExportXmlFile); 

     // compare parsed results with expected ones 
     Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_154163", "E0032A")); 
     Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_155763", "E0032A")); 
     Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_155931", "E0032A")); 
     Assert.True(exportXml.ContainsRequirementKeyWithError("PERS_157145", "E0032A")); 

     Assert.True(exportXml.ContainsRequirementKeyWithError("s_sw_ers_req_A", "E0032A")); 
     Assert.True(exportXml.ContainsRequirementKeyWithError("s_sw_ers_req_C", "E0032A")); 
     Assert.True(exportXml.ContainsRequirementKeyWithError("s_sw_ers_req_D", "E0032A"));  
    } 

現在,例如,第一個Assert.True(...)失敗,其他的不執行/檢查。我寧願不把這七個斷言分解成單獨的方法,因爲這些確實是邏輯上屬於一個整體(如果所有七個都通過了,TC只會「完全通過」)。

回答

8

AAA的重點在於旨在儘可能簡化每一部分,並使其保持專注,以便讀者能夠快速瞭解​​測試並輕鬆找出故障原因。

您有7個不同的Fact在這裏,它們一起構成一個Theory。所以你應該創建[Theory]代表期望的7組[InlineData]。以http://blog.benhall.me.uk/2008/01/introduction-to-xunitnet-extensions.html爲例。

如果重新執行編配/動作是一個問題,那麼你應該通過在測試類的構造函數中做這個'fixture'(用xUnit Test Patterns的說法)。

public class WithGenericClassDeserializer 
{ 
    var exportXml; 

    public WithGenericClassDeserializer() 
    { 
     // Or move this into the GivenExportXmlFile_ExpectedValueAtKeyShouldMatch 
     exportXml = Libraries.Utilities.XML.GenericClassDeserializer.DeserializeXmlFile<Libraries.MedTrace.ExportXml>(ExportXmlFile); 
    } 

    [Theory(DisplayName = "Tr-MissImpl")] 
    [InlineData("PERS_154163", "E0032A")] 
    [InlineData("PERS_155763", "E0032A")] 
    [InlineData("PERS_155931", "E0032A")] 
    [InlineData("PERS_157145", "E0032A")] 
    [InlineData("s_sw_ers_req_A", "E0032A")] 
    [InlineData("s_sw_ers_req_C", "E0032A")] 
    [InlineData("s_sw_ers_req_D", "E0032A")] 
    public void GivenExportXmlFile_ExpectedValueAtKeyShouldMatch(string key, string value) 
    { 
     Assert.True(exportXml.ContainsRequirementKeyWithError(key, value)); 
    } 
} 
+0

我剛開始使用的xUnit,並沒有看着理論的東西,但是我認爲這是一個更好的方法來做到這一點。 – 2009-12-04 15:31:06

+0

我強烈建議閱讀所有從xunit.codeplex.com鏈接的文章和博客文章 - 這裏有一些很棒的東西(並且討論和功能對於發現爲什麼*不支持的東西*) – 2009-12-04 15:51:49

0

是的,你可以,但你必須添加額外的代碼到你的測試。如果斷言失敗,xUnit中的每個Assert語句都會引發異常。所以在Assert.True的情況下,它會拋出一個TrueException。所以你可以做的事情是:

[Fact] 
    public void MultipleAssertTest() 
    { 
     bool passesValidation = true; 

     passesValidation = PassesAssert(true == true); 
     passesValidation = PassesAssert(false == true); 
     passesValidation = PassesAssert(5 == 1); 

     Assert.True(passesValidation); 

    } 

    private bool PassesAssert(bool expression) 
    { 
     try 
     { 
      Assert.True(expression); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

這將允許你運行你所有的斷言,並完全做你的測試。然而它不是非常有用,因爲你不知道什麼斷言失敗。以下哪個更好?所以你可以從測試中獲得結果,以便知道哪些項目失敗。

 private StringBuilder resultMsg; 
    [Fact] 
    public void MultipleAssertTest() 
    { 
     bool passesValidation = true; 
     resultMsg = new StringBuilder(); 

     passesValidation = PassesAssert(true == true, "True True test"); 
     passesValidation = PassesAssert(false == true, "False True test"); 
     passesValidation = PassesAssert(5 == 1, "5==1 Test"); 

     Assert.True(passesValidation, resultMsg.ToString()); 

    } 

    private bool PassesAssert(bool expression, string message) 
    { 
     try 
     { 
      Assert.True(expression, message); 
      return true; 
     } 
     catch (AssertException ex) 
     { 
      resultMsg.Append(ex.UserMessage); 
      resultMsg.Append(Environment.NewLine); 
      return false; 
     } 
    } 

當然這需要更多一點的工作,但它可以讓你在所有的斷言在一起。你可以用這種方式來包裝你的任何測試Assert方法。所以你可以說你正在擴展xUnit以使一個非失敗的Assert進程。

希望這會有所幫助。

編輯:根據意見,爲了這個工作,你就需要使用&運營商的後續調用將覆蓋該值。

+0

我認爲這是一個壞主意 - 有管理這遠更清潔的方式。你的樣本中還有一個錯誤。如果你閱讀它,你會看到它。關於爲什麼我甚至沒有告訴你它是什麼的底線是,這種複雜性和駭人聽聞的水平完全不屬於測試。應該有3As,它應該儘可能簡短和直接。 – 2009-12-04 13:24:52

+0

這是一個代碼片段,不是一個完整的類。它在課堂上有用,我確信這一點。 – 2009-12-04 15:30:21

+0

不建議你沒有測試它,或者你只是夾東西。我知道你付出了很多努力。說有複雜的斷言部分和邏輯是容易出錯的。錯誤在以下片段中: - 「passesValidation = PassesAssert」。還有一個同樣的問題。沒有3個錯誤的實例。底線是如果一個測試得到這個複雜的,有什麼問題。(最近,我讀的xUnit測試模式 - 它是一個偉大的書,和Osherove本書可以用於獲取該直線thinging好) – 2009-12-04 15:34:01

相關問題