测试依赖于硬件的Python代码

3
所以我有一些使用gphoto2捕获图像等内容的代码,我认为测试这个的最佳方法是将gphoto2代码包装在类似于if TESTING: then return fake data,否则执行gphoto2操作的东西中。
有人知道我应该如何实现这一点吗?我尝试谷歌了一些东西,但是特别检测单元测试是否正在运行,我没有任何运气。
我会假设它会像if unittest:这样的东西,但也许有更好的方法来做到这一切?
编辑: 基于迄今为止的评论和答案,我尝试了unittest.mock软件包,但它并没有像我希望的那样工作,让我解释一下。
如果我有一个调用捕获图像方法(方法B)然后保存图像和一些其他位的方法A。我已经成功地模拟了方法B,使其返回图像或None,当我专门调用方法B时,它可以很好地工作,但是当我尝试调用方法A时,它不使用方法B的模拟,而是使用实际的方法B。
我怎样才能让方法A使用模拟方法B呢?

2
你的代码中不应该有 if TESTING:,否则你并没有测试实际运行的代码;使用“mocking”创建一个返回虚拟数据的 gphoto2 版本。 - jonrsharpe
“gphoto2” 代码只是你所做的一小部分。测试其他部分。 - Peter Wood
@PeterWood 我的代码使用Django和DRF来接收API请求,然后使用gphoto2来捕获图像,最后返回图像的URL。所以实际上我只需要测试一下gphoto2是否已经返回了图像,然后我的API就会返回一个URL或者400_BAD_REQUEST。因此,没有太多需要测试的内容。全面的场景测试已经证明它完全正常工作,但是我们期望为我们编写的所有代码编写单元测试。 - Cephlin
我应该在实际的捕获图像类中编写模拟代码还是在测试类中编写?文档有点令人困惑... - Cephlin
你的正常代码中不应该包含测试代码。Michael Feathers谈到了“测试接缝”(test seams),即代码中可以拆开并替换为其他内容以进行测试的位置。 - Peter Wood
显示剩余2条评论
2个回答

2

Mock包就是为了这个目的而存在的。

它是一个独立的、可通过pip安装的Python 2包;它已经被纳入Python版本>=3.3的标准库中(作为unittest.mock)。


1
使用测试代码中的模拟库即可。这样,您就可以屏蔽外部API(在您的情况下是硬件调用),并返回可预测的值。我建议使用 flexmock https://pypi.python.org/pypi/flexmock,它非常容易使用。
在测试代码开头,您将编写以下内容: flexmock(SomeObject).should_receive('some_method').and_return('some', 'values')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接