instalacion - ¿Cómo ejecutar automáticamente una sola prueba phpunit cuando se actualiza?
laravel instalacion (3)
Podría considerar la siguiente solución:
- Utilice un
.json
externo que incluya una matriz de archivos / rutas que pretenda ver y que finalmente se ejecute como una prueba unitaria. - Genere dinámicamente los objetivos para las tareas de
watch
y deshell
.
(Ambos puntos anteriores ciertamente ayudarán a reducir las líneas de código).
La siguiente esencia demuestra esto:
JSON
Supongamos que tenemos un archivo llamado test-mappings.json
con cada ruta de archivo (según el punto 1) especificada como seguida y guardada en el directorio raíz del proyecto junto con Gruntfile.js
[{
"file": "tests/testA.php"
},{
"file": "tests/testB.php"
},{
"file": "tests/testC.php"
},{
"file": "tests/testD.php"
}]
Gruntfile.js
Use un Gruntfile.js
configurado de la siguiente manera:
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''
]);
};
Observe que cada objetivo tanto para el watch
como para el shell
se generan dinámicamente y se configuran de acuerdo con la lista de archivos especificada en test-mappings.json
.
Para ver la configuración de los objetivos generados automáticamente, simplemente puede descomentar la lectura de la línea grunt.log.writeln...
, antes de ejecutar $ grunt
, y se imprimirá en la consola.
Ejecutando la tarea
- Escriba
$ grunt
través de la CLI. - Haga una edición en uno de los archivos listados en
test-mappings.json
y guárdelo. - La tarea de
watch
ejecutará el comando deshell
correspondiente.
Notas adicionales
Actualmente los archivos se enumeran en un
.json
externo, sin embargo, podrían residir en elGruntfile.js
y asignarse a una variable, si se prefiere.O bien, los archivos se pueden obtener usando los patrones globbing apropiados y modificando la esencia anterior según sea necesario. En ese caso, iterar sobre grunt.file.expand será útil para eso, en lugar de la matriz de
mapping
actual.Los siguientes plugins roncos se usaron para la esencia anterior:
Actualizar:
El siguiente Gruntfile.js
es para el enfoque mencionado anteriormente en el punto no. dos bajo la sección de notas adicionales (es decir, globbing en lugar de una configuración de ruta de archivo JSON externa).
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''
]);
};
Estoy usando Laravel 5.3 y, desafortunadamente, cuando ejecutas gulp tdd
, un cambio a 1 archivo ejecuta todo el conjunto de pruebas, que ahora demora casi 2 minutos. Con referencia a esta publicación , comencé a usar Grunt para ejecutar pruebas específicas cuando se cambian archivos específicos. Muestra Gruntfile a continuación:
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'' },
}
});
Sin embargo, ahora mi Gruntfile es bastante largo y me gustaría ejecutar archivos de prueba específicos cuando se cambian.
Preguntas
- ¿Hay una manera más eficiente de hacer esto? (Mejor organización del Grunfile o usando Gulp en su lugar)
- ¿Cómo puedo ejecutar una prueba específica cuando se cambia su archivo?
Ejemplo: cuando se cambian las tests/Home/IndexTest.php
, ejecute automáticamente las vendor/bin/phpunit tests/Home/IndexTest.php
Usando línea de comando
vaya a su carpeta de proyecto y luego ejecute el comando adecuado
Ejecute todos los archivos de clase de prueba
phpunit
Ejecuta un archivo de clase de prueba específico
phpunit ./tests/ExampleTest.php
o
Ejecutar un caso de prueba específico desde el archivo de clase ejecutar debajo del comando
phpunit --filter testBasicExample ./tests/ExampleTest.php
De acuerdo, para manejar esto, necesitará capturar el nombre del archivo coincidente y establecer dinámicamente una variable para usar como el archivo de prueba de la unidad. Esto debería abarcar todas las asignaciones básicas donde el nombre de la clase de prueba es exactamente el mismo nombre que el nombre del archivo en el que se encuentra, y admite espacios de nombres para que el filtro no recoja todos los archivos de prueba con el mismo nombre de clase.
Ejemplo:
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/, ''''));
}
});
};
Por lo tanto, un archivo llamado tests/unit/ApplicationTest.php
y dentro de un espacio de nombres de tests/unit
si se modifica ahora lo ejecutará como una prueba. El comando resultante es:
phpunit --filter tests//unit//ApplicationTest // only runs in this namespace