unit-testing - 如果一个方法调用另一个方法,是单元测试还是集成测试?
问题描述
我是 tdd 概念的初学者,所以我的问题是,如果我有一个调用另一个方法的方法,听起来很简单,它是单元测试还是集成测试?如果它是集成测试,仅仅是因为我的方法调用了另一个方法并且方法之间存在“集成”吗?
解决方案
如果我有一个调用另一个方法的方法,听起来很简单,它是单元测试还是集成测试?
可悲的是,这将取决于您使用的“单元测试”和“集成测试”的定义。二十年前,当这些定义由软件测试领域的专家推动时,这个问题会更容易回答。
但是TDD发生了;肯特贝克对他的定义并不特别自律,一堆新想法开始冒出来。
即使在 TDD 的上下文中,对于“单元测试”的含义也存在细微的分歧。例如,一个重要的想法是测试不应该对它们的运行顺序敏感。每个单独的测试都包含正确测量系统所需的所有设置和拆卸。另一个是在同一进程中同时运行的两个测试不应相互干扰;所以没有共享的可变状态..
这里的共同主题是测试受到约束;“单元测试”将描述具有一组特定属性的测试。
一个不同的想法来自于观察,即如果没有非常仔细的设计,大型测试在项目的整个生命周期中都是脆弱的。如果测试对象的可观察行为又取决于许多可能会改变的不同决定,那么易碎测试是常见的结果。
因此,出现了一种不同类型的约束,表明测试对象应该很小——“单元测试”是指测试对象的行为仅取决于可能发生变化的少量决策。
更令人困惑的是,贝克和其他人成功使用的仪式在不同时期被宣传为“测试优先开发”、“测试驱动开发”、“测试驱动设计”——这混淆了动机。是目的test
,还是目的design
?
据我所知,每个人都同意不委托任何工作的方法是单元测试的好主题。
此外,每个人都同意将其工作委托给稳定的合作者(例如标准库)的方法是单元测试的一个很好的主题。
但是,当我们将不使用协作者的设计替换为使用不稳定协作者的设计时(将工作委派给其他方法,特别是如果它们位于不同的“类”中),分歧就开始了。
如果我们更改设计以在不稳定部分之间共享工作,这仍然是单元测试吗?我相当肯定贝克会同意,弗里曼和普莱斯也会同意。我不太确定@JBrains;请参阅综合测试是骗局。有些人做了自己的实验,并找到了适合他们的职位;其他人对他们喜欢的专家所描述的“最佳实践”有自己的解释。
简而言之:这是一团糟。
我能提供的最佳答案是,与其担心我们用于不同风格测试的标签,不如专注于有趣的属性集、确保测试具有这些属性所需的约束,并将这些属性与它们的用途保持一致.
例如,如果您要在开发会话期间多次运行测试,作为及早发现错误的机制,那么您可能希望这些测试快速,并且独立于您自己以外的环境中发生的事情。要获得这些属性,您可能需要在测试中避免网络流量,甚至可能是 I/O——在内存中执行“所有操作”要快得多(并且让您面临需要管理的某些风险其他方法)。
推荐阅读
- wordpress - if else 语句给出数组
- bash - $# 计算哪些字符?
- oracle - PLS-00103 在 Oracle 游标中提供参数时
- javascript - Django Stripe Fake Card 导致 TemplateDoesNotExist 错误
- css - 显示文本覆盖并在悬停时应用图像透明度
- php - Laravel 5.6 身份验证注销失败
- python - 连接RTSP后,OpenCV在python中抛出401错误
- powershell - 有没有办法回显 Powershell 命令行?
- python - 有没有办法找到熊猫数据框列中的最大变化?
- javascript - 在循环外访问模板输入变量(*ngFor 变量)的可能方法?