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

标签 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() 的测试将停止对外部源的调用,因此它不依赖于网络/数据库/文件系统/等,因此它是孤立的。但事实是,正在测试的功能在运行时依赖于外部资源,例如在生产中。

提前致谢!! :)

P.S.:当然,也许我没有理解单元和集成测试的 100% 目的,所以,如果我弄错了,请指出我在哪里,我将不胜感激。

最佳答案

根据您的更新:

The test for my_function() would stub out calls to the external source so that it doesn't depend on network/db/filesystem/etc so that it's isolated. But the fact that the function that is being tested depends on external sources when running, for example, in production.

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

根据您最初的问题:

Given that this function is requesting information from an external source, when you write a test for it, can you still consider such test a Unit test?

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

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

为了让您的示例代码得到正确的单元测试,您需要模拟对 google.com 的调用。

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

关于python - 确定测试是单元测试还是集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23819795/

相关文章:

python - numpy 填充序列而不是常量值

python - 用户模型的外键未按预期工作

java - hamcrest - 比较集合中的项目

unit-testing - 如何模拟第三方包的方法

ruby-on-rails - 我对用于测试 Rails 应用程序的工具数量感到不知所措,我应该从哪里开始?

python - Pandas Dataframe 删除具有特定值的行,直到该值更改

python - Pyspark 以混合条件加入

java - 如何简化测试?

使用测试工具调试 Forth

unit-testing - 如何测试一个 React 组件是否包含另一个带有 Tape 和 Enzyme 的组件?