在课程中使用@covers

问题描述 投票:0回答:3

我正在使用 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)
php unit-testing phpunit
3个回答
4
投票

确实,设置不带方法名称的类名是推荐的

@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()
(悲伤路径)。

简而言之

是的,您提出的建议是正确的、正常的、通常的,并且这是根据文档推荐的方法。


1
投票

另一个原因(这就是我的例子中的原因)是没有使用完整的类名,包括命名空间。

// Should be like
@covers \App\Module\MyClass::doSomething

0
投票

为什么不简单地运行测试用例并查看更改的覆盖率?

来自 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.

上面引用的表 B1

© www.soinside.com 2019 - 2024. All rights reserved.