我正在对我的代码运行一些测试。我的主要测试方法用于验证某些数据,但在该检查中,它有很多可能在任何一点失败。
现在,我在我的方法中设置了多个Assert.Fail
语句,当测试失败时,我输入的消息将按预期显示。但是,如果我的方法多次失败,它只显示第一个错误。当我解决这个问题时,我才发现第二个错误。
我的测试都不依赖于我正在运行的任何其他测试。理想情况下,我希望能够让我的失败消息在一次传递中显示每条失败的消息。这样的事情有可能吗?
根据评论,以下是我在方法中设置几个测试的方法:
private bool ValidateTestOne(EntityModel.MultiIndexEntities context)
{
if (context.SearchDisplayViews.Count() != expectedSdvCount)
{
Assert.Fail(" Search Display View count was different from what was expected");
}
if (sdv.VirtualID != expectedSdVirtualId)
{
Assert.Fail(" Search Display View virtual id was different from what was expected");
}
if (sdv.EntityType != expectedSdvEntityType)
{
Assert.Fail(" Search Display View entity type was different from what was expected");
}
return true;
}
答案 0 :(得分:1)
为什么没有包含所有失败消息的字符串/ stringbuilder,检查代码末尾的长度,并将其传递给Assert.Fail?只是一个建议:)
答案 1 :(得分:0)
NUnit测试运行器(假设您使用的是什么)旨在一旦出现任何故障就会中断测试方法。
因此,如果您希望每个失败,您需要将测试分解为更小的单个断言。一般来说,您只想在每次测试中测试一件事无论如何。
在旁注中,使用Assert.Fail
之类的语义在语义上并不正确。考虑使用其他内置方法(如Assert.Equals
),仅在其他方法不足时使用Assert.Fail
。
答案 2 :(得分:0)
我的测试都不依赖于我正在运行的任何其他测试。理想的情况下 我想要的是能够显示我的失败信息 一遍中每条失败的消息。这样的事情有可能吗?
只有将测试分成几个较小的测试才有可能。
如果您害怕在测试很复杂时通常存在代码重复,则可以使用安装方法。它们通常由属性标记:
SetUp
,TestInitialize
,以下代码显示了如何重写您的测试:
public class HowToUseAsserts
{
int expectedSdvCount = 0;
int expectedSdVirtualId = 0;
string expectedSdvEntityType = "";
EntityModelMultiIndexEntities context;
public HowToUseAsserts()
{
context = new EntityModelMultiIndexEntities();
}
[Fact]
public void Search_display_view_count_should_be_the_same_as_expected()
{
context.SearchDisplayViews.Should().HaveCount(expectedSdvCount);
}
[Fact]
public void Search_display_view_virtual_id_should_be_the_same_as_expected()
{
context.VirtualID.Should().Be(expectedSdVirtualId);
}
[Fact]
public void Search_display_view_entity_type_should_be_the_same_as_expected()
{
context.EntityType.Should().Be(expectedSdvEntityType);
}
}
因此,您的测试名称可以提供与您编写的消息相同的信息:
现在,我在我的内部设置了多个Assert.Fail语句 方法,当测试失败时,我输入的消息显示为 预期。但是,如果我的方法多次失败,它只显示 第一个错误。当我解决这个问题时,我才会发现它 第二个错误。
这种行为是正确的,许多测试框架都遵循它。
我建议您停止使用Assert.Fail()
,因为它会强制您为每次失败编写特定的消息。常见断言提供了足够好的消息,因此您可以使用以下行替换代码:
// Act
var context = new EntityModelMultiIndexEntities();
// Assert
Assert.Equal(expectedSdvCount, context.SearchDisplayViews.Count());
Assert.Equal(expectedSdVirtualId, context.VirtualID);
Assert.Equal(expectedSdvEntityType, context.EntityType);
但我建议开始使用像Fluent Assertions这样的应用框架,这样可以让您的代码可读并提供更好的输出。
// Act
var context = new EntityModelMultiIndexEntities();
// Assert
context.SearchDisplayViews.Should().HaveCount(expectedSdvCount);
context.VirtualID.Should().Be(expectedSdVirtualId);
context.EntityType.Should().Be(expectedSdvEntityType);