如果函数A使用函数B而我测试函数A是集成测试吗?

时间:2018-04-06 08:30:33

标签: javascript unit-testing integration-testing

我目前正在写一篇关于JavaScript中单元测试的文章。我面临的问题是我怀疑我的单元测试(见下文)实际上是一个集成测试,这当然使我的论文更复杂。

这就是我所拥有的。我正在使用mocha和chai(断言):

// region Implementation

/**
 * @param {number} i
 * @returns {number} i + 2
 */
function A(i) {
    return B(i + 1);
}

/**
 * @param {number} i
 * @returns {number} i + 1
 */
function B(i) {
    return i + 1;
}

// endregion

// region Test

lt("B(i) returns i + 1", () => {
    assert.equals(B(2), 3);
})

lt("A(i) returns i + 2", () => {
    assert.equals(B(2), 4);
})

// endregion

对我来说,第一次测试肯定看起来像一个单元测试。遗漏了单元测试的最佳实践,它测试了一个函数,在这种情况下,它是一个不能分成小块的单元,在这种情况下它不依赖于任何其他函数。

功能A虽然依赖于功能B.结果是,如果我测试功能A,我必须假设功能A正常工作。

所以这让我思考。第二个测试是否已经是集成测试而不是单元测试?

此致 费边

1 个答案:

答案 0 :(得分:1)

我认为单元测试和集成测试之间存在细微差别。如果A使用B,严格来说,您正在测试的不仅仅是您的单位。另一方面,如果单位足够小并且UUT(被测单元)的重要部分是您在B中调用的单位,我认为您仍然可以将其视为单元测试。当我谈到集成测试时,我正在测试整个链。要记住的另一个重要事项是@deceze已经提到过:“你很少有任何代码不使用任何其他函数。在函数式语言中,甚至运算符都是函数,所以没有代码不使用其他函数。因此,每次测试都是集成测试。“。

假设我们有一个用户可以注册的系统。就个人而言,我会在单元测试中测试register单元。在这种情况下,我可以编写存根而不是针对真实数据库进行测试(并且仍将其称为单元测试)。之后我会编写一个集成测试,测试用户是否可以使用新创建的帐户注册

Martin Fowler撰写的以下文章可能很有趣:https://martinfowler.com/bliki/UnitTest.html