假设我们有一个使用终端程序转换将图像转换为另一种格式的函数。这是代码:
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 语句来告诉函数为测试做不同的事情可能不是很好我的测试代码没有检测到。
我正在寻找有关如何测试此代码或如何重构它以使其更具可测试性的建议/讨论/提示。我对使用 python 转换图像的更好方法不感兴趣,这个问题纯粹是关于代码可测试性。
所以,如果你可以测试这个功能——你会怎么做?