unit-testing - 如果一个方法调用另一个方法,是单元测试还是集成测试?

标签 unit-testing testing tdd integration-testing

我是 tdd 概念的初学者,所以我的问题是,如果我有一个调用另一个方法的方法,听起来很简单,它是单元测试还是集成测试?如果它是一个集成测试,那只是因为我的方法调用了另一个方法并且方法之间存在“集成”?

最佳答案

if I have a method that calls another method, as simple as it may sound, it is a unit test or a integration test?

遗憾的是,这将取决于您使用的“单元测试”和“集成测试”的定义。二十年前,当这些定义是由软件测试领域的专家插入的时候,这个问题更容易回答。

但是 TDD 发生了;肯特·贝克 (Kent Beck) 对他的定义并没有特别严格的规定,于是一堆新想法开始涌现。

即使在 TDD 的上下文中,对于“单元测试”的含义也存在细微的分歧。例如,一个重要的想法是测试不应该对它们运行的​​顺序敏感;每个单独的测试都包含正确测量系统所需的所有设置和拆卸。另一个是在同一进程中同时运行的两个测试不应相互干扰;所以没有共享的可变状态..

这里的共同主题是测试是受约束的; “单元测试”将描述具有一组特定属性的测试。

一个不同的想法来自观察,如果没有非常仔细的设计,大型测试在项目的整个生命周期中都是脆弱的。如果测试对象的可观察行为反过来取决于许多可能改变的不同决策,那么脆弱测试是一个常见的结果。

因此出现了一种不同类型的约束,表明测试对象应该很小——“单元测试”是一种测试对象的行为仅取决于少量可能会发生变化的决定的测试。

更令人困惑的是,Beck 和其他人曾经成功使用的仪式在不同时期被称为“测试先行开发”、“测试驱动开发”、“测试驱动设计”——这混淆了动机。目的是测试,还是目的设计

据我所知,每个人都同意不委托(delegate)其任何工作的方法是单元测试的好主题。

此外,每个人都同意将其工作委托(delegate)给稳定的协作者(例如标准库)的方法是单元测试的好主题。

但是,当我们将不使用协作者的设计替换为使用不稳定协作者的设计(将工作委托(delegate)给其他方法,尤其是当它们位于不同的“类”时)时,分歧就开始了。

如果我们改变设计让不稳定的部分分担工作,这还是单元测试吗?我相当确定 Beck 会同意,Freeman 和 Pryce 也会同意。我不太确定@JBrains;见Integrated Tests are a Scam .有些人已经完成了自己的实验,并找到了适合自己的工作;其他人有他们的解释 他们喜欢的专家描述的“最佳实践”。

简而言之:一团糟。

我能提供的最佳答案是,与其担心我们用于不同风格测试的标签,不如专注于有趣的属性集,约束您需要确保测试具有这些属性,并使这些属性与其用途保持一致。

例如,如果您打算在开发 session 期间多次运行测试,作为一种及早发现错误的机制,那么您可能希望这些测试速度快,并且独立于您自己外部环境中发生的情况。要获得这些属性,您可能需要避免测试中的网络流量,甚至可能需要避免 I/O——在内存中执行“所有操作”要快得多(并且让您面临某些需要管理的风险其他方式)。

关于unit-testing - 如果一个方法调用另一个方法,是单元测试还是集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623912/

相关文章:

testing - 在语句 "33.08% covered at 12.13 hits/line"中,hits/line 是什么意思?

python - 切换到 django-pytest 后,我​​还能使用 `manage.py test` 吗?

c# - 为测试生成实体对象的常用方法

c# - 测试从另一个方法调用的方法

unit-testing - 如何使用环模拟请求以 JSON 形式模拟测试 POST 请求?

javascript - 如何在 Jasmine 中测试 JavaScript 图像 onerror 回调?

debugging - 如何将客户端 PC 环境模拟为 VM 以进行错误复制和 QA 测试

.net - 当数据库中数据不可用时测试 SQL Server 存储过程的任何工具。

asp.net - 在 ASP.NET 中对登录进行单元测试

c# - 从数据上下文 : Linq to SQl 获取存储过程