Python单元测试运行方法直到某一点

时间:2017-10-31 14:18:08

标签: python unit-testing

我很擅长使用Python进行测试,我不确定这是否可行。

我有一个接受输入的相对较长的方法,然后进行一些处理然后将数据发送到API。

我想编写一个测试,将输入的数据发送到测试,对数据运行处理,但不将其发送到API。所以基本上在方法中运行一定量但不到最后。

不幸的是,我甚至不知道从哪里开始,所以我无法提供相关的示例代码 - 它只是一个标准的单元测试,它运行带输入的方法并断言输出。

1 个答案:

答案 0 :(得分:3)

你采取了错误的做法。您要做的是执行与外部API函数调用隔离的测试。只需模拟您的API调用。这意味着,使用模拟方法替换API调用来运行测试。您不需要更改测试中的代码,您可以使用修补程序装饰器将模拟对象替换为API调用。请参阅unittest.mock文档和示例here

unittest.mock非常强大,一开始可能看起来有点令人生畏或者至少有点令人费解。花点时间了解文档中使用模拟可以做的事情。这里有一个非常简单的例子,其中一个可能性(在某些测试代码中):

@patch('myproject.db.api.os.path.exists')
def test_init_db(self, mock_exists):
     ...
     # my mock function call will always returns False
     mock_exists.return_value = False

     # now calls to myproject.db.api.os.path.exists
     # in the code under test act just like the db file does not exist
     ...

因此,您可以轻松绕过外部API调用(所有这些调用或其中一些调用)。如果您不想,则不必指定API结果。模拟表现出“塑性”行为。

如果你创建一个模拟并调用一个你甚至没有定义的任意模拟方法(想想你要隔离的API方法),它将运行正常并只返回另一个模拟对象。也就是说,它什么都不做,但它的客户端代码仍然会像它一样运行。因此,您可以运行测试,实际上禁用所需的部件。