Как автоматически запустить один тест phpunit при его обновлении?

Я использую 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 становится довольно длинным, и я хотел бы запускать определенные тестовые файлы, когда они меняются.

Вопросы

  1. Есть ли более эффективный способ сделать это? (лучшая организация Grunfile или использование Gulp вместо этого)
  2. Как я могу запустить определенный тест, когда его файл изменен?

Пример:
когда tests/Home/IndexTest.php изменено, автоматически запускается vendor/bin/phpunit tests/Home/IndexTest.php

0

Решение

Хорошо, чтобы справиться с этим, вам нужно поймать совпадающее имя файла и динамически установить переменную для использования в качестве файла модульного теста. Это должно охватывать все основные сопоставления, где имя тестового класса точно совпадает с именем файла, в котором оно находится, и поддерживает пространства имен, поэтому не все тестовые файлы с одинаковым именем класса будут выбраны фильтром.

Пример:

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
1

Другие решения

Использование командной строки

перейдите в папку вашего проекта и запустите подходящую команду

Запустите все файлы тестовых классов

phpunit

Запустите файл определенного теста

phpunit ./tests/ExampleTest.php

или же

Запустите конкретный тестовый пример из файла класса, запустите команду ниже

phpunit --filter testBasicExample ./tests/ExampleTest.php

0

Вы могли бы рассмотреть следующее решение:

  1. Используйте внешний .json который включает в себя массив файлов / путей, которые вы намереваетесь просмотреть и в конечном итоге запустить в качестве модульного теста.
  2. Динамически генерировать Цели для обоих watch а также shell Задачи.

(Оба приведенных выше пункта, безусловно, помогут сократить количество строк кода.)

Следующие суть демонстрирует это:


JSON

Предположим, у нас есть файл с именем test-mappings.json с каждым путем к файлу (согласно пункту 1) указано как следующее и сохранено в корневом каталоге проектов вместе Gruntfile.js

[{
"file": "tests/testA.php"},{
"file": "tests/testB.php"},{
"file": "tests/testC.php"},{
"file": "tests/testD.php"}]

Gruntfile.js

Использовать 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и он будет напечатан на консоли.


Выполнение задачи

  1. Тип $ grunt через CLI.
  2. Внесите изменения в один из файлов, перечисленных в test-mappings.json и сохранить его.
  3. watch Задача будет затем запустить соответствующий shell команда.

Дополнительные примечания

  1. В настоящее время файлы перечислены во внешнем .jsonОднако они могли бы проживать в Gruntfile.js и быть назначенным переменной, если предпочтительнее.

  2. Или файлы могут быть получены с использованием соответствующих подстановка шаблон (ы) и изменяя суть выше по мере необходимости. В этом случае перебирая grunt.file.expand для этого пригодится, вместо текущего mapping массив.

  3. Следующие плагины 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'
]);

};
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector