如何在 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_filemove_uploaded_file 无法处理这些欺骗项目,因为它们并不是真正通过POST 上传的。 我做的第一件事是将这些函数包装在我自己的 moveUploadedFileisUploadedFile 的插件中,这样我就可以模拟它们并更改它们的返回值。

最后一件事是在测试时扩展类并覆盖moveUploadedFile 以使用rename 而不是move_uploaded_fileisUploadedFile 以使用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编写图片上传接口并测试

用php如何把一些文件和图片上传到另一指定的服务器

php增删改查实例第二十三节 - PHP文件上传

如何更改文件 mime 类型以绕过 php shell 上传? [关闭]

PHP文件上传代码用法