如何在PHPUnit中重复测试?

如何在PHPUnit中重复测试?,php,phpunit,Php,Phpunit,我知道“-repeat”选项,但我宁愿在测试和每个测试中定义重复。在我的单元测试中,有些测试我不想重复,有些测试我比其他测试更想重复 我在想: protected function tearDown() { if (test has not been ran 3 times) { $this->runTest(); // Re-run the test } } 这似乎不起作用,$This->run()也不起作用。我看过PHPUnit的源代码,但我不确定。我猜它正在检查

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

我在想:

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

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

用do-while循环不能实现这一点吗

protected function tearDown() {
    $i = 0;
    do {
        $this->runTest(); // Re-run the test
        $i++;
    } while($i < 3);
}
protectedfunction tearDown(){
$i=0;
做{
$this->runTest();//重新运行测试
$i++;
}而($i<3);
}

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

您需要一个循环,该循环沿着以下路线进行:

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

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

运行测试的内容远不止
setup
run
teardown
。首先,每个测试方法都针对测试用例的一个新实例运行。不要忘记
@dataProvider
和其他注释、代码覆盖率等。您真的不想这样做


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

这是一种迂回的方法,但它是我能想到的最干净的方法:

/**
 * @dataProvider numberOfTests
 */
public function test()
{
    // Do your test
}

public function numberOfTests() 
{
    for ($i = 0; $i < 100; $i++) {
       yield [];
    }
}
/**
*@dataProvider numberOfTests
*/
公共功能测试()
{
//做你的测试
}
公共函数numberOfTests()
{
对于($i=0;$i<100;$i++){
收益率[];
}
}

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

phpunit在命令行运行程序中有一个repeat选项。对于重复3次的测试,其工作原理如下:


phpunit——重复3mytest.php

为什么在单元测试中需要它?OoIt用于扩展PHPUnit_框架_测试用例的抽象类。目的是为每个测试定义X个重复,而不是用--repeat表示的全局X重复。我还想找到一个解决方案@戈登-我的情况是,我正在通过套接字连接(thrift:php)测试一个服务。测试失败可能只是因为网络过载,这实际上并不意味着。如果出现超时异常,我希望重新运行测试,以便测试通过或引发任何其他错误/异常。@tkoomzaaskz您能模拟远程端吗?还是增加超时?@Gordon我不能增加超时,因为我需要修改外部服务的设置,我不想这样做。你能解释一下你嘲笑远端是什么意思吗?如果您的意思是我将使用一个模拟对象而不是一个真正的服务,这是不行的,因为我们正在测试服务和服务php通信。所以这个服务必须是一个真实的实例,我在tearDown中使用了它,因为每次测试后都会运行tearDown。这就是我想创建一个循环的方式。我会通过检查静态迭代器之类的东西来打破循环。你在上面的建议我认为我可以从中工作,但是我尝试运行每个测试X次,并且不是每个测试都需要运行多次或相同的次数。重复不是我的问题,我可以很容易地找到答案。调用$test->runTest()没有任何作用。此外,由于每次测试后都会调用tearDown,因此您的代码假设$test->runTest()工作,则会将其放入一个不确定循环中。这是一个很好的解决方案,因为每次调用testcase时都会运行setup-tearDown方法