gpt4 book ai didi

PHPUnit 严格模式 - setUp() - 覆盖率

转载 作者:IT王子 更新时间:2023-10-29 00:06:01 25 4
gpt4 key购买 nike

当我遇到代码覆盖问题时,我目前开始在 PHPUnit 中使用 strict 模式:

如果我使用setUp-方法创建我的类的新实例,__constructor-方法在我运行测试。

这是我的测试设置:

phpunit.config.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.5/phpunit.xsd"
bootstrap="../vendor/autoload.php"
backupGlobals="false"
backupStaticAttributes="false"
colors="true"
verbose="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTestSize="true"
beStrictAboutTestsThatDoNotTestAnything="true"
beStrictAboutTodoAnnotatedTests="true"

checkForUnintentionallyCoveredCode="true"
processIsolation="false"
>
<testsuites>
<testsuite name="FooTests">
<directory suffix="Test.php">../tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">../src</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="coverage/" higlight="true" showUncoveredFiles="true"></log>
</logging>

Foo.php

class Foo
{

protected $_bar;

public function __construct($bar)
{
$this->_bar=$bar; //Line 10
} //Line 11

public function getBar()
{
return $this->_bar;
}

public function getBar2()
{
return $this->_bar;
}

}

和测试:FooTest.php

class FooTest extends \PHPUnit_Framework_TestCase
{

protected $_foo;

protected function setUp()
{
$this->_foo=new Foo(10);
}

public function testGetBar()
{
$this->assertSame(10, $this->_foo->getBar());
}

/**
* @covers Foo::getBar2
*/
public function testGetBar2()
{
$this->assertSame(10, $this->_foo->getBar2());
}

}

如果我运行测试,我会得到这个结果:

PHPUnit 4.5.0 by Sebastian Bergmann and contributors.

Configuration read from C:\xampp\htdocs\unittest\build\phpunit.config.xml

.R

Time: 88 ms, Memory: 3.50Mb

There was 1 risky test:
1) FooTest::testGetBar2
This test executed code that is not listed as code to be covered or used:
- C:\xampp\htdocs\unittest\src\Foo.php:10
- C:\xampp\htdocs\unittest\src\Foo.php:11

OK, but incomplete, skipped, or risky tests!
Tests: 2, Assertions: 2, Risky: 1.

Generating code coverage report in HTML format ... done

只要我在测试中指定@covers,问题就会出现。

这是预期的行为吗?

我尝试过的一些事情:

  • checkForUnintentionallyCoveredCode 更改为 false 显然有效,但我想使用此功能...
  • 使用 processIsolation="true" 也可以。我不知道为什么?
  • @covers@uses 添加到setUp() 不起作用
  • setUp() 使用的 @covers 添加到测试中确实有效,但测试实际上并未覆盖代码。 (如果测试变得更复杂,这似乎要写很多...)
  • 不同的 phpunit 版本:我用 4.34.5 试过这个,结果相同
  • 不同的 PHP 设置:我在带有 XAMPP 和 LinuxMint 的 Win8 上进行了尝试 - 结果相同

有没有办法从代码覆盖中删除 setUp() 代码,并使用 @covers 用他们实际测试的方法进行测试?

编辑:这也会影响继承。因此,如果 Bar 扩展 Foo,并将参数传递给 Foo::__construct,这也将在代码覆盖范围内 - 这使得编写@covers__construct 带来痛苦**...

附加信息:

PHP 5.6.3 (cli) (built: Nov 12 2014 17:18:08)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans

最佳答案

由于这个问题开始获得一些动力:这是我对这个问题的一种解决方案。

我的 unit-Foo 的测试 (FooTest) 将始终使用 Foo,因此我将 @uses Foo 添加到类中。

如果 protected/private 函数被 public 函数使用,这也很重要,因为否则你必须添加每个和每个 protected/private 函数进行测试,如果该类在内部使用该函数。我什至认为如果你在做单元测试是错误的,因为单元测试不能关心类是如何“填充”的,它应该只断言特定的输入会产生特定的输出。

(另外:构造函数应该只做赋值,没有别的。)

添加@uses后,错误将消失。

(您可以将 @covers Foo::_construct 添加到类中以覆盖构造函数的代码。)

/**
* @uses Foo
* (optional)@covers Foo::__construct
*/
class FooTest extends \PHPUnit_Framework_TestCase
{
protected $_foo;

protected function setUp()
{
$this->_foo=new Foo(10);
}

public function testGetBar()
{
$this->assertSame(10, $this->_foo->getBar());
}

/**
* @covers Foo::getBar2
*/
public function testGetBar2()
{
$this->assertSame(10, $this->_foo->getBar2());
}
}

关于PHPUnit 严格模式 - setUp() - 覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com