php - 对类使用 @covers

标签 php unit-testing phpunit

我正在使用 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)

当你问:

How does php treat the following class when generating coverage reports



答案是:@covers 中提到的类的每一行在该 TestCase 中的“任何”测试期间执行将在执行中计算 +1。

如果你做真正的 TDD 并开始 第一个 通过编写测试,然后 编写类,这是一个完美的方法。带有分支的公共(public)方法中的某些行将计算 2 次或更多执行,并且每个分支内的行可能会计算 1 次执行。

私有(private)方法也将计算 +n 次执行,虽然您不会为这些方法编写命名测试,但它们将作为公共(public)方法的助手而被调用。

当你说:

but I have not seen an example of it anywhere



我可以说我们 90% 的测试使用 @covers MyNiceClass注释而不指定任何方法。

如果你先从测试开始,你通常不会把事情搞砸。如果你“需要”“MyNiceClass”能够得到一些东西,你可以从做 testGetSomething() 开始。在测试中设置一个基本期望,然后你写public function getSomething()在类里面,你最终会在 80% 的情况下对每种方法进行一对一的测试。其余情况通常是对同一方法的多次测试,例如 testGetSomething() (幸福的道路)和testGetSomethingThrowsExceptionWithInvalidParameter() (悲伤的路径)。

简而言之

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

关于php - 对类使用 @covers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34854482/

相关文章:

php - 无法连接数据库和处理 POST 请求

PHP 编译失败,体系结构 x86_64 的 undefined symbol ,macOS Sierra 上的 libiconv

php - 如何在基于我的数据库的表格中显示结果? PHP 数据库

unit-testing - 使用 Mockery 测试 Laravel Controller 时出现问题 |试图获取非对象的属性

java - 测试 DDS 阅读器接收消息以进行 Java 单元测试

Cygwin 和 PHPUnit : Could not open input file:/cygdrive/c/xampp/php/phpunit

php - 在 laravel 5.4 中测试文件上传时出错

javascript - 如何使用 get 方法来执行 PHP 的不同功能?

python - Pytest:将一个 fixture 传递给另一个

php - Laravel 5.1 测试环境中的 Eloquent 模型事件