Difference between revisions of "Testing"
m (wip) |
|||
Line 9: | Line 9: | ||
==Links== | ==Links== | ||
− | # https://github.com/wikimedia/mediawiki-tools-phan | + | #https://github.com/wikimedia/mediawiki-tools-phan |
− | # https://github.com/phan/phan | + | #https://github.com/phan/phan |
− | # https://www.mediawiki.org/wiki/Continuous_integration/Entry_points | + | #https://www.mediawiki.org/wiki/Continuous_integration/Entry_points |
− | # https://www.mediawiki.org/wiki/Continuous_integration/Phan | + | #https://www.mediawiki.org/wiki/Continuous_integration/Phan |
− | # https://www.mediawiki.org/wiki/Best_practices_for_extensions#File_structure | + | #https://www.mediawiki.org/wiki/Best_practices_for_extensions#File_structure |
− | # https://github.com/nikic/php-ast | + | #https://github.com/nikic/php-ast |
==Static Analysis of MediaWiki== | ==Static Analysis of MediaWiki== | ||
For some current analysis see https://doc.wikimedia.org/mediawiki-core/master/phpmetrics/complexity.html | For some current analysis see https://doc.wikimedia.org/mediawiki-core/master/phpmetrics/complexity.html | ||
− | == PHPStan == | + | The on-wiki documentation and even the upstream projects do not exactly provide a usable guide for '''MediaWiki extension''' developers to actually use Phan. If you download MediaWiki and composer update (to get dev dependencies) and also install PHP-AST, then you should be able to run composer phan or ./vendor/bin/phan -p . But, that analyzes the entire MediaWiki codebase, and does '''not''' analyze your extension (unless you specifically add a proper .phan/config.php file to your extension). |
+ | |||
+ | [[Mark Hershberger]] provides a good example of what that might look like in his CommentStreams configuration<syntaxhighlight lang="php"> | ||
+ | <?php | ||
+ | $cfg = require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php'; | ||
+ | $extensions = [ "Echo", "SocialProfile" ]; | ||
+ | // Assume this extension exists in a directory with a bunch of other extensions that may, or may not be, $IP/extensions | ||
+ | $extDir = realpath( __DIR__ . "/../.." ); | ||
+ | $dirList = array_filter( | ||
+ | array_map( fn ( $dir ): string => "$extDir/$dir", $extensions ), | ||
+ | fn ( $dir ): bool => is_dir( $dir ) | ||
+ | ); | ||
+ | $cfg['directory_list'] = array_merge( $cfg['directory_list'] ?? [], $dirList ); | ||
+ | $cfg['exclude_analysis_directory_list'] = array_merge( | ||
+ | $cfg['exclude_analysis_directory_list'] ?? [], $dirList | ||
+ | ); | ||
+ | $cfg['suppress_issue_types'][] = 'PhanUndeclaredConstant'; | ||
+ | return $cfg; | ||
+ | </syntaxhighlight>the more traditional form of that is<syntaxhighlight lang="php"> | ||
+ | $cfg = require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php'; | ||
+ | |||
+ | $cfg['directory_list'] = array_merge( | ||
+ | $cfg['directory_list'], | ||
+ | [ | ||
+ | '../../extensions/Echo', | ||
+ | '../../extensions/SocialProfile', | ||
+ | ] | ||
+ | ); | ||
+ | $cfg['exclude_analysis_directory_list'] = array_merge( | ||
+ | $cfg['exclude_analysis_directory_list'], | ||
+ | [ | ||
+ | '../../extensions/Echo', | ||
+ | '../../extensions/SocialProfile', | ||
+ | ] | ||
+ | ); | ||
+ | |||
+ | return $cfg; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==PHPStan== | ||
https://phpstan.org/ | https://phpstan.org/ | ||
− | == Psalm == | + | ==Psalm== |
https://psalm.dev/ | https://psalm.dev/ | ||
Revision as of 18:50, 16 February 2024
Testing is software development.
Software development is writing code. Testing makes sure the code actually works, so in a nutshell: Testing is software development :-)
Phan is a static analyzer for PHP. Phan project on GitHub It will help you write better PHP7 code. You'll need the Abstract Syntax Tree generated by PHP. You can read a tutorial for how to get Phan working in your project
The MediaWiki project uses Phan. See the article Continuous_integration/Phan
Links[edit | edit source]
- https://github.com/wikimedia/mediawiki-tools-phan
- https://github.com/phan/phan
- https://www.mediawiki.org/wiki/Continuous_integration/Entry_points
- https://www.mediawiki.org/wiki/Continuous_integration/Phan
- https://www.mediawiki.org/wiki/Best_practices_for_extensions#File_structure
- https://github.com/nikic/php-ast
Static Analysis of MediaWiki[edit | edit source]
For some current analysis see https://doc.wikimedia.org/mediawiki-core/master/phpmetrics/complexity.html
The on-wiki documentation and even the upstream projects do not exactly provide a usable guide for MediaWiki extension developers to actually use Phan. If you download MediaWiki and composer update (to get dev dependencies) and also install PHP-AST, then you should be able to run composer phan or ./vendor/bin/phan -p . But, that analyzes the entire MediaWiki codebase, and does not analyze your extension (unless you specifically add a proper .phan/config.php file to your extension).
Mark Hershberger provides a good example of what that might look like in his CommentStreams configuration
<?php
$cfg = require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php';
$extensions = [ "Echo", "SocialProfile" ];
// Assume this extension exists in a directory with a bunch of other extensions that may, or may not be, $IP/extensions
$extDir = realpath( __DIR__ . "/../.." );
$dirList = array_filter(
array_map( fn ( $dir ): string => "$extDir/$dir", $extensions ),
fn ( $dir ): bool => is_dir( $dir )
);
$cfg['directory_list'] = array_merge( $cfg['directory_list'] ?? [], $dirList );
$cfg['exclude_analysis_directory_list'] = array_merge(
$cfg['exclude_analysis_directory_list'] ?? [], $dirList
);
$cfg['suppress_issue_types'][] = 'PhanUndeclaredConstant';
return $cfg;
the more traditional form of that is
$cfg = require __DIR__ . '/../vendor/mediawiki/mediawiki-phan-config/src/config.php';
$cfg['directory_list'] = array_merge(
$cfg['directory_list'],
[
'../../extensions/Echo',
'../../extensions/SocialProfile',
]
);
$cfg['exclude_analysis_directory_list'] = array_merge(
$cfg['exclude_analysis_directory_list'],
[
'../../extensions/Echo',
'../../extensions/SocialProfile',
]
);
return $cfg;