【发布时间】:2013-07-03 19:25:40
【问题描述】:
假设我们有一个使用终端程序转换将图像转换为另一种格式的函数。代码如下:
def convert_image(src, dest=None, extension='jpg', quality=100):
# Create default destination - same path just different extension
if dest is None:
dest = src.split('.')[0] + '.' + extension
try:
subprocess.check_call(['convert', src, '-quality', quality, dest])
except CalledProcessError:
raise ImageException('convert', 'Could not convert image')
return dest
现在我想测试这个函数以验证它是否按预期工作。
最直接的方法可能是只进行单元测试,提供真实图像的路径,并验证是否使用正确的扩展名创建了新图像。但问题是,很难知道创建的图像是否真的是在质量设置为正确值的情况下创建的,而且在测试函数中实际转换真实图像有点尴尬。
如果我这样调用函数:
convert_image('/tmp/myimage.png')
我现在真正感兴趣的是它从这个输入将这个数组作为输入发送到 check_call:
['convert', '/tmp/myimage.png', '-quality', 100, '/tmp/myimage.jpg']
如果是这样,那么我知道该函数针对这种特殊情况做了正确的事情。
因此,如果用于测试目的的函数在我测试时实际上只返回此数组,并且仅在我运行真实程序时转换图像,那将很方便。
但是在所有函数中都有 if 语句来告诉函数为测试做不同的事情可能不是很好,如果我从来没有真正为我的测试函数使用 check_call,那么我什至可能在我的测试代码没有检测到那个代码。
我正在寻找有关如何测试此代码或如何重构它以使其更具可测试性的建议/讨论/提示。我对使用 python 转换图像的更好方法不感兴趣,这个问题纯粹是关于代码可测试性。
那么,如果你可以测试这个功能 - 你会怎么做?
【问题讨论】:
-
你能模拟对 subprocess.check_call 的调用吗?该函数应该采用您传递的值并在通过或失败时返回有意义的值? theblobshop.com/pymock
-
是的,我可以。这绝对是一个合理的解决方案。
标签: python unit-testing testing testability