为类似的测试创建多个测试方法

时间:2014-02-02 00:17:20

标签: c# unit-testing mstest

我有一个方法可以重置两个输入的值:

public void ResetLocation(ref ushort x, ref ushort y) {
    x = 0x7fff;
    y = 0x7fff;
}

对于单元测试,我创建了两个TestMethods:

[TestMethod]
public void ResetLocation_GivenReferenceValues_ValueXShouldBeReset() {
    ushort x = -5;
    ushort y = 0;
    SomeController someController = new SomeController();

    someController.ResetLocation(ref x, ref y);

    Assert.AreEqual(0x7fff, x);
}

[TestMethod]
public void ResetLocation_GivenReferenceValues_ValueYShouldBeReset() {
    ushort x = 0;
    ushort y = -3;
    SomeController someController = new SomeController();

    someController.ResetLocation(ref x, ref y);

    Assert.AreEqual(0x7fff, y);
}

到目前为止我收集的关于单元测试“最佳实践”的信息是每个单元测试应该只有一个断言。但是在这种情况下,在同一个测试单元中测试xy是否更有意义(单个测试中的两个断言)?

[TestMethod]
public void ResetLocation_GivenReferenceValues_BothValuesShouldBeReset() {
    ushort x = -5;
    ushort y = 3;
    SomeController someController = new SomeController();

    someController.ResetLocation(ref x, ref y);

    Assert.AreEqual(0x7fff, x);
    Assert.AreEqual(0x7fff, y);
}

在像这样的单元测试中有两个断言是不是很糟糕?

1 个答案:

答案 0 :(得分:1)

我认为在单个单元测试中添加多个断言并不是一件坏事。需要注意的主要事项是确保测试仍然易于理解且易于维护。 换句话说:不要创建一个如此复杂且需要测试的测试: - )

我甚至不介意在我使用一系列输入测试代码是有意义的情况下将我的断言放在循环中。

这方面的一个变体是利用内置的测试框架功能来使用不同的输入重新运行测试。我过去曾和nunit做过这件事 点击此处:http://nunit.org/index.php?p=parameterizedTests&r=2.5