你应该在循环中做一个断言语句吗?

时间:2017-01-24 15:56:26

标签: testing

当我们有多个值时,我们想要测试给定的方法,我们应该在单个测试中循环遍历值吗?

或者如果失败可能更难确定原因?

这样的事情:

testSomething(){
    List myValues = {'value1', 'value2', 'value3', ...}

    for(value: myValues){
        assertTrue(Something(Value))
    }
}

1 个答案:

答案 0 :(得分:3)

如果可以避免则不行

我的意思是,根据您用于进行单元测试的内容,您可能无法真实地避免它。在这种情况下,按需要做

如果你在一个循环中运行你的断言,你实际上有一个测试正在测试任意数量的东西。这会让人感到困惑。

你想要的是多个测试,每个测试都测试一件事。

一些测试框架(如N#for C#)允许您定义一个带参数的测试,然后定义值以重复测试。

e.g。

[TestCase(1, 1, 2)]
[TestCase(2, 3, 5)]
[TestCase(0, -1, -1)]
public void MyTest(int a, int b, int expected) {        
    Assert.AreEqual(expected, a + b);
}

如果你的框架支持它,那就非常容易了。

或者,如果您使用的是脚本语言(例如javascript),则可以在循环中定义测试,而不是断言。

e.g。

describe('My tests', function() {
    var testCases = [
        {a: 1, b: 1, expected: 2},
        {a: 2, b: 3, expected: 5},
        {a: 0, b: -1, expected: -1}
    ]

    testCases.forEach(function(t) {
        it(`Adds ${t.a} and ${t.b} correctly`, function() {
            assert.equal(t.expected, t.a + t.b);
        });
    });
})

这定义了许多测试,测试单个事物。没有一个测试测试很多东西。这样可以更容易地看到哪一个失败了。