【发布时间】:2018-04-06 08:30:32
【问题描述】:
我目前正在写一篇关于 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 正常工作。
所以这让我开始思考。第二个测试是否已经是集成测试而不是单元测试?
真诚的 费边
【问题讨论】:
-
很少有代码不使用任何其他功能。在函数式语言中,甚至运算符也是函数,因此没有代码不使用其他函数。因此,每个测试都是集成测试。
-
可能,但在某些时候我认为您可以意识到两者之间没有任何明显的障碍,并谈论“自动化测试”。当然,您的测试越孤立和独立,您就越可以称它们为“统一”。
-
我学习集成测试与单元测试的方式是,如果组件使用确定性函数,您仍然可以将其视为单元测试,但是当它是非确定性时,它显然是集成测试跨度>
-
@RobG 当然,你是对的。抱歉,我会修改它。
-
A 的单元测试不依赖于 B 的结果是否正确,只要
1 +返回任何B(i)即可。测试 B 的返回值是一个单独的测试。即测试应该是“A(i) 返回 B(i) + 1”(或任何适当的语法)。
标签: javascript unit-testing integration-testing