@@ -415,7 +415,7 @@ Modified PHPUnit script
415
415
-----------------------
416
416
417
417
.. versionadded :: 3.2
418
- This modified PHPUnit script was introduced in the 3.2 version of
418
+ This modified PHPUnit script was introduced in the 3.2 version of
419
419
this component.
420
420
421
421
This bridge provides a modified version of PHPUnit that you can call by using
@@ -448,9 +448,117 @@ If you have installed the bridge through Composer, you can run it by calling e.g
448
448
449
449
.. tip ::
450
450
451
- If you still need to use ``prophecy `` (but not ``symfony/yaml ``),
451
+ If you still need to use ``prophecy `` (but not ``symfony/yaml ``),
452
452
then set the ``SYMFONY_PHPUNIT_REMOVE `` env var to ``symfony/yaml ``.
453
453
454
+
455
+ Code coverage listener
456
+ ----------------------
457
+
458
+ Use case
459
+ ~~~~~~~~
460
+
461
+ By default the code coverage is computed with the following rule: If a line of
462
+ code is executed then it is marked as covered. And the test who executes a line
463
+ of code is therefore marked as "covering the line of code".
464
+
465
+ This can be misleading. Considering the following example::
466
+
467
+ class Bar
468
+ {
469
+ public function barZ()
470
+ {
471
+ return 'bar';
472
+ }
473
+ }
474
+
475
+ class Foo
476
+ {
477
+ private $bar;
478
+
479
+ public function __construct(Bar $bar)
480
+ {
481
+ $this->bar = $bar;
482
+ }
483
+
484
+ public function fooZ()
485
+ {
486
+ $this->bar->barZ();
487
+
488
+ return 'bar';
489
+ }
490
+ }
491
+
492
+ class FooTest extends PHPUnit\Framework\TestCase
493
+ {
494
+ public function test()
495
+ {
496
+ $bar = new Bar();
497
+ $foo = new Foo($bar);
498
+
499
+ $this->assertSame('bar', $foo->barZ());
500
+ }
501
+ }
502
+
503
+
504
+ Here the ``FooTest::test `` will execute every lines of code so the code coverage
505
+ will be 100%. But the ``Bar `` class is not tested.
506
+
507
+ The ``CoverageListener `` aim to fix this behavior by adding the ``@covers ``
508
+ annotation on the test class. If an annotation already exist then the listener
509
+ do nothing.
510
+
511
+ By default the listener try to find the tested class by removing the ``Test `` part
512
+ of the classname: ``My\Namespace\Tests\FooTest `` -> ``My\Namespace\Foo ``.
513
+
514
+
515
+ Installation
516
+ ~~~~~~~~~~~~
517
+
518
+ Add the following configuration to the ``phpunit.xml.dist `` file
519
+
520
+ .. code-block :: xml
521
+
522
+ <!-- http://phpunit.de/manual/6.0/en/appendixes.configuration.html -->
523
+ <phpunit xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
524
+ xsi : noNamespaceSchemaLocation =" http://schema.phpunit.de/6.0/phpunit.xsd"
525
+ >
526
+
527
+ <!-- ... -->
528
+
529
+ <listeners >
530
+ <listener class =" Symfony\Bridge\PhpUnit\CoverageListener" />
531
+ </listeners >
532
+ </phpunit >
533
+
534
+ You can also configure a new System Under Test solver:
535
+
536
+ .. code-block :: xml
537
+
538
+ <listeners>
539
+ <listener class="Symfony\B ridge\P hpUnit\C overageListener">
540
+ <arguments>
541
+ <string>My\N amespace\S utSolver::solve</string>
542
+ </arguments>
543
+ </listener>
544
+ </listeners>
545
+
546
+ The ``My\Namespace\SutSolver::solve `` should be a callable and will receive the
547
+ current test classname as first argument.
548
+
549
+ Finally the listener can add warning when the SUT solver does not find the SUT:
550
+
551
+ .. code-block :: xml
552
+
553
+ <listeners>
554
+ <listener class="Symfony\B ridge\P hpUnit\C overageListener">
555
+ <arguments>
556
+ <null/>
557
+ <boolean>true</boolean>
558
+ </arguments>
559
+ </listener>
560
+ </listeners>
561
+
454
562
.. _PHPUnit : https://phpunit.de
455
563
.. _`PHPUnit event listener` : https://phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.PHPUnit_Framework_TestListener
456
564
.. _`PHPUnit's assertStringMatchesFormat()` : https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertStringMatchesFormat
0 commit comments