在单元测试中编写测试用例以进行文件/图像上传

时间:2014-05-13 14:54:59

标签: php unit-testing file-upload image-uploading bulletproof

我正在尝试为我的图片上传库Bulletproof编写测试。

问题是,即使我知道单元测试的基础知识。我写一个文件上传时遇到问题。

就我的经验而言,我只写了非常简单的一些,比如检查HTTP状态对应一些数字,或检查链接/ div存在于某个页面中或断言某些函数或类的结果是类似的等等和这样..

但是通过图片上传,情况完全不同。特别是在这种情况下,该类提供上传,裁剪,调整大小和水印。因此,似乎编写一个自动化测试用例,检查每个图像是否相应地被操作,这对于文件上传来说似乎是不可能的。

我希望有人可以解决这个问题。

2 个答案:

答案 0 :(得分:1)

您可能需要始终牢记的一个有用的启发式方法是:在设计单元测试很困难的时候,大多数情况都是您尝试测试的代码中设计问题的指示。这解决了问题,从测试问题到设计问题。然后,您可以考虑可能违反的设计原则,并指出解决问题的一般策略。

正如您所指出的,Bulletproof类做了很多事情:上传,裁剪,调整大小和水印。它还必须与文件系统,PHP环境,HTTP上下文等进行交互。听起来这个类违反了Uncle Bob's" Single Responsibility Principle":类应该是这样的想法做一件事,或者更确切地说,只有一个改变的理由。

然后,问题的解决方案是将这个大类拆分成一堆较小的类,负责各个功能。这些课程将更小,更容易测试。

例如,您可以提取一个知道如何应用水印的类,另一个知道如何调整图像大小的类等。

要处理外部依赖项,比如文件系统或HTTP上下文,您应用相同的想法(为每个依赖项提取一个类),并为这些定义一个接口(或抽象类),因此您的其他代码不会# 39; t直接依赖于实现,而是通过狭窄,非常特定的接口访问它。然后,在您的测试中,您提供mocks以避免必须处理真实文件,真实HTTP连接等。

答案 1 :(得分:0)

由于这个问题没有得到解答(正确)2年,所以我决定自己回答这个问题,因为从那时起我已经找到了解决方案。

答案结果比我想象的简单,简单地称为“嘲弄”。在这种情况下,在测试文件/图像上载脚本时,没有物理上载图像。所有这些都可以通过重构和隔离负责上传的功能来完成,如...

上传课程示例

class Upload{
    function save(){
        return move_uploaded_file($tmp_name, $destination);
    }
}

对上传课程使用测试的示例

class UploadTest{
    function save(){
        return true; 
    }
}

没有太多内容,因为方法save()不需要进行测试,因为它不再依赖于 用于上传文件/图像的类