单元测试应如何与外部资源配合使用?什么是正确的方法?

时间:2013-09-16 08:34:12

标签: python unit-testing

我最近了解了单元测试,并知道您不应该对外部资源进行单元测试。因此,这使我遇到了一个问题,即测试一个我想要重写为单元测试标准的简单函数。

为简单起见,下面是函数的一个例子:

def longTask(somearg):
  # Check somearg

  # Begin infinite loop
    # Check remote resource loop based on somearg

    # Write results to a database or file

    # Check to break loop

  # Cleanup upon end

我想确保上面的代码已经过单元测试(现在我知道了单元测试)。

我的主要困惑来自于如何在您不应该对外部资源进行单元测试时对如何进行外部资源调用的简单函数进行单元测试?

注意:我已经在SO上阅读了有关此内容的其他帖子,但这些帖子没有回答我的问题。

2 个答案:

答案 0 :(得分:4)

My main confusion comes from the fact of how can I unit test 
simple functions that are making external resource
calls when you aren't supposed to unit test external resources?

在这种情况下我通常做的是使用某种类型的模拟。 python有一些优秀的模拟包,例如http://www.voidspace.org.uk/python/mock,它们使得真实对象的测试对象的这种替换变得更加容易

例如

    def test_au(self):
        user_id=124
        def apple(req):
            return 104
        with patch('pyramid.security.authenticated_userid', return_value=user_id
):
            authenticated_userid = apple
            self.assertEqual("104", authenticated_userid(self.request).__str__()
)

patch是从mock导入的方法。它改变了给定范围内其他包的行为。

在此示例中,authenticated_userid的预定义库方法随from pyramid.security import authenticated_userid导入,并在金字塔框架内工作。为了测试它在我的setup函数运行后返回正确的值,我可以在测试期间“覆盖”该方法

答案 1 :(得分:2)

您是否考虑使用类似假对象[1]的内容来测试您的代码。您可以为外部资源和测试提供包装器/接口,使用提供行为的包装器/接口版本来促进测试。

[1] https://en.wikipedia.org/wiki/Mock_object#Mocks.2C_fakes_and_stubs