【问题标题】:How do you repeat a test in PHPUnit?如何在 PHPUnit 中重复测试?
【发布时间】:2012-02-28 20:20:09
【问题描述】:

我知道“--repeat”选项,但我更愿意在测试中和每个测试中定义重复。在我的单元测试中,有些测试我不想重复,有些测试我想重复的次数比其他测试更多。

我在想:

protected function tearDown() {
  if (test has not been ran 3 times) {
      $this->runTest(); // Re-run the test
  }
}

这似乎不起作用,$this->run() 也不起作用。我查看了 PHPUnit 源代码,但我不确定。我猜它正在检查测试状态,如果它已经运行,它会拒绝再次运行它。

【问题讨论】:

  • 为什么在单元测试中需要它?哦
  • 这是一个扩展 PHPUnit_Framework_TestCase 的抽象类。目的是为每个测试定义 X 次重复,而不是由 --repeat 表示的全局 X 次重复。
  • 我也想为此找到解决方案。 @Gordon - 我的情况是我正在通过套接字连接(thrift:php)测试服务。测试失败可能只是因为网络过载,这实际上并不意味着 .如果出现超时异常,我想重新运行测试,以便它通过或引发任何其他错误/异常。
  • @tkoomzaaskz 你不能模拟远程端吗?还是增加超时时间?
  • @Gordon 我无法增加超时时间,因为我需要修改外部服务的设置,而我不想这样做。你能解释一下模拟远端是什么意思吗?如果你的意思是我将使用一个模拟对象而不是一个真实的服务,这是不可行的,因为我们正在测试服务和 service-php 通信。所以服务必须是一个真实的实例。

标签: php phpunit


【解决方案1】:

phpunit 在命令行运行器中有一个重复选项。这适用于重复 3 次的测试:

phpunit --repeat 3 myTest.php

【讨论】:

    【解决方案2】:

    这样做有点迂回,但这是我能想到的最干净的方式:

    /**
     * @dataProvider numberOfTests
     */
    public function test()
    {
        // Do your test
    }
    
    public function numberOfTests() 
    {
        for ($i = 0; $i < 100; $i++) {
           yield [];
        }
    }
    

    这样做的好处是每次调用循环都会运行 setUp 和 tearDown 方法。

    【讨论】:

    • 这是一个很好的解决方案,因为每次调用测试用例都会运行 setup teardown 方法
    【解决方案3】:

    除了setUpruntearDown 之外,运行测试还远远不够。一方面,每个测试方法都针对测试用例的新实例运行。不要忘记@dataProvider 和其他注释、代码覆盖率等。你真的不想这样做。

    对于您绝对需要它的少数情况,请在测试方法本身中编写循环代码。

    【讨论】:

      【解决方案4】:

      我认为您需要退后一步,创建一个运行测试的测试!

      您需要一个类似于以下内容的循环:

      $myTest = \my\test\class();
      foreach($iterations){
          $myTest->setup();
          $myTest->doTestyStuff();
          $myTest->tearDown();
      }
      

      您发布的代码将不起作用,因为每个测试都需要运行设置和拆卸每次测试运行时

      【讨论】:

      • 我在 tearDown 中使用了它,因为 tearDown 是在每次测试后运行的。这就是我想创建一个循环的方式。我会通过检查静态迭代器或其他东西来打破循环。你在上面的建议我认为我可以工作,但我正在尝试运行每个测试 X 次,并不是每个测试都需要运行一次以上或相同的次数。
      【解决方案5】:

      这不能通过 do-while 循环来实现吗?

      protected function tearDown() {
          $i = 0;
          do {
              $this->runTest(); // Re-run the test
              $i++;
          } while($i < 3);
      }
      

      【讨论】:

      • 重复不是我的问题,我可以很容易地解决这个问题。就是调用 $test->runTest() 什么都不做。此外,由于在每次测试后都会调用 tearDown,因此假设 $test->runTest() 有效的代码会将其置于无限循环中。
      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 2017-03-05
      • 2013-04-04
      • 2018-04-24
      • 2013-05-04
      • 2018-10-31
      • 2016-04-07
      • 2018-05-12
      相关资源
      最近更新 更多