NUnit:Assert.Multiple 用于包含 Assume.That 的方法

问题描述 投票:0回答:1

我正在测试一个包含三个不同模块的网页。在我的测试框架中,每个页面模块都由其自己的测试类表示:

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
块的情况下调用模块测试方法,但是整个页面测试在第一次失败时停止执行。

有办法解决这个问题吗?基本上我只想对所有底层模块测试都通过的页面进行测试。

c# unit-testing nunit assert
1个回答
0
投票

正如已经指出的那样,并且如消息所示,您不能在多个断言块中使用假设。如果您在文档的假设页面上查看注释 6 中的排除项目列表,您会发现它们都是旨在立即终止测试执行的项目。

Assert.Fail 以及失败的断言当然也旨在立即终止测试。多个断言是一个例外......失败被记录但测试不会终止,直到所有嵌套的 Assert.Multiple 块结束。

我考虑过为列表中的每一项设置一些例外,这将需要为每一项定义新的行为。目前尚不清楚最佳替代行为是什么,所以我决定等待用户反馈。这个 SO 问题实际上是我在任何地方看到的第一个反馈,所以谢谢!

在通常情况下,假设位于所有断言之前,有时甚至在 SetUp 方法中也是如此。他们在那种情况下的意思基本上是:“如果这个假设失败了,那么运行测试就没有意义了。”有时,它们会放在几个断言之后,意思是“如果失败,再运行测试就没有意义了。”

如果我对你的理解是正确的,你会希望失败的假设意味着我们应该跳过你的一个模块测试中的所有以下断言,但继续进行任何其他模块测试。但是在测试用例中进行模块测试的概念在 NUnit 中并不存在,至少在今天是这样。 NUnit 中可用的结构由层次结构表示: * 命名空间(可能嵌套) * 夹具 * 测试用例 * 多个断言块(可能嵌套) *断言

如果您的模块测试本身使用多断言块,那么我们可以考虑将 Assume 的行为映射到多断言块中,以表示“在此块中运行更多测试代码毫无意义。”如果需要,您需要在 github 上提交功能请求。我可以预先告诉你这不是一个微不足道的改变,所以不能保证我们会这样做,但可能值得做一些分析看看它是如何工作的。基本上,我们希望在不混淆其他用户的情况下为您提供所需的信息。 :-)

使用当前功能,我看到两种解决方法:

  1. 让每个模块在一个基本上取代当前测试方法的夹具中测试一个单独的测试方法。如果执行顺序对您很重要,请在每个测试上放置 Order 属性。换句话说,您现有的带有 n 个测试的夹具将变成 n 个独立的夹具。我不知道这对你是否可行,因为我还没有看到你的代码,但这是利用 NUnit 现有设施进行结构化测试的一种方法。

  2. 将您的模块测试封装为一组类而不是一组方法。用一种方法运行所有假设,用另一种方法运行所有断言。在您的 Assert.Multiple 块之前预先调用所有假设。如果您不希望失败的假设停止整个测试,那么您必须从假设条目返回一个 bool 并记住是否运行每个模块。

  3. 可能是最简单的:将您的假设纳入每个模块测试方法中的条件。如果假设失败,则不要运行测试。

我真正希望我可以提供的替代结构是嵌套固定装置。在许多方面,这比其他选项更适合您想要做的事情。不幸的是,尽管 NUnit 在语法上允许嵌套 fixture,但在运行测试时嵌套会被完全忽略。我们有一个突出的功能请求来改变它,但它相当具有未来感。

  1. 替换
© www.soinside.com 2019 - 2024. All rights reserved.