测试 Python 依赖于硬件的代码
Testing Python code that relies on hardware
所以我有一些代码使用 gphoto2 来捕获一些图像和东西,我想测试这个的最好方法是将 gphoto2 代码包装在类似 if TESTING: then return fake data 的东西中,否则做 gphoto2 的东西。
有谁知道我将如何实现这一点,我尝试使用谷歌搜索一些东西,但我没有运气专门检测单元测试是否 运行。
我假设它会像 if unittest: 但也许有更好的方法来完全做到这一点?
编辑:
所以根据目前的评论和答案,我尝试了 unittest.mock 包,它没有像我希望的那样工作,让我解释一下。
如果我有调用捕获图像方法(方法 B)的方法 A,则保存图像和其他一些位。我已经设法模拟方法 B,以便它 return 是图像或 None,当我专门调用方法 B 时它工作正常,但是当我尝试调用方法 A 时,它不会使用方法B的模拟,它使用实际的方法B.
如何让方法 A 使用模拟方法 B?
只需在测试代码中使用模拟库即可。这样您就可以屏蔽外部 API(在您的情况下是硬件调用)和 return 可预测值。
我会推荐 flexmock https://pypi.python.org/pypi/flexmock 它超级简单。
在测试代码的开头,您将编写如下内容:
flexmock(SomeObject).should_receive('some_method').and_return('some', 'values')
mock 包的存在正是出于这个原因。
它是 Python 2 的独立 pip 可安装包;它已被纳入 Python 版本 >= 3.3(如 unittest.mock
)的标准库中。
所以我有一些代码使用 gphoto2 来捕获一些图像和东西,我想测试这个的最好方法是将 gphoto2 代码包装在类似 if TESTING: then return fake data 的东西中,否则做 gphoto2 的东西。
有谁知道我将如何实现这一点,我尝试使用谷歌搜索一些东西,但我没有运气专门检测单元测试是否 运行。
我假设它会像 if unittest: 但也许有更好的方法来完全做到这一点?
编辑: 所以根据目前的评论和答案,我尝试了 unittest.mock 包,它没有像我希望的那样工作,让我解释一下。
如果我有调用捕获图像方法(方法 B)的方法 A,则保存图像和其他一些位。我已经设法模拟方法 B,以便它 return 是图像或 None,当我专门调用方法 B 时它工作正常,但是当我尝试调用方法 A 时,它不会使用方法B的模拟,它使用实际的方法B.
如何让方法 A 使用模拟方法 B?
只需在测试代码中使用模拟库即可。这样您就可以屏蔽外部 API(在您的情况下是硬件调用)和 return 可预测值。 我会推荐 flexmock https://pypi.python.org/pypi/flexmock 它超级简单。
在测试代码的开头,您将编写如下内容:
flexmock(SomeObject).should_receive('some_method').and_return('some', 'values')
mock 包的存在正是出于这个原因。
它是 Python 2 的独立 pip 可安装包;它已被纳入 Python 版本 >= 3.3(如 unittest.mock
)的标准库中。