我正在测试一个网页,其中包含三个不同的模块。在我的测试框架中,每个页面模块都由其自己的测试类表示:Module1Tests
,Module2Tests
,Module3Tests
。此外,为了满足每个模块的特定条件,我在每个测试类中使用Assume.That
。
如果我只是测试单独的模块,那么一切正常。
但是,当我为整个页面创建一个测试类并使用Assert.Multiple
时,这样:
public class HomePageTests
{
public Module1Tests Module1Tests { get; } = new Module1Tests();
public Module2Tests Module2Tests { get; } = new Module2Tests();
public Module3Tests Module3Tests { get; } = new Module3Tests();
[Test]
public void HomePage()
{
Assert.Multiple(() =>
{
Module1Tests.Module1TestMethod();
Module2Tests.Module2TestMethod();
Module3Tests.Module3TestMethod();
});
}
我收到错误消息,指出我无法在Assume.That
块中使用Assert.Multiple
的方法。
我也试过调用没有Assert.Multiple
块的模块测试方法,但整个页面测试在第一次失败时停止执行。
有没有办法解决这个问题?基本上我只想对所有底层模块测试通过的页面进行测试。
答案 0 :(得分:0)
正如已经指出的那样,并且如消息所示,您不能在多个断言块中使用假设。如果您查看文档“假设”页面上的注释6中的排除项列表,您将看到它们都是用于立即终止执行测试的项目。
Assert.Fail以及失败的断言也可以立即终止测试。多个断言使得例外...记录了故障但是在所有嵌套的Assert.Multiple块结束之前测试不会终止。
我考虑过对列表中的每个项目进行一些例外处理,这需要为每个项目定义新的行为。目前尚不清楚最佳替代行为是什么,所以我决定等待用户反馈。这个问题实际上是我在任何地方看到的第一个反馈,谢谢!
通常,假设放在所有断言之前,有时甚至在SetUp方法中。在这种情况下,它们的含义基本上是:"如果这个假设失败,那么运行测试就没有意义了。"有时,它们会在一些断言后放置,这意味着"如果失败了,那么再进行一次测试是没有意义的。"
如果我理解正确,您希望失败的假设意味着我们应该在您的一个模块测试中跳过所有以下断言,但继续进行任何其他模块测试。但是,在测试用例中进行模块测试的概念并不是NUnit中存在的,至少在今天。 NUnit中可用的结构由层次结构表示: *命名空间(可能是嵌套的) *夹具 * 测试用例 *多个断言块(可能嵌套) *断言
如果您的模块测试本身使用了多个Assert块,那么我们可以考虑将Assume的行为映射到多个断言块中以表示"在此块中运行任何更多的测试代码是没有意义的。 "如果需要,您需要在github上提交功能请求。我可以事先告诉你这不是一个微不足道的改变,所以我们不能保证我们会这样做,但是可能值得做一些分析,看看它是如何解决的。基本上,我们希望在不混淆其他用户的情况下为您提供所需内容。 : - )
使用当前功能,我看到两种解决方法的选择:
使每个模块在一个夹具内测试一个单独的测试方法,该方法基本上取代了当前的测试方法。如果执行顺序对您很重要,请将Order属性放在每个测试上。换句话说,你现有的n次测试夹具将成为n个独立的夹具。我不知道这是否可能,因为我还没有看到你的代码,但这是利用NUnit现有设施进行结构化测试的一种方法。
将模块测试封装为一组类而不是一组方法。使用一种方法运行所有假设,使用另一种方法运行所有断言。在Assert.Multiple块之前调用所有假设。如果您不希望失败的假设停止整个测试,那么您必须从假设条目中返回一个bool,并记住是否运行每个模块。
可能最简单:在每个模块测试方法中将您的假设纳入条件。如果假设失败,那么就不要进行测试。
我真正希望我能提供的结构化替代方案是嵌套灯具。在许多方面,这将适合您尝试做的比其他选项更好。不幸的是,即使NUnit允许在语法上嵌套装置,在运行测试时也会完全忽略嵌套。我们有一个突出的功能要求来改变它,但它具有相当的未来感。