wiki.techinc.nl/includes/composer/ComposerPhpunitXmlCoverageEdit.php
Kosta Harlan fd72f6c48e Provide command to adjust phpunit.xml for code coverage
Our current recommendation for adjusting PHPUnit configuration for
extension code coverage reports is to manually modify
tests/phpunit/suite.xml. This is cumbersome and annoying, since
suite.xml is version controlled.

This patch proposes a composer script to simplify editing
the (non-version controlled) phpunit.xml config in the root of the
MediaWiki repo. It is useful if you are interested in generating
code coverage reports based on unit tests only, not integration tests.

Usage: composer phpunit:coverage-edit -- extensions/GrowthExperiments

When you're done, you can run `rm phpunit.xml` to switch back to the
default phpunit.xml.dist.

The script will use the default includes/src/maintenance directories,
but a future improvement would be to identify the relevant directories
via the AutoloadClasses property of extension.json.

Another improvement would be to provide an option for passing
arbitrary paths in core, in case you are working on tests for a
specific class and want to generate coverage reports instantly.

We could probably also remove
dockerfiles/quibble-coverage/phpunit-suite-edit.py (which inspired
this patch) and use composer phpunit:coverage-edit instead.

Bug: T100294
Change-Id: Ia0ef41f67ca4a64b0d1ca0ddcee488c29630af0b
2019-09-09 14:32:02 +02:00

60 lines
2.4 KiB
PHP

<?php
/**
* 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.
*
*/
/**
* Edit phpunit.xml to speed up code coverage generation.
*
* Usage: composer phpunit:coverage-edit -- extensions/ExtensionName
*
* This class runs *outside* of the normal MediaWiki
* environment and cannot depend upon any MediaWiki
* code.
*/
class ComposerPhpunitXmlCoverageEdit {
public static function onEvent( $event ) {
$IP = dirname( dirname( __DIR__ ) );
// TODO: Support passing arbitrary directories for core (or extensions/skins).
$args = $event->getArguments();
if ( count( $args ) !== 1 ) {
throw new InvalidArgumentException( 'Pass extensions/$extensionName as an argument, ' .
'e.g. "composer phpunit:coverage-edit -- extensions/BoilerPlate"' );
}
$project = current( $args );
$phpunitXml = \PHPUnit\Util\Xml::loadFile( $IP . '/phpunit.xml.dist' );
$whitelist = iterator_to_array( $phpunitXml->getElementsByTagName( 'whitelist' ) );
/** @var DOMNode $childNode */
foreach ( $whitelist as $childNode ) {
$childNode->parentNode->removeChild( $childNode );
}
$whitelistElement = $phpunitXml->createElement( 'whitelist' );
$whitelistElement->setAttribute( 'addUncoveredFilesFromWhitelist', 'false' );
// TODO: Use AutoloadClasses from extension.json to load the relevant directories
foreach ( [ 'includes', 'src', 'maintenance' ] as $dir ) {
$dirElement = $phpunitXml->createElement( 'directory', $project . '/' . $dir );
$dirElement->setAttribute( 'suffix', '.php' );
$whitelistElement->appendChild( $dirElement );
}
$phpunitXml->getElementsByTagName( 'filter' )->item( 0 )
->appendChild( $whitelistElement );
$phpunitXml->formatOutput = true;
$phpunitXml->save( $IP . '/phpunit.xml' );
}
}