运行几次具有不同配置的PHPUnit测试套件

时间:2014-05-23 07:35:51

标签: php phpunit

我写了一个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 个答案:

答案 0 :(得分:0)

选项1:

制作DecimalTest摘要,然后为需要测试的每种类型的Calcultator实施具体测试。在每个测试中,我将更改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 = NativeCalculator phpunit

我觉得第一种选择更好。