我目前正在写一篇关于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正常工作。
所以这让我思考。第二个测试是否已经是集成测试而不是单元测试?
此致 费边
答案 0 :(得分:1)
我认为单元测试和集成测试之间存在细微差别。如果A
使用B
,严格来说,您正在测试的不仅仅是您的单位。另一方面,如果单位足够小并且UUT(被测单元)的重要部分是您在B
中调用的单位,我认为您仍然可以将其视为单元测试。当我谈到集成测试时,我正在测试整个链。要记住的另一个重要事项是@deceze已经提到过:“你很少有任何代码不使用任何其他函数。在函数式语言中,甚至运算符都是函数,所以没有代码不使用其他函数。因此,每次测试都是集成测试。“。
假设我们有一个用户可以注册的系统。就个人而言,我会在单元测试中测试register
单元。在这种情况下,我可以编写存根而不是针对真实数据库进行测试(并且仍将其称为单元测试)。之后我会编写一个集成测试,测试用户是否可以使用新创建的帐户注册和。
Martin Fowler撰写的以下文章可能很有趣:https://martinfowler.com/bliki/UnitTest.html