所以我试图决定为我的python项目规划和组织测试套件的方法,但我怀疑单元测试何时不再是单元测试,我希望得到一些反馈来自社区。 p>
如果我理解正确:
我的疑问是:说我有一个执行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;我会很感激。
答案 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)。
什么时候进行集成测试?如果您的测试目标是在集成级别找到错误,那么测试就是集成测试。这意味着,通过集成测试,您需要确定两个(或更多)组件之间的交互是否基于两个(所有)方面的相同假设。
然而,模拟是一种可以与几乎所有类型的测试相结合的正交技术。 (但是,在集成测试中,您无法模拟要测试的交互的合作伙伴 - 但您可以模拟其他组件。)由于模拟通常会带来一些努力,因此它必须带来好处,例如:
但是,如果模拟不能解决实际问题,那么最好直接使用依赖的组件。