Semantic MediaWiki and related extensions
Extension usage

Extensions that want to create their own JSONScript integration tests and have them run against MediaWiki and Semantic MediaWiki can take advantage of the existing SMW test infrastructure for integration tests (script interpreter, assertions validators etc.) by:

Extending the bootstrap

To ensure that relevant classes are registered and available during the test run add the following lines to the PHPUnit bootstrap.php.

if ( !defined( 'SMW_PHPUNIT_AUTOLOADER_FILE' ) || !is_readable( SMW_PHPUNIT_AUTOLOADER_FILE ) ) {
die( "\nThe Semantic MediaWiki test autoloader is not available" );
}
// Obligatory output to inform users about the extension/version used
print sprintf( "\n%-20s%s\n", "MY EXTENSION NAME", MY_EXTENSION_VERSION );
// Load the autoloader file
$autoloader = require SMW_PHPUNIT_AUTOLOADER_FILE;
// Use the autoloader to extend class maps etc.
$autoloader->addPsr4( ... );

Create a test case

Semantic MediaWiki provides two script runners that can be used by extensions:

The JSONScriptServicesTestCaseRunner was introduced to help users to quickly create a custom script runner (e.g. CustomJsonScriptTest) that iterates over the selected test location without much modification to the test itself besides adding the location of the test case folder.

Example

namespace Foo\Tests\Integration;
class CustomJsonScriptTest extends JSONScriptServicesTestCaseRunner {
protected function getTestCaseLocation() {
return __DIR__ . '/TestCases';
}
}

Create integration scenarios

The bootstrap.json contains an example that can be used as starting point for a test scenario. The https://github.com/SemanticMediaWiki/SemanticMediaWiki/tree/master/tests/phpunit/Integration/JSONScript/docs/design.md "design" document holds detail options and usage of assertions methods.

Augment the JSON script

In some cases the selected JSON style may vary or contains information that require additional validation therefore the script runner can easily be extended with something like:

JSON

{
"description": " ... ",
"setup": [
{
"page": "Example/Bootstrap",
"contents": "[[Has example::Example123]]"
}
],
"tests": [
{
"type": "myType",
"about": "...",
"subject": "Example/Bootstrap",
"assert-myType": {}
}
],
"settings": {}
},
"meta": {
"version": "2",
"is-incomplete": false,
"debug": false
}
}

Script runner

namespace Foo\Tests\Integration;
class CustomJsonScriptTest extends JSONScriptServicesTestCaseRunner {
protected function getTestCaseLocation() {
return __DIR__ . '/TestCases';
}
protected function runTestCaseFile( JsonTestCaseFileHandler $jsonTestCaseFileHandler ) {
// Checks environment, runs default assertions
parent::runTestCaseFile( $jsonTestCaseFileHandler );
$this->doRunMyTests( $jsonTestCaseFileHandler );
}
private function doRunMyTests( JsonTestCaseFileHandler $jsonTestCaseFileHandler ) {
$testCases = $jsonTestCaseFileHandler->findTestCasesByType( 'myType' );
if ( $testCases === [] ) {
return;
}
foreach ( $testCases as $case ) {
// Assert
}
}
}

Requirements

Describe methods and classes require SMW 3.1+.


About | General disclaimer | Privacy policy