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
60 lines
2.4 KiB
PHP
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' );
|
|
}
|
|
}
|