wiki.techinc.nl/tests/phpunit/MediaWikiCoversValidator.php
Kunal Mehta dafe195c28 Verify that all @covers tags are sane when running tests
PHPUnit only verifies that @covers tags are correct when actually
running coverage - but that's too slow to do on every commit. And if
even a single tag is incorrect, the entire coverage job will fail. It
also has some different requirements compared to normal tags, like all
namespaced classes must use their absolute name. All of those things
combined make it easy for developers to accidentally break the coverage
job.

There are some external tools that also do this, but those tools are
incompatible with our unusual PHPUnit setup (the phpunit.php wrapper
script).

The MediaWikiCoversValidator trait just calls the same method that
PHPUnit does to validate @covers tags. It is implemented as a trait so
that test cases that implement PHPUnit_Framework_TestCase directly can
still use this.

Bug: T171899
Change-Id: I1d564bcae2bfbedb004c440b90db6341148ed4ba
2017-12-29 20:19:12 +00:00

50 lines
1.5 KiB
PHP

<?php
/**
* Copyright (C) 2017 Kunal Mehta <legoktm@member.fsf.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
/**
* Trait that checks that covers tags are valid, since PHPUnit
* won't do it unless you run it with coverage, which is super
* slow.
*
* @since 1.31
*/
trait MediaWikiCoversValidator {
/**
* Test that all methods in this class that begin
* with "test" have valid covers tags.
*/
public function testValidCovers() {
$methods = get_class_methods( $this );
$class = get_class( $this );
$bad = '';
foreach ( $methods as $method ) {
if ( strpos( $method, 'test' ) === 0 ) {
try {
PHPUnit_Util_Test::getLinesToBeCovered( $class, $method );
} catch ( PHPUnit_Framework_CodeCoverageException $e ) {
$bad .= "$class::$method: {$e->getMessage()}\n";
}
}
}
$this->assertEquals( '', $bad );
}
}