【问题标题】:Testing framework with many Asserts per line每行有许多断言的测试框架
【发布时间】:2016-02-08 13:44:34
【问题描述】:

是否有一个 c# 测试框架允许将多个断言集中在一个语句中,如下所示:

Assert.AreEqual("valueA", object.A).AreEqual( "valueB", object.B)...

而不是

Assert.AreEqual("valueA", object.A);
Assert.AreEqual( "valueB", object.B);
...

这会使测试代码更短,对吧?

谢谢!

【问题讨论】:

  • “更短”有什么好处?
  • 多个断言充其量是很麻烦的,将它们链接在一起会更难看出哪个断言失败。见Assertion Roulette
  • 是的,我同意@NikolaiDante 的观点,将它们链接起来会使理解和调试变得更加困难。此外,自己包装 assert 方法以便链接它们或缩短它们非常容易,但您不应该这样做。在您编写的每个测试中使用一个断言是一个好习惯。

标签: c# unit-testing


【解决方案1】:

FluentAssertions 可以让你做这样的事情:

string actual = "ABCDEFGHI";
actual.Should().StartWith("AB").And.EndWith("HI").And.Contain("EF").And.HaveLength(9);

(More examples on the documentation)


也就是说,多个断言充其量是很麻烦的,将它们链接在一起会更难看出哪个断言失败。有关 XUnit 模式,请参阅 Assertion Roulette

【讨论】:

    【解决方案2】:

    我认为您不会找到这样的框架,因为大多数资源都会告诉您,在您编写的每个测试中保留一个 assert 是一个好习惯。

    将多个断言链接在一起将更难理解哪些失败、何时失败(它们肯定会在某些时候失败)以及调试时间。

    如果您仍然决心这样做,那么包装您正在使用的测试框架以使其可链接起来应该很容易,并且可能看起来像这样:

    public class Assertion {
        public Assertion AssertEquals(object actual, object expected) {
            // TODO: call your framework Assert.AreEqual() here
            Assert.AreEqual(a, b);
            return this;
        }
    }
    
    // and now you can do something like this :
    new Assertion()
        .AssertEquals("objectA", object.A)
        .AssertEquals("objectB", object.B);
    

    (这不是一个工作示例,而只是关于如何实现它的一个想法)。

    无论哪种方式,“更短的代码”都不应该是您的最终目标。目标应该有可读的代码。使用 IDE 的自动完成功能(即:Visual Studio 的 Intellisense)键入 less。

    ...如果你仍然下定决心要尽可能短的代码(我强烈不推荐),那么只需执行以下操作:

    public static void a(object a, object b) {
        Assert.AreEqual(a, b);
    }  
    

    然后您的测试将如下所示:

    a("objectA", object.A);
    a("objectB", object.B);
    

    就像我说的,这不可读...:/

    【讨论】:

      猜你喜欢
      • 2020-07-25
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多