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

Ger*_*ard 5 python testing integration-testing unit-testing

因此,我正在尝试决定为我的 Python 项目计划和组织测试套件的方式,但我怀疑何时单元测试不再是单元测试,我很想从社区获得一些反馈。

如果我理解正确:

  • 一个单元测试的测试代码的最小部分,是如果一个函数/方法,做一个且只有一个简单的事情,即使它有几个用例。
  • 一个集成测试测试,你的代码是在同一环境下执行,环境等(但试图保持它的每个集成测试单位minimmum)只能由自己工作得很好,而不是两个或多个单元。

我的疑问是:假设我有一个简单的函数来执行 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
Run Code Online (Sandbox Code Playgroud)

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

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

更新: 测试my_function()将排除对外部源的调用,使其不依赖于网络/数据库/文件系统/等,因此它是隔离的。但事实上,被测试的函数在运行时依赖于外部源,例如,在生产中。

提前致谢!!:)

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

mez*_*oid 1

根据您的更新:

my_function() 的测试将阻止对外部源的调用,以便它不依赖于网络/数据库/文件系统/等,从而使其被隔离。但事实上,正在测试的功能在运行时(例如在生产中)依赖于外部源。

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

根据你原来的问题:

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

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

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

为了使您的示例代码能够正确进行单元测试,您需要模拟对 google.com 的调用。

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