如何在PHP中编写文件上传测试?

时间:2010-08-04 05:10:37

标签: php unit-testing upload file-upload simpletest

我正在使用simpleTest来编写我的PHP测试。我正在编写一个文件上传插件,并想知道我是如何测试它的。

我想检查文件是否正确上传,在正确的文件夹中,在需要时正确返回错误等等。

如何模拟文件上传(通过$ _FILES变量)?我应该注意哪些问题?

4 个答案:

答案 0 :(得分:26)

我找到了另一种解决方案。我用测试数据欺骗了$_FILES数组,在tmp/文件夹中创建了虚拟测试文件(该文件夹无关紧要,但我试图坚持使用默认值)。

问题在于,is_uploaded_filemove_uploaded_file无法使用此欺骗项目,因为它们并未真正通过POST上传。 我做的第一件事就是在我的插件中将这些函数包装在我自己的moveUploadedFileisUploadedFile中,这样我就可以模拟它们并改变它们的返回值。

最后一件事是在测试时扩展类并覆盖moveUploadedFile以使用rename代替move_uploaded_fileisUploadedFile来使用file_exists代替is_uploaded_file

答案 1 :(得分:9)

根据文件,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模拟文件系统,因此您甚至不需要实际文件。

答案 2 :(得分:5)

您可以采用编程方式生成文件上传,例如: curl扩展程序。

由于这需要在Web服务器下运行PHP,因此它不是一个单元测试。因此,最好的方法是使用PHPT测试并用数据填充--POST_RAW-- section

如果您不知道要放在--POST_RAW--中的内容,请尝试安装TamperData Firefox扩展程序,从Firefox提交文件,然后从右侧复制粘贴数据。

答案 3 :(得分:-3)

对于单元测试(与功能测试相反),尝试将文件(短文本文件)上传到测试页面,var_dump($_FILES)var_dump($_POST)。然后你知道用它们填充它们(或你的模拟物)的内容。