Assert之后有没有办法继续测试? ..我需要查看断言导致的所有案例。
foreach (var ex in data)
{
Assert.AreEqual(ex1, ex, msg);
}
答案 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");
}