使用不同的配置多次运行PHPUnit测试套件


Run several times a PHPUnit test suite with different configurations

我编写了一个Decimal库来执行对大十进制数的计算。该库依赖于Calculator接口,该接口目前有3种实现:

  • GmpCalculator使用GMP扩展;
  • BcMathCalculator使用BC Math扩展;
  • NativeCalculator用于在PHP中执行本地计算。

我的测试套件测试Decimal类本身,而不管使用的Calculator实现:

class DecimalTest extends PHPUnit_Framework_TestCase
{
    public function testPlus() { ... }
    public function testMinus() { ... }
    public function testMultipliedBy() { ... }
    public function testDividedBy() { ... }
}

我想运行整个测试套件3次,每次通过在测试套件运行之前运行一行代码来更改Calculator实现。

这在PHPUnit中是可能的吗?

请注意,这是@dataProvider的一个用例,因为我不想用数据提供程序注释每个测试方法只是为了测试所有的实现,而且我已经在我的测试套件中使用数据提供程序,所以这甚至是不可能的。

选项1:

使DecimalTest抽象,然后为需要测试的每种计算器类型实现一个具体的测试。在每个测试中,我将更改setUp方法,以便使用不同的Calculator实现:

abstract class DecimalTest extends PHPUnit_Framework_TestCase
{
    public final function testPlus() { ... }
    public final function testMinus() { ... }
    public final function testMultipliedBy() { ... }
    public final function testDividedBy() { ... }
}
// define a class for each Calculator type    
class GmpCalculatorDecimalTest extends DecimalTest
{
   public function setUp()
   {
       $this->calculator = new GmpCalculator();
   }
}

选项2:

您还可以定义环境变量来设置将要使用的Calculator实现:

class DecimalTest extends PHPUnit_Framework_TestCase
{
  public function setUp()
  {
      $calculator_class = getenv('CALC_IMPL') ? getenv('CALC_IMPL') : 'GmpCalculator';
      $this->calculator = new $calculator_class();
  }
}

并在执行phpunit之前设置变量:

出口CALC_IMPL = NativeCalculatorphpunit)

我觉得第一个选项更好。