PHPUnit在配置中传递没有断言的测试

时间:2011-07-12 14:55:29

标签: phpunit

我想要通过测试得到以下内容:“此测试没有执行任何断言”

我知道我可以添加类似assertTrue(true)的内容但是是否可以在配置中添加一些东西以使这些测试通过?

我很确定这只发生在自版本PHPUnit 3.5.0以及引入之后 --strict

8 个答案:

答案 0 :(得分:7)

使用@doesNotPerformAssertions annotation

/**
 * @doesNotPerformAssertions
 */
public function testCodeWithoutUsingAssertions()
{
    // do stuff...
}

答案 1 :(得分:6)

利用$this->addToAssertionCount(1)。见下文。

class NoAssertTest extends PHPUnit_Framework_TestCase
{
    function testWithoutAssertions() {
        $x = 5;

        // Increment the assertion count to signal this test passed.
        // This is important if you use a @depends on this test
        $this->addToAssertionCount(1);
    }
}

答案 2 :(得分:2)

如果你有PHP SimpleTest,另一种方法是使用:

$this->pass();

这将标记测试已完成并通过。

另一方面,对于您想要失败的测试,您可以使用:

$this->fail();

例如:

if (someComplicatedLogicValidation) {
    // Do more stuff and asserts
} else{
    $this->fail();
}

我在PHP 5.5中试过这个并且可以工作:

function testThatWorks() {
    $this->pass();
}

function testThatFails() {
    $this->fail();
}

输出:

  

1)在[... ExampleTest.unit.php第23行]失败       在testThatFails中       在ExampleTest中       in ... / ExampleTest.unit.php   在3.02s中失败

也许方法传递仍然可以在PHPUnit中轻松实现。 SimpleTest的来源:

function pass($message = "Pass") {
    if (! isset($this->reporter)) {
        trigger_error('Can only make assertions within test methods');
    }
    $this->reporter->paintPass(
    $message . $this->getAssertionLine());
    return true;
}

答案 3 :(得分:1)

使用PHPUnit 7.2,您可以获得另一个选择:

public function testCodeWithoutUsingAssertions()
{
    $this->expectNotToPerformAssertions();
    // do stuff...
}

另请参阅https://github.com/sebastianbergmann/phpunit/pull/3042

答案 4 :(得分:0)

就我而言,该测试没有断言,因为我只是使用prophecy lib进行模拟检查所有内容,并检查方法是否按预期方式被调用...

PHPUnit默认情况下期望测试至少具有一个断言,并警告您放置它。

只需在测试的任何部分中添加此行即可。

$this->expectNotToPerformAssertions();

但是您也可以设计一个在某些情况下是否具有断言的测试

public function testCodeNoAssertions()
{
    if ($something === true) {
        $this->expectNotToPerformAssertions();
    }
    // do stuff...

    if ($somethingElse === true) {
    //do any assertion
    }
}

总而言之,这不是错误,而是功能。

答案 5 :(得分:0)

PHPUnit 7.2及更高版本。如果有条件,可以使用 $ this-> expectNotToPerformAssertions(),这可能会禁用断言。似乎它不在官方文档中,但可以在这里找到:https://github.com/sebastianbergmann/phpunit/pull/3042/files

public function testCodeNoAssertions()
{
    $this->expectNotToPerformAssertions();
}

至少PHPUnit 7.0以上。可以使用 @doesNotPerformAssertions 。当前文档未说明添加时间。 https://phpunit.readthedocs.io/en/7.0/annotations.html#doesnotperformassertions

/**
 * @doesNotPerformAssertions
 */
public function testCodeWithoutUsingAssertions()
{

}

如果您的测试只是不完整,则应该使用 $ this-> markTestIncomplete() https://phpunit.readthedocs.io/en/7.0/incomplete-and-skipped-tests.html

public function testCodeThatIsIncomplete()
{
    $this->markTestIncomplete('Implementation of this test is not complete.');
}

如果要暂时禁用测试,请使用 $ this-> markTestSkipped()https://phpunit.readthedocs.io/en/7.0/incomplete-and-skipped-tests.html#skipping-tests

public function testCodeThatIsDisabledTemporarily()
{
    $this->markTestSkipped('This test is disabled to test, if it is interfering with other tests.');
}

答案 6 :(得分:0)

我创建了一个超类并在那里放置了类似 SimpleTest 的函数:

/**
 * Pass a test
 */
public function pass()
{
    //phpunit is missing pass()
    $this->assertTrue(true);
}

然后就可以调用了

$this->pass();

答案 7 :(得分:-1)

以下测试通过PHPUnit 3.5.13传递给我。

class NoAssertTest extends PHPUnit_Framework_TestCase
{
    function testWithoutAssertions() {
        $x = 5;
    }
}

您可以发布您的代码,以便我们自己查看吗?将其编辑为仍然失败的最简单代码。

编辑:如果您将--strict传递给PHPUnit,请不要。此选项的要点是“如果没有断言,则将测试标记为不完整。”