我正在使用 php 来测试我的代码。这是一个例子:
/**
* @covers Calculator::
*/
class CalculatorTest extends PHPUnit_Framework_TestCase {
protected function setUp() { /* ... */ }
/**
* @covers Calculator::add
*/
public function testAddTwoIntegers() { /* ... */ }
/**
* @covers Calculator::multiply
*/
public function testMultiplyTwoIntegers() { /* ... */ }
}
但是,我的代码很复杂,我想摆脱单个测试方法上的@covers。 php 在生成覆盖率报告时如何处理以下类:
/**
* @covers Calculator
*/
class CalculatorTest extends PHPUnit_Framework_TestCase {
protected function setUp() { /* ... */ }
public function testAddTwoIntegers() { /* ... */ }
public function testMultiplyTwoIntegers() { /* ... */ }
}
请注意,类上的 @covers 注释仍然存在,但我已将其从每个方法中删除。
我也可以使用这种方法获得覆盖率报告,但我没有在任何地方看到它的示例,所以我想知道这是否不是正确的用法。
Code Coverage Report:
2016-01-18 08:57:50
Summary:
Classes: 17.67% (56/317)
Methods: 0.33% (5/1520)
Lines: 0.60% (109/18094)
Class1:
Methods: 66.67% ( 2/ 3) Lines: 95.45% ( 21/ 22)
Class2:
Methods: 50.00% ( 3/ 6) Lines: 96.70% ( 88/ 91)
确实,设置不带方法名称的类名是推荐的
@covers
语法。
文档在这里:
https://phpunit.readthedocs.io/en/8.5/annotations.html#covers
Annotation
@covers ClassName::methodName (not recommended)
@covers ClassName (recommended)
@covers ClassName<extended> (not recommended)
@covers ClassName::<public> (not recommended)
@covers ClassName::<protected> (not recommended)
@covers ClassName::<private> (not recommended)
@covers ClassName::<!public> (not recommended)
@covers ClassName::<!protected> (not recommended)
@covers ClassName::<!private> (not recommended)
@covers ::functionName (recommended)
当你问:
php在生成覆盖率报告时如何处理以下类
答案是:在该 TestCase 中的“任何”测试期间执行的
@covers
中提到的类的每一行都将在执行中计算 +1。
如果您进行真正的 TDD 并开始首先编写测试,然后编写课程,这是一个完美的方法。带有分支的公共方法中的某些行将计算 2 次或更多执行,并且可能每个分支内的行将计算 1 次执行。
私有方法也会计算 +n 次执行,虽然您不会为这些方法编写命名测试,但它们将作为公共方法的助手而被调用。
当你说:
但我在任何地方都没有看到过这样的例子
我可以看出,我们 90% 的测试都使用
@covers MyNiceClass
注释,而不指定任何方法。
如果你先从测试开始,通常不会把事情搞砸。如果你“需要”“MyNiceClass”能够得到一些东西,你首先在测试中做
testGetSomething()
并设定一个基本期望,然后你在课堂上写下 public function getSomething()
,你最终会得到一个一对一的结果- 每种方法在 80% 的情况下进行一次测试。其余情况通常是对同一方法进行多次测试,例如 testGetSomething()
(快乐路径)和 testGetSomethingThrowsExceptionWithInvalidParameter()
(悲伤路径)。
是的,您提出的建议是正确的、正常的、通常的,并且这是根据文档推荐的方法。
另一个原因(这就是我的例子中的原因)是没有使用完整的类名,包括命名空间。
// Should be like
@covers \App\Module\MyClass::doSomething
为什么不简单地运行测试用例并查看更改的覆盖率?
来自 PHPUnit 手册:
The @covers annotation (see Table B.1) can be used in the test code to specify
which method(s) a test method wants to test. If provided, only the code
coverage information for the specified method(s) will be considered. Example
11.2 shows an example.