确定测试是单元测试还是集成测试

时间:2014-05-23 01:48:52

标签: python unit-testing testing integration-testing

所以我试图决定为我的python项目规划和组织测试套件的方法,但我怀疑单元测试何时不再是单元测试,我希望得到一些反馈来自社区。

如果我理解正确:

  • 单元测试测试代码的最小部分,如果一个函数/方法执行一个且只有一个简单的事情,即使它有几个用例
  • 集成测试测试在相同的上下文,环境等下执行的两个或更多单元代码(但尝试将其保持在每个集成测试的最小单位)一起而不仅仅是他们自己。

我的疑问是:说我有一个执行HTTP请求的简单函数并返回此类请求的内容,无论是HTML,JSON等,它都不重要,事实是函数非常,非常简单,但要求来自外部来源的信息,如:

import requests

def my_function(arg):
    # do something very simple with `arg`, like removing spaces or the simplest thing you can imagine
    return requests.get('http://www.google.com/' + arg).content

现在这是一个非常愚蠢的例子,但我怀疑是:

鉴于此功能正在从外部源请求信息,当您为其编写测试时,您是否仍然可以将此类测试视为单元测试

更新:对my_function()的测试将对外部源的调用进行存根,以便它不依赖于network / db / filesystem / etc,以便它能够&#39孤立的。但是,正在测试的功能在运行时依赖于外部源,例如,在生产中。

提前致谢!! :)

PS :当然也许我没有理解单元和集成测试的100%目的,所以,如果我弄错了,请指出我在哪里,我&# 39;我会很感激。

3 个答案:

答案 0 :(得分:1)

根据您的更新:

  

对my_function()的测试会将对外部源的调用存根   所以它不依赖于网络/数据库/文件系统/等等   隔离的。但是正在测试的功能取决于这一事实   在运行时,例如在生产中运行外部资源。

只要外部依赖项在测试期间被删除,那么您可以将其称为单元测试。它是一个单元测试,基于被测单元在测试套件中的行为,而不是单元在生产中的表现。

根据您的原始问题:

  

鉴于此功能正在从外部请求信息   来源,当你为它编写测试时,你仍然可以考虑这样的测试   单元测试?

不,任何接触或依赖于被测单元外部事物的代码测试都是集成测试。这包括存在任何Web,文件系统和数据库请求。

如果您的代码与其依赖关系没有100%隔离,并且在没有其他组件的情况下不能100%重现,那么它就是集成测试。

要使您的示例代码经过适当的单元测试,您需要模拟调用google.com。

如果代码调用google.com,如果谷歌关闭或您丢失了与互联网的连接(即测试不是100%隔离),您的测试将失败。如果谷歌的行为发生变化(即测试不是100%可重复),您的测试也会失败。

答案 1 :(得分:0)

我不认为这是一个集成测试,因为它没有使用应用程序的不同部分。该函数确实做了一件事,对它的测试可以称为unit

另一方面,此特定函数具有外部依赖性,您不希望在测试中依赖于网络。这是mocking真正有用的地方。

换句话说,隔离函数并对其进行unit测试。

此外,进行集成测试,使用更高级别的方法,并测试应用程序中调用my_function()的部分。

答案 2 :(得分:0)

无论您的测试是否为单元测试,您的代码是否经过单独测试都不是一个明显的标准。例如,您将(除非在极少数情况下)不存在像sin(x)这样的存根标准库函数。但是,如果你没有存在不能使你的测试成为集成测试的sin(x)。

什么时候进行集成测试?如果您的测试目标是在集成级别找到错误,那么测试就是集成测试。这意味着,通过集成测试,您需要确定两个(或更多)组件之间的交互是否基于两个(所有)方面的相同假设。

然而,模拟是一种可以与几乎所有类型的测试相结合的正交技术。 (但是,在集成测试中,您无法模拟要测试的交互的合作伙伴 - 但您可以模拟其他组件。)

由于模拟通常会带来一些努力,因此它必须带来好处,例如:

  • 显着加快您的测试速度
  • 测试虽然某些软件部分还没有准备好或有错误
  • 测试难以在集成软件中设置的特殊情况
  • 摆脱时间或随机性等不确定行为
  • ...

但是,如果模拟不能解决实际问题,那么最好直接使用依赖的组件。