我正在重组遗留php项目的测试用例来测试套件,并遇到测试依赖于另一个类的类的问题。这是测试文件夹的原始目录布局。重新组织测试文件的选项,其中一个类依赖于另一个类?
tests/
|
+- models/
| | ClassATest.php
| | ClassBTest.php
| | ...
+- controllers/
| | ...
目前,没有测试套件。每个测试都是分开运行的。
为了重新组织这些测试,我创建了phpunit.xml并将测试分组到如下的套件中。
phpunit.xml
<phpunit bootstrap="...">
<testsuite name="Models">
<directory>./models</directory>
</testsuite>
...
</phpunit>
现在我惹上麻烦。我们有两个模型,ClassA和ClassB,ClassB的方法依赖于ClassA。
class ClassA
{
public function getValue(...)
{
...
}
}
class ClassB
{
public function doSomething()
{
$a = new ClassA();
$x = $a->getValue(...);
// do something with $x
...
}
}
在这里,我想我们都会在测试时看到问题。模拟ClassA :: getValue(),ClassBTest.php已经(重新)定义ClassA,如下所示。
ClassBTest.php
class ClassA
{
public function getValue(...)
{
return 'a mock value';
}
}
class ClassBTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$b = new ClassB();
// Make an assertion with $b->doSomething()
}
}
所以,当我们分别测试每一个模型,它的工作原理。但是,当在套件中运行时,它会导致错误,因为现在ClassA在运行过程的某个点重新声明,并且phpunit被终止。
我的问题是如何处理这种情况。我尝试了一些选择。
- 删除测试文件中的重新定义的类并使用依赖注入。这种方式并不是首选,因为我们不想修改用于依赖注入的模型类。
- 使用组注释来排除这样的测试文件,如ClassBTest.php并单独运行排除的文件。这个选项不方便。
我们可以配置phpunit在一个进程中运行一组文件,在另一个进程中运行另一组文件吗? PHP可以在运行时动态加载和卸载类吗?如果您有其他选择,请提出建议。
谢谢!
谢谢,edorian!与团队讨论使用php扩展和重构模型。可能我们会选择第一个选项。如果phpunit允许我们在单独的进程中运行每组文件,会不会很好?我们是否应该向Sebastian Bergmann提出特征请求;) – peidiam