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

时间:2019-04-11 02:42:56

标签: unit-testing testing tdd integration-testing

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

4 个答案:

答案 0 :(得分:4)

  

如果我有一个调用另一个方法的方法,听起来很简单,那是单元测试还是集成测试?

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

但是TDD发生了;肯特·贝克(Kent Beck)对其定义没有特别的纪律,因此涌现出许多新想法。

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

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

观察到一个不同的想法,即大型测试在没有非常仔细的设计的情况下会在项目的整个生命周期内变得脆弱。如果测试对象的可观察行为又取决于许多可能改变的不同决定,那么脆性测试就是一种常见的结果。

因此出现了另一种约束,表明测试对象应该很小-“单元测试”是指测试对象的行为仅取决于少量可能改变的决策的行为。

>

更令人困惑的是,贝克和其他人成功使用的仪式在不同时间以“ Test First Development”,“ Test Driven Development”,“ Test Driven Design”的形式销售–混淆了动机。目的是test,还是目的design

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

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

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

如果我们更改设计以在不稳定零件之间共享工作,这仍然是单元测试吗?我相当确定贝克会说是,Freeman和Pryce也会说。我不太确定@JBrains;参见Integrated Tests are a Scam。有些人做了自己的实验,找到了适合自己的作品。其他人对 他们喜欢的专家描述的“最佳做法”。

简而言之:一团糟。

我能提供的最佳答案是,不必担心我们用于不同测试类型的标签,而将注意力集中在有趣的 properties 集合上,即约束您需要确保测试具有这些属性,并使这些属性与用途匹配。

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

答案 1 :(得分:1)

另一个答案确实很有帮助,但让我们添加一下想法:

  

如果我有一个方法可以调用另一个方法

它从此处开始。如果被调用的 other 方法存在于您的“被测单元”中,那么我将其视为单元测试。

如果该方法位于“另一个”单元中(不是“正在测试”,而是“依赖性”),则取决于:如果您模拟/存根其他单元,我认为您仍在运行一个单元测试。但是甚至可以声称:当可以直接调用另一个单元而不进行存根时,您可能仍会在该初始单元上运行单元测试。

换句话说,您查看目的和“单元”的内容的“定义”:当我编写一组测试都可以使用一个Java类的公共方法的测试时,很可能这些是单元测试。也许我必须对依赖项进行存根,也许我做了出色的设计,并且可以使用依赖单元而无需解决方法。

“下一个”级别不是集成测试。这是“功能”测试。您可以问“功能Y是否起作用”,而不用看“ X类是否做到这一点或那件事”,而不用担心是否只需要X类或5个其他类。您关心的是更大的(端到端)功能,而不是代码组织的单个“单元”。

“下一个”级别,即集成测试。在我的书中,这些内容是要确保一组完整的功能部件/功能组合在一起,并且每个功能部件/部件都在做应做的事情,并且一定要侧重于在较低的单元/功能测试中被打断/模拟/忽略的方面。事物的一面。

答案 2 :(得分:1)

我会走得更远,并尝试忘记“单元”,“整合”,“行为”或“验收”测试,而是将所有测试分为两组

  • 快速测试
  • 测试缓慢
    • 访问外部资源(文件系统,数据库,Web服务等)时
    • 要配置的非常复杂的测试用例

通过模拟外部资源或非常复杂的依赖项,您可以将一些测试用例移到“快速”类别中,并向开发人员提供更快的反馈。

我会尝试尽可能少地模拟,只要测试执行得足够快以在代码中的每次更改后运行它们即可。

然后,“单位”将成为行为的单位,它将测试应用程序的行为并尽可能将应用程序保留为“黑匣子”。

答案 3 :(得分:0)

集成测试意味着在集成后测试不同的模块 单元测试意味着将测试模块作为一个完整的单元。 在我看来,我们称其为单元测试和集成测试