【问题标题】:Writing test cases in unit-testing for file/image uploads在文件/图像上传的单元测试中编写测试用例
【发布时间】:2014-05-13 14:54:59
【问题描述】:

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

问题在于,即使我知道单元测试的基础知识。我在为文件上传编写文件时遇到问题。

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

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

我希望任何人都可以对这个问题有所了解。

【问题讨论】:

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


    【解决方案1】:

    您可能需要始终牢记的一个有用的启发式方法是:当设计单元测试很困难时,大多数时候这表明您尝试测试的代码中存在设计问题。这将问题从测试问题转变为设计问题。然后,您可以考虑可能被违反的设计原则,这些原则可以表明解决这种情况的一般策略。

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

    因此,您的问题的解决方案是将这个大类分解为一组负责各个功能的较小类。这些类将更小,更易于测试。

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

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

    【讨论】:

    • 是的。几个月前我remember talking about SRP。最终,我将实施这些约定/最佳实践。但是,这个答案仍然没有解决问题中的问题。
    • 好的,简短的回答是:您需要将您的大班分解为较小的合作者(每个责任一个,或者可能更多),并单独测试它们。另外,将外部依赖项(如文件系统)移动到隐藏在接口后面的类中,在单元测试中模拟它们。
    • 我确定您指的是something like this,但仍然如此。这并没有利用编写测试用例的复杂问题。
    【解决方案2】:

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

    答案比我想象的要简单,这就是所谓的“嘲笑”。在这种情况下,在测试文件/图像上传脚本时,没有物理上传图像。一切都可以通过重构和隔离负责上传的函数来完成,如..

    上传类示例

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

    上传类使用测试示例

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

    这没什么,因为方法 save() 不需要测试,因为它不再依赖于 上传文件/图像的类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2019-10-21
      • 2015-08-31
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      相关资源
      最近更新 更多