tutorial - using phpunit




Come eseguire automaticamente un singolo test phpunit quando viene aggiornato? (2)

Sto usando Laravel 5.3 e sfortunatamente quando si esegue gulp tdd , una modifica a 1 file esegue l'intera suite di test che ora richiede circa 2 minuti. Con riferimento a questo post , ho iniziato a utilizzare Grunt per eseguire test specifici quando vengono modificati file specifici. Esempio di Gruntfile di seguito:

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' },
    }
});

Tuttavia, ora il mio Gruntfile sta diventando piuttosto lungo e vorrei eseguire specifici file di test quando vengono modificati.

Domande

  1. C'è un modo più efficiente per farlo? (migliore organizzazione del Grunfile o usando Gulp)
  2. Come posso eseguire un test specifico quando il suo file viene modificato?

Esempio: quando vengono modificati tests/Home/IndexTest.php , esegui automaticamente i vendor/bin/phpunit tests/Home/IndexTest.php


Potresti prendere in considerazione la seguente soluzione:

  1. Utilizza un .json esterno che include una serie di file / percorsi che intendi guardare e che alla fine esegui come unit test.
  2. Genera dinamicamente i bersagli per le attività di watch e di shell .

(Entrambi i punti sopra aiuteranno sicuramente a ridurre le linee di codice).

Il seguente esempio lo dimostra:

JSON

Supponiamo di avere un file chiamato test-mappings.json con ogni percorso del file (come da punto 1) specificato come seguito e salvato nella directory root del progetto insieme a Gruntfile.js

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

Gruntfile.js

Usa un Gruntfile.js configurato come segue:

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'
    ]);
};

Si noti che ciascuna destinazione per l' watch e la shell vengono generate dinamicamente e configurate in base all'elenco di file specificato in test-mappings.json .

Per vedere la configurazione degli obiettivi generati automaticamente puoi semplicemente decommentare la riga che legge grunt.log.writeln... , prima di eseguire $ grunt , e verrà stampata sulla console.

Esecuzione dell'attività

  1. Digitare $ grunt tramite la CLI.
  2. Apporta una modifica a uno dei file elencati in test-mappings.json e salvalo.
  3. L'attività di watch eseguirà quindi il comando shell corrispondente.

Note aggiuntive

  1. Attualmente i file sono elencati in un .json esterno, tuttavia potrebbero risiedere nel Gruntfile.js e essere assegnati a una variabile se preferibile.

  2. In alternativa, è possibile ottenere i file utilizzando i pattern di globbing appropriati e modificando il Gist sopra come necessario. In tal caso l'iterazione su grunt.file.expand sarà utile per questo, anziché l'attuale array di mapping .

  3. I seguenti plugin per il grunt sono stati utilizzati per la sintesi di cui sopra:

Aggiornare:

Il seguente Gruntfile.js è per l'approccio precedentemente menzionato nel punto n. due sotto la sezione Note aggiuntive (ad esempio Globbing invece di una configurazione di filepath JSON esterna).

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'
    ]);

};

Utilizzando la riga di comando

vai alla cartella del tuo progetto quindi esegui sotto il comando appropriato

Esegui tutti i file di classe di test

phpunit

Esegui un file di classe di test specifico

phpunit ./tests/ExampleTest.php

o

Esegui un test case specifico dal file di classe eseguito sotto il comando

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





phpunit