2009-12-04 116 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

相关问题