wiki.techinc.nl/tests/phpunit/documentation/ReleaseNotesTest.php
Antoine Musso ffc23ee333 test: refactor/speed up release note file test
The test ReleaseNotesTest:testReleaseNotesFilesExistAndAreNotMalformed
takes 4 seconds on my machine. That is due to assertLessThanOrEqual
being invoked for each lines of various files at the root of the
repository. HISTORY has more than 20000 lines and assert functions are
rather slow.

Refactor the test:
* extract the logic to verify the file length of various files to a
  standalone test and with a dataprovider.
* flip the boolean logic ensuring whether the file exists. When it does
  not, PHP emit a warning which breaks the test anyway.
* Check the line lenght and collect errors in an array, then for each
  file run a single assertion to ensure the array of errors is empty.
  That effectively get rid of assertLessThanOrEqual overhead.
* Use assertSame() to show the full faulty line. assertEqual() shorten
  the arrays content.

Running tests went from 4 seconds to 700 ms on my machine.

Bug: T227067
Change-Id: I9bbbc6647ba9732b462e331e4b6d4acffe35e7cd
2019-07-02 12:12:19 +02:00

92 lines
2 KiB
PHP

<?php
/**
* James doesn't like having to manually fix these things.
*/
class ReleaseNotesTest extends MediaWikiTestCase {
/**
* Verify that at least one Release Notes file exists, have content, and
* aren't overly long.
*
* @group documentation
* @coversNothing
*/
public function testReleaseNotesFilesExistAndAreNotMalformed() {
global $wgVersion, $IP;
$notesFiles = glob( "$IP/RELEASE-NOTES-*" );
$this->assertGreaterThanOrEqual(
1,
count( $notesFiles ),
'Repo has at least one Release Notes file.'
);
$versionParts = explode( '.', explode( '-', $wgVersion )[0] );
$this->assertContains(
"$IP/RELEASE-NOTES-$versionParts[0].$versionParts[1]",
$notesFiles,
'Repo has a Release Notes file for the current $wgVersion.'
);
foreach ( $notesFiles as $index => $fileName ) {
$this->assertFileLength( "Release Notes", $fileName );
}
}
public static function provideFilesAtRoot() {
global $IP;
$rootFiles = [
"COPYING",
"FAQ",
"HISTORY",
"INSTALL",
"README",
"SECURITY",
];
$testCases = [];
foreach ( $rootFiles as $rootFile ) {
$testCases["$rootFile file"] = [ "$IP/$rootFile" ];
}
return $testCases;
}
/**
* @dataProvider provideFilesAtRoot
* @coversNothing
*/
public function testRootFilesHaveProperLineLength( $fileName ) {
$this->assertFileLength( "Help", $fileName );
}
private function assertFileLength( $type, $fileName ) {
$lines = file( $fileName, FILE_IGNORE_NEW_LINES );
$this->assertNotFalse(
$lines,
"$type file '$fileName' is inaccessible."
);
$errors = [];
foreach ( $lines as $i => $line ) {
$num = $i + 1;
// FILE_IGNORE_NEW_LINES drops the \n at the EOL, so max length is 80 not 81.
$max_length = 80;
$length = mb_strlen( $line );
if ( $length <= $max_length ) {
continue;
}
$errors[] = "line $num: length $length > $max_length:\n$line";
}
# Using assertSame() to show the full line
$this->assertSame(
[], $errors,
"$type file '$fileName' lines " .
"have at most $max_length characters"
);
}
}