【问题标题】:If function A uses function B and I test function A is it an integration test? [closed]如果功能 A 使用功能 B 并且我测试功能 A 是否是集成测试? [关闭]
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多