started instalacion getting documentacion composer php laravel-5 gruntjs phpunit

instalacion - ¿Cómo ejecutar automáticamente una sola prueba phpunit cuando se actualiza?



laravel instalacion (3)

Podría considerar la siguiente solución:

  1. Utilice un .json externo que incluya una matriz de archivos / rutas que pretenda ver y que finalmente se ejecute como una prueba unitaria.
  2. Genere dinámicamente los objetivos para las tareas de watch y de shell .

(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

  1. Escriba $ grunt través de la CLI.
  2. Haga una edición en uno de los archivos listados en test-mappings.json y guárdelo.
  3. La tarea de watch ejecutará el comando de shell correspondiente.

Notas adicionales

  1. Actualmente los archivos se enumeran en un .json externo, sin embargo, podrían residir en el Gruntfile.js y asignarse a una variable, si se prefiere.

  2. 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.

  3. 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

  1. ¿Hay una manera más eficiente de hacer esto? (Mejor organización del Grunfile o usando Gulp en su lugar)
  2. ¿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