如何在 PHP 中编写文件上传测试?
Posted
技术标签:
【中文标题】如何在 PHP 中编写文件上传测试?【英文标题】:How can I write tests for file upload in PHP? 【发布时间】:2011-03-25 02:01:49 【问题描述】:我正在使用 simpleTest 编写我的 php 测试。我正在编写一个文件上传插件,想知道如何测试它。
我想检查文件是否正确上传,在正确的文件夹中,是否在需要时正确返回错误等。
如何模拟文件上传(通过 $_FILES 变量)?有什么我应该注意的问题吗?
【问题讨论】:
【参考方案1】:您可以以编程方式生成文件上传,例如curl 扩展名。
因为这需要在 Web 服务器下运行 PHP,所以它不是一个单元测试。因此,最好的方法是使用 PHPT 测试并用数据填充 --POST_RAW--
section。
如果您不知道在--POST_RAW--
中添加什么,请尝试安装 TamperData Firefox 扩展,从 Firefox 提交文件,然后从右侧复制粘贴数据。
【讨论】:
如您所说,cURL 不太适合单元测试。我阅读了 PHPT 文档,我认为这可能是更好的解决方案。不幸的是我没有设法让它工作......我终于找到了另一个解决方案(见我的答案) 我也尝试过使用 PHPT 和 --POST_RAW-- 但也无法让它工作,如此处所述:***.com/questions/4974727/…【参考方案2】:根据文档,SimpleTest has support for FileUpload testing baked in since version 1.0.1:
File upload testing Can simulate the input type file tag 1.0.1
我查看了他们网站上的示例,并假设您会使用类似于
的内容$this->get('http://www.example.com/');
$this->setField('filename', 'local path');
$this->click('Go');
提交文件,然后使用常规断言检查上传是否按要求进行。但这真的只是一个疯狂的猜测,因为我不熟悉 SimpleTest,而且我在他们的主页上找不到示例。你可能想ask in their support forum though.
但基本上,表单上传文件的测试并没有多大用处。这是久经考验的浏览器行为。测试处理上传的代码更有意义。我不知道您是如何实现 FileUpload 代码的,但如果我必须实现它,我会首先摆脱对 $_FILES
数组的依赖。创建一个FileRequest
类,您可以将$_FILES
数组传递给该类。然后,您可以处理班级上传。这将允许您在不实际上传文件的情况下测试功能。只需相应地设置您的 FileRequest 实例。您甚至可以使用vfsStreamWrapper 模拟文件系统,因此您甚至不需要实际文件。
【讨论】:
我希望能够只测试我插件的一小部分。做一个完整的获取请求不会得到我需要的详细程度。【参考方案3】:我找到了替代解决方案。我用测试数据欺骗了$_FILES
数组,在tmp/
文件夹中创建了虚拟测试文件(该文件夹无关紧要,但我试图坚持使用默认值)。
问题在于is_uploaded_file
和move_uploaded_file
无法处理这些欺骗项目,因为它们并不是真正通过POST
上传的。
我做的第一件事是将这些函数包装在我自己的 moveUploadedFile
和 isUploadedFile
的插件中,这样我就可以模拟它们并更改它们的返回值。
最后一件事是在测试时扩展类并覆盖moveUploadedFile
以使用rename
而不是move_uploaded_file
和isUploadedFile
以使用file_exists
而不是is_uploaded_file
。
【讨论】:
用如何模拟 move_uploaded_file 中文件的移动来扩展这个答案会很有帮助。 @pixelastic 你有没有机会向我们展示你的代码? 不幸的是,这个问题已经超过 7 年了,我无法再访问这段代码了(另外,从那时起有很多主要的 PHP 版本,我不认为我的代码仍然可以工作)。【参考方案4】:对于单元测试(相对于功能测试),请尝试将文件(短文本文件)上传到测试页面,以及 var_dump($_FILES)
和 var_dump($_POST)
。然后你知道用什么填充它们(或你的模拟)。
【讨论】:
is_uploaded_file 仍然会失败以上是关于如何在 PHP 中编写文件上传测试?的主要内容,如果未能解决你的问题,请参考以下文章
玩 2.4:如何使用 MultipartFormData 编写文件上传测试用例
Django REST framework编写图片上传接口并测试