继续断言

时间:2014-01-01 20:10:29

标签: c# unit-testing

Assert之后有没有办法继续测试? ..我需要查看断言导致的所有案例。

foreach (var ex in data)
{
     Assert.AreEqual(ex1, ex, msg);
}

6 个答案:

答案 0 :(得分:8)

不,你不能 - Assert如果失败就会抛出异常,你就不能在异常之后继续前进。您可以捕获异常,然后将它们添加到集合中......但它并不是非常好。

如果您尝试基本测试几种不同的情况,大多数现代单元测试框架都有参数化测试的方法,以便每个案例最终作为单独的测试,并单独报告通过/失败标准。我们不知道您正在使用哪个框架或这里有不同的案例,但如果您能提供更多背景信息,我们可以尝试提供更多帮助...

答案 1 :(得分:3)

Assert.AreEqual抛出断言异常。所以,你不能简单地转向下一个断言。你应该抓住它们,但这不是应该如何使用断言。失败的断言应该停止测试执行。

因此,您应该有单个断言,它将为您返回所有必需的数据。如果要验证所有项目是否等于某个值,那么您应该在test中编写它。如果测试失败,您可以将所有集合转储到错误消息或只是不期望的项目(我使用Json.NET):

Assert.IsTrue(data.All(ex => ex == ex1), 
              JsonConvert.SerializeObject(data.Where(ex => ex != ex1)));

如果失败,此断言将所有项目序列化为JSON并在测试运行器消息中显示它们。例如。如果你有整数集合:

var data = new List<int> { 1, 1, 5, 1, 2 };
int expected = 1;
Assert.IsTrue(data.All(i => i == expected), "Unexpected items: " +
              JsonConvert.SerializeObject(data.Where(i => i != expected)));  

测试将失败并显示消息:

  

Assert.IsTrue失败。意外的项目:[5,2]

答案 2 :(得分:2)

您可以捕获异常,将其添加到列表中,然后继续。最后,你可以断言列表是空的。

答案 3 :(得分:1)

该文章解释了如何“验证”您的价值。 Adding verify to MsTest

答案 4 :(得分:0)

如果您使用的是 Visual Studio 并且您所谈论的 data 只是测试数据而不是您程序的实际集合,您可以通过以下方式将测试数据提供给您的测试方法:

[TestMethod()]
[DataRow("1", "2")]
[DataRow("2", "3")]
[DataRow("3", "4")]
public void TheTest(string str1, string str2) {
    Assert.AreEqual(str1, str2);
}

这样,每个数据案例都被视为一个单独的测试,因此不会中止。 但是,Visual Studio 中的输出可能没有您喜欢的那么紧凑。

出于这个原因,我建议在循环测试数据时构建您自己的错误消息,其中每个失败都由换行符分隔。如果最后您Assert.Fail()看到完整的消息,则测试资源管理器窗口会很好地列出所有失败的元素,并以新行分隔。

string errors = "";
[TestMethod()]
public void TheTest(...){
    data.ForEach( if(wrong) errors += "\n it's wrong");
    if(errors != "")
        Assert.Fail(errors);
}

答案 5 :(得分:-1)

我最近正在尝试执行此操作,以与具有文件哈希策略的测试文件进行比较。这对我有用。在这种情况下, FileAssert.AreEqual 方法返回true或false。

 var equal =  FileAssert.AreEqual(manifest.FileContents, storedFile);

                if (!equal)
                {
                    var fileText1 = Encoding.Default.GetString(manifest.FileContents);
                    var fileText2 = Encoding.Default.GetString(storedFile);

                    var dmp = DiffMatchPatchModule.Default;
                    var diffs = dmp.DiffMain(fileText1, fileText2, true);
                    var html = dmp.DiffPrettyHtml(diffs);
                    var filePath = Path.Combine(AssemblyDirectory, APP_DATA, "ManifestTestErrors.html");
                    File.WriteAllText(filePath, html);
                    Assert.False(!equal, $"Check {new Uri(filePath).AbsoluteUri} for more info");
                }