Я использую Laravel 5.3 и, к сожалению, когда вы запускаете gulp tdd
изменение в 1 файл запускает весь набор тестов, который теперь занимает почти 2 минуты. В отношении эта почта, Я начал использовать хрюкать запускать определенные тесты при изменении определенных файлов. Образец Gruntfile ниже:
Gruntfile.js:
var phpunit = 'vendor/bin/phpunit ';
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
HomeSrc: {
files: [
'app/Http/**/HomeController.php',
'resources/views/home/**/*.php'
],
tasks: ['HomeTests']
},
shell: {
HomeTests: { command: phpunit + 'tests/Home' },
}
});
Однако, теперь мой Gruntfile становится довольно длинным, и я хотел бы запускать определенные тестовые файлы, когда они меняются.
Вопросы
Пример:
когда tests/Home/IndexTest.php
изменено, автоматически запускается vendor/bin/phpunit tests/Home/IndexTest.php
Хорошо, чтобы справиться с этим, вам нужно поймать совпадающее имя файла и динамически установить переменную для использования в качестве файла модульного теста. Это должно охватывать все основные сопоставления, где имя тестового класса точно совпадает с именем файла, в котором оно находится, и поддерживает пространства имен, поэтому не все тестовые файлы с одинаковым именем класса будут выбраны фильтром.
Пример:
grunt.initConfig({
// .. snipped ..
unitTestFile: 'to_be_replaced',
watch: {
php: {
files: ["tests/**/*.php"],
tasks: ["shell:unitTest"],
options: {
spawn: false
}
}
},
shell: {
unitTest: {
command: "phpunit --filter <%= unitTestFile %>"}
}
grunt.loadNpmTasks('grunt-shell');
grunt.event.on('watch', function (action, filepath) {
if (grunt.file.isMatch(grunt.config('watch.php.files'), filepath)) {
var testFile = filepath.replace(/\\/g, '\\\\');
grunt.config('unitTestFile', testFile.replace(/.php/, ''));
}
});
};
Итак, файл с именем tests\unit\ApplicationTest.php
и в пространстве имен tests\unit
если изменено, теперь будет запускаться как тест. В результате получается команда:
phpunit --filter tests\\unit\\ApplicationTest // only runs in this namespace
Использование командной строки
перейдите в папку вашего проекта и запустите подходящую команду
Запустите все файлы тестовых классов
phpunit
Запустите файл определенного теста
phpunit ./tests/ExampleTest.php
или же
Запустите конкретный тестовый пример из файла класса, запустите команду ниже
phpunit --filter testBasicExample ./tests/ExampleTest.php
Вы могли бы рассмотреть следующее решение:
.json
который включает в себя массив файлов / путей, которые вы намереваетесь просмотреть и в конечном итоге запустить в качестве модульного теста.watch
а также shell
Задачи.(Оба приведенных выше пункта, безусловно, помогут сократить количество строк кода.)
Следующие суть демонстрирует это:
Предположим, у нас есть файл с именем test-mappings.json
с каждым путем к файлу (согласно пункту 1) указано как следующее и сохранено в корневом каталоге проектов вместе Gruntfile.js
[{
"file": "tests/testA.php"},{
"file": "tests/testB.php"},{
"file": "tests/testC.php"},{
"file": "tests/testD.php"}]
Использовать Gruntfile.js
настроен следующим образом:
module.exports = function(grunt) {
'use strict';
var mapping = grunt.file.readJSON('test-mappings.json'),
watch = {},
shell = {};
// Dynamically create the targets for 'watch' and 'shell' tasks.
mapping.forEach(function(config, index) {
watch[index] = {
files: [config.file],
tasks: [index]
};
shell[index] = {
command: 'vendor/bin/phpunit ' + config.file
};
// Register the shell target
grunt.registerTask(index, ['shell:' + index ]);
});
grunt.initConfig({
watch: watch,
shell: shell
});
// Handy for dev - logs generated targets
//grunt.log.writeln(JSON.stringify(grunt.config(), null, 2));
require('load-grunt-tasks')(grunt);
grunt.registerTask('default', [
'watch'
]);
};
Обратите внимание на каждую цель для обоих watch
а также shell
Задачи создаются и настраиваются динамически в соответствии со списком файлов, указанным в test-mappings.json
,
Чтобы увидеть конфигурацию автоматически сгенерированных целей, вы можете просто раскомментировать чтение строки grunt.log.writeln...
перед запуском $ grunt
и он будет напечатан на консоли.
$ grunt
через CLI.test-mappings.json
и сохранить его.watch
Задача будет затем запустить соответствующий shell
команда.В настоящее время файлы перечислены во внешнем .json
Однако они могли бы проживать в Gruntfile.js
и быть назначенным переменной, если предпочтительнее.
Или файлы могут быть получены с использованием соответствующих подстановка шаблон (ы) и изменяя суть выше по мере необходимости. В этом случае перебирая grunt.file.expand для этого пригодится, вместо текущего mapping
массив.
Следующие плагины Grunt были использованы для вышеупомянутой сущности:
Следующие Gruntfile.js
для подхода, упомянутого ранее в пункте №. два под Дополнительные примечания secton (т. е. глобализация вместо внешней конфигурации JSON filepath).
module.exports = function(grunt) {
'use strict';
var tests = 'tests/**/*.php',
watch = {},
shell = {};
grunt.file.expand(tests).forEach(function(filepath, index) {
watch[index] = {
files: [filepath],
tasks: [index]
};
shell[index] = {
command: 'vendor/bin/phpunit ' + filepath
};
grunt.registerTask(index, ['shell:' + index]);
});
grunt.initConfig({
watch: watch,
shell: shell
});
require('load-grunt-tasks')(grunt);
grunt.registerTask('default', [
'watch'
]);
};