【问题标题】:Run several times a PHPUnit test suite with different configurations多次运行具有不同配置的 PHPUnit 测试套件
【发布时间】:2014-05-23 07:35:50
【问题描述】:

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

  • GmpCalculator 使用 GMP 扩展;
  • BcMathCalculator 使用 BC 数学扩展;
  • 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 的一个用例,因为我不想为了测试所有实现而使用数据提供者注释每个测试方法,而且我已经在我的测试套件中使用数据提供者,所以这甚至是不可能的。

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    选项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:

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

    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

    我觉得第一个选项更好。

    【讨论】:

    • 第一个选项也是更好的 IMO!我希望有一个更好的方法涉及 phpunit.xml TBH,但现在我认为你的解决方案已经足够好了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多