unittest适用于Python中的函数(非面向对象)程序吗



我是一名初级程序员,过去一周我一直在努力编写单元测试。我阅读了单元测试文档,并观看了两个关于用Mock实现单元测试的长教程。文档广泛引用了mocking类,但对于函数,我不确定是否应该使用@patch/with patchpatch.dict{}side_effect或其他选项来模拟函数,特别是函数的参数。

mymodule.py

def regex():
'''Runs a regex, creates a dict 'data' and then calls scraper(data)'''
def scraper(data):
'''scrapes a website and then calls a function which submits data to a db'''

我想创建一个测试,将测试数据传递给函数scraper。提前谢谢。

是的,您也可以使用mock对非面向对象的代码进行单元测试。

参见以下示例:

from unittest.mock import MagicMock
def a():
return 10
def b():
print(a())  
b()
a = MagicMock(return_value=3)
b()

输出为:

10
3

在前面的示例中,mock用于伪造/模拟函数a((,因此您可以单独测试函数b((,b((是您的SUT,而无需调用a((的实际实现。这对于更复杂的代码非常有用,特别是当函数a((依赖于在单元测试级别中可能不可用的数据时。

您没有给出足够的例子来真正提供帮助,但有几个观察结果:

  • 通常,最好构建代码以避免在测试中进行嘲讽;在可能的范围内,每个函数都应该是一段独立的代码,可以单独调用。

  • 没有必要嘲笑争论;只需通过.中的测试值

  • 我不确定这个代码的意图:

    bar = {'key': 'value'}     
    def foo(bar):
    pass
    

    在外部级别定义的bar是与函数定义中用作参数的bar完全独立的变量。给他们起相同的名字是令人困惑的。。。

  • 函数可以使用patchpatch.objectreturn_value=...选项进行模拟;不过,这通常意味着需要重构代码,以减少两个函数之间的依赖关系。

最新更新