Průběžná integrace/vstupní body
Pro testování našeho kódu jsme standardizovali následující nástroje:
Jazyk | Příkazový řádek | Linting | Styl kódu | Statická analýza | Testy jednotek | Dokumentace |
---|---|---|---|---|---|---|
PHP | composer | php-parallel-lint
|
PHP CodeSniffer s mediawiki-tools-codesniffer | Phan s mediawiki-phan-config | PHPUnit | Doxygen |
JavaScript | npm & grunt | grunt-eslint s eslint-config-wikimedia | grunt-eslint s eslint-config-wikimedia | QUnit | JSDoc | |
JSON | N/A | json-schema | N/A | N/A | ||
i18n | grunt-banana-checker | N/A | N/A | N/A | Dokumentace lokalizačních zpráv | |
CSS/LESS | grunt-stylelint s stylelint-config-wikimedia | N/A | N/A | N/A | ||
Java | maven wrapper (maven) | ? | ? | ? | ? | ? |
Python | tox | flake8 | unittest
pytest[1] |
sphinx? | ||
Ruby | bundler | rubocop | ? | rake test | ? |
Dokumentaci o konfiguraci a nastavení těchto nástrojů naleznete níže.
JavaScript
Testování JavaScriptu
Jako vstupní bod používáme npm test
.
Pokud váš projekt obsahuje nějaké soubory JavaScriptu, měl by mít alespoň soubor package.json
, který definuje skript test
, a související soubor package-lock.json
, aby byla zajištěna konzistence běhů CI a upgradů zabezpečení.
U rozšíření a vzhledů MediaWiki by neměl skript npm test
spouštět projektové testy, pouze linters.
Cokoli jiného než linters (např. testy jednotky/integrace) se spouští přes normální kanály MediaWiki. Pokud chcete samostatný běžec, měli byste to dát do jiného skriptu.
Ve svém projektu budete potřebovat konfigurační soubor .eslintrc.json
(viz P59ru4ka:Kódovací konvence/JavaScript#Linting).
Podívejte se na jeden z projektů uvedených v příklad sekce níže, kde najdete příklad těchto souborů.
npm
s "node: No such file or directory" (uzel: žádný takový soubor nebo adresář), možná budete muset nainstalovat balíček "nodejs-legacy
".
Spouštěč úlohy Grunt
Pokud má váš projekt složité procesy sestavování nebo se jedná o rozšíření či vzhled, který bude těžit z kontroly i18n a lintingu souborů JSON, je konvencí používat Grunt jako spouštěče úloh.
Váš projekt má stále soubor package.json
, který je závislý na grunt
a nastavuje "test": "grunt test"
.
Soubor Gruntfile.js
zase implementuje grunt test
, což může spouštět širokou škálu nástrojů a testů:
eslint
, který kontroluje soubory JS i JSON.stylelint
, který kontroluje soubory CSS i LESS.banana-checker
, který kontroluje zprávy v souborech MediaWiki i18n.
Nastavení konfigurace pro tyto nástroje můžete zadat v Gruntfile.js
.
Měl by však obsahovat malou nebo žádnou konfiguraci pro nástroje, které mohou běžet mimo grunt
, aby fungovaly stejně, když jsou spuštěny samostatně nebo z pluginu textového editoru.
Vždy používejte nativní konfigurační soubory, kde je to možné, včetně výše uvedeného .eslintrc.json
.
Dokumentace JavaScriptu
Jako vstupní bod použijte npm run doc
.
Konvencí je používat JSDoc .
Skriptové háčky predoc
a postdoc
v package.json
lze použít ke spuštění jakýchkoli dalších skriptů (např. sestavení souborů pro zahrnutí předem nebo zkopírování dalších souborů pro pozdější publikování).
Příklady
Pokročilé nastavení pomocí Grunt
package.json
{
"private": true,
"scripts": {
"test": "grunt test"
},
"devDependencies": {
"eslint-config-wikimedia": "0.15.0",
"grunt": "1.0.4",
"grunt-banana-checker": "0.8.1",
"grunt-eslint": "22.0.0",
"grunt-stylelint": "0.12.0",
"stylelint-config-wikimedia": "0.7.0"
}
}
Gruntfile.js
/* eslint-env node, es6 */
module.exports = function ( grunt ) {
grunt.loadNpmTasks( 'grunt-banana-checker' );
grunt.loadNpmTasks( 'grunt-eslint' );
grunt.loadNpmTasks( 'grunt-stylelint' );
grunt.initConfig( {
eslint: {
options: {
extensions: [ '.js', '.json' ],
cache: true
},
all: [
'**/*.{js,json}',
'!{vendor,node_modules}/**'
]
},
stylelint: {
all: [
'**/*.{css,less}',
'!{vendor,node_modules}/**'
]
},
banana: {
all: 'i18n/'
}
} );
grunt.registerTask( 'test', [ 'eslint', 'stylelint', 'banana' ] );
grunt.registerTask( 'default', 'test' );
};
Příklady projektů
- Extension:BoilerPlate má
Gruntfile.js
, na kterém běží jshint, jscs a banana-checker (pro soubory JSON MediaWikii18n
). - jquery-client: package.json (jshint, jscs, karma; není potřeba Grunt)
- CSSJanus: package.json / Gruntfile.js (jshint, jscs, vlastní test)
- TemplateData: package.json / Gruntfile.js (jshint, jscs, banana-checker)
Další čtení
- [formát https://docs.npmjs.com/files/package.json package.json] na docs.npmjs.org
- [životní cyklus "scriptů" balíčku https://docs.npmjs.com/misc/scripts] na docs.npmjs.org
PHP
- Použijte rozšíření BoilerPlate jako výchozí bod pro nové rozšíření MediaWiki.
- K vytvoření nové knihovny PHP použijte mediawiki-tools-cookiecutter-library.
Testování PHP
Jako vstupní bod používáme composer test
.
Pokud váš projekt obsahuje soubory PHP, měl by uvést potřebné balíčky testovacího rámce v composer.json
pod require-dev
a uvést příkazy, které mají být spuštěny, ve vlastnosti scripts.test
:
{
"require-dev": {
"mediawiki/mediawiki-codesniffer": "44.0.0",
"mediawiki/mediawiki-phan-config": "0.14.0",
"mediawiki/minus-x": "1.1.3",
"ockcyp/covers-validator": "1.6.0",
"php-parallel-lint/php-console-highlighter": "1.0.0",
"php-parallel-lint/php-parallel-lint": "1.4.0",
"phpunit/phpunit": "9.6.16"
},
"scripts": {
"test": [
"parallel-lint . --exclude vendor --exclude node_modules",
"php -d 'extension=pcov.so' vendor/bin/phpunit",
"covers-validator",
"phpcs -sp",
"phan --allow-polyfill-parser --long-progress-bar",
"minus-x check ."
],
"fix": [
"minus-x fix .",
"phpcbf"
]
},
"config": {
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
}
Více vám řekne composer.json projektu cdb jako dobrý příklad.
Všimněte si, že Rozšíření MediaWiki nejsou samostatné projekty a nemohou spouštět vlastní testovací sadu PHPUnit od skladatele.
Tato úložiště mají samostatnou úlohu mediawiki-extensions
.
PHPCS a PHP lint stále běží přes composer.json
a composer test
:
{
"require-dev": {
"mediawiki/mediawiki-codesniffer": "44.0.0",
"mediawiki/mediawiki-phan-config": "0.14.0",
"mediawiki/minus-x": "1.1.3",
"php-parallel-lint/php-console-highlighter": "1.0.0",
"php-parallel-lint/php-parallel-lint": "1.4.0"
},
"scripts": {
"test": [
"parallel-lint . --exclude vendor --exclude node_modules",
"phpcs -sp --cache",
"minus-x check ."
],
"fix": [
"minus-x fix .",
"phpcbf"
],
"phan": "phan -d . --long-progress-bar"
},
"config": {
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
}
}
}
Více vám řekne composer.json rozšíření AbuseFilter MediaWiki jako dobrý příklad.
Dokumentace PHP
Viz: Doxygen .
Pomocí programu doxygen vygenerujte soubor Doxyfile
v kořenovém adresáři projektu.
Testování Pythonu
Viz Nepřetržitá integrace/Výukové programy/Otestujte svého pythona.
Ruby
Rake
Pomocí Rake definujte své příkazy, budou prováděny prostřednictvím Bundleru.
Příklad Rakefile
:
require 'bundler/setup'
require 'rubocop/rake_task'
RuboCop::RakeTask.new(:rubocop) do |task|
# pokud použijete mediawiki-vagrant, rubocop bude ve výchozím nastavení používat .rubocop.yml
# další řádek jasně uvádí, že chcete z adresáře .rubocop.yml
# kde se provede 'bundle exec rake'
task.options = ['-c', '.rubocop.yml']
end
require 'mediawiki_selenium/rake_task'
MediawikiSelenium::RakeTask.new
task default: [:test]
desc 'Run all build/tests commands (CI entry point)'
task test: [:rubocop]
Výše uvedený kód vytvoří následující cíle Rake.
$ bundle exec rake -T rake rubocop # Spusťte RuboCop rake rubocop:auto_correct # Automatická oprava přestupků RuboCop rake selenium # Spusťte funkce Cucumber rake test # Spustit všechny příkazy sestavení/testy (vstupní bod CI)
Jenkinsova úloha rake-jessie
vyvolá cíl test
spuštěním bundle exec rake test
.
Odkaz: phab:T104024
ladicí tip ruby
Můžete použít gem pry
k přerušení chyby a zobrazení konzole v kontextu selhání.
Ke svému Gemfile přidejte gem 'pry'
a poté prolomte:
require 'pry'
binding.pry
your call that fail
Poté budete v konzoli před rozbitím, které vám umožní prohlédnout si prostředí (1 $). Podrobnosti viz https://github.com/pry/pry.
ci.yml
Máme sadu úloh Jenkins, které běží denně a provádějí testy Ruby + Selenium .
Úlohy se jmenují selenium*
.
Každé úložiště má v Jenkins definováno pouze jednu úlohu.
Jedná se o více konfigurační úlohu, která vytváří jednu nebo více podřízených úloh na základě konfigurace v každém úložišti: tests/browser/ci.yml
.
Hlavní úloha pak vytvoří podřízené úlohy na základě jejího obsahu.
Příklad jednoduchého ci.yml
je v mediawiki/core
.
BROWSER:
- firefox
MEDIAWIKI_ENVIRONMENT:
- beta
PLATFORM:
- Linux
Jak vidíte, existují tři proměnné, BROWSER
, MEDIAWIKI_ENVIRONMENT
a PLATFORM
.
BROWSER
a PLATFORM
může být jakákoli platná [kombinace https://saucelabs.com/platforms/ Sauce Labs prohlížeč/OS/verze].
MEDIAWIKI_ENVIRONMENT
může mít hodnoty beta
, mediawiki
a test
nebo jakékoli jiné prostředí nakonfigurované v environments.yml
.
Například:
BROWSER:
- chrome
- firefox
- internet_explorer 9.0
- safari
MEDIAWIKI_ENVIRONMENT:
- beta
- mediawiki
- test
PLATFORM:
- Linux
- OS X 10.9
- Windows 8.1
Příklad komplikované ci.yml
je v mediawiki/extensions/MultimediaViewer
.
Další informace viz Jenkins Yaml Axis Plugin.
Odkaz: phab:T128190