unittest是否适用于Python中的功能(非面向对象)程序?

2024-04-26 13:55:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个初学者程序员,在过去的一周里,我一直在尝试编写单元测试。我通读了单元测试文档,并观看了两个关于使用Mock实现单元测试的长教程。文档广泛地引用了模拟类,但对于函数,我不确定是否应该使用@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。先谢谢你


Tags: and函数文档datadef单元测试scrapermock
2条回答

是的,您还可以使用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()依赖于单元测试级别可能不可用的数据时

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

  • 一般来说,最好对代码进行结构化,以避免在测试中进行模拟;在可能的范围内,每个函数都应该是一段独立的代码,可以单独调用

  • 没有必要嘲笑争论;只需将测试值传入即可

  • 我不确定此代码的用途:

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

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

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

相关问题 更多 >