2

是否可以告诉 xUnit.netAssert.True()在一种测试方法中执行所有操作?基本上在我们的一些使用/测试用例中,所有断言在逻辑上都属于一个相同的测试“范围”,我有例如这样的东西:

    [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 只有完全“通过”)。

4

2 回答 2

8

AAA 的重点是尽可能简化每个部分并保持重点,以便读者可以快速了解测试并轻松找出故障原因。

您在这里有 7 个不同Fact的 s,它们共同组成一个Theory. 因此,您应该创建一个[Theory]具有 7 组[InlineData]表示期望的集合。有关示例,请参见http://blog.benhall.me.uk/2008/01/introduction-to-xunitnet-extensions.html 。

如果重新执行 Arrange/Act 是一个问题,那么您应该通过在测试类的构造函数中执行该操作来制作“夹具”(用 xUnit 测试模式的说法)。

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 ) );
    }
}
于 2009-12-04T13:18:30.267 回答
-1

是的,您可以,但您必须在测试中添加额外的代码。如果断言失败,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 进程。

希望这可以帮助。

编辑:根据评论,为了使其工作,您需要使用 & 运算符,因为后续调用会覆盖该值。

于 2009-12-04T12:11:23.607 回答