关于php:PHPUnit测试的目录布局?

关于php:PHPUnit测试的目录布局?

Directory layout for PHPUnit tests?

我是从事PHP项目的长期Java程序员,并且正在尝试使PHPUnit正常工作。 使用Java进行单元测试时,通常将测试用例类和常规类放在单独的目录中,如下所示-

1
2
3
4
5
/src  
  MyClass.java

/test  
  MyClassTest.java

等等。

使用PHPUnit进行单元测试时,遵循相同的目录结构是常见的做法,还是有更好的方法来布置测试类? 到目前为止,我可以使" include(" MyClass.php")"语句正常工作的唯一方法是将测试类包含在同一目录中,但是当我按入时,我不想包含测试类。 生产。


我认为将文件分开是个好主意。我通常使用这样的文件夹结构:

1
2
3
/myapp/src/        <- my classes
/myapp/tests/       <- my tests for the classes
/myapp/public/      <- document root

在您的情况下,为什么要将类包含在测试文件中,为什么不将整个路径传递给include方法呢?

1
include('/path/to/myapp/src/MyClass.php');

要么

1
include('../src/MyClass.php');

您需要修改PHP的include_path,以便在单元测试中include()时知道在哪里可以找到MyClass.php。

在测试文件的顶部(包含之前),您可能会有类似的内容:

1
2
3
<wyn>
set_include_path(get_include_path() . PATH_SEPARATOR ."../src");
</wyn>

这会将您的src目录追加到包含路径上,并应允许您将实际代码与测试代码分开。


根据我的经验,布莱恩·菲利普斯(Brian Phillips)的回答还远远不够。当您由PHPUnit运行测试时,您不知道当前目录是什么。因此,您需要在set_include_path()表达式中引用测试类文件的绝对路径。像这样:

1
2
set_include_path(get_include_path() . PATH_SEPARATOR .
                        dirname(__FILE__) ."/../src");

可以将此片段放在其自己的头文件SetupIncludePath.php中,并使用" require_once"将其包含在测试文件中,以便测试套件不会多次追加路径。


我将测试用例放在源的旁边,并放在一个具有相同名称但扩展名为.phpt的文件中。部署脚本在推入生产时仅过滤掉* .phpt。


推荐阅读