web-dev-qa-db-fra.com

Karma exécuter un seul test

J'utilise le karma pour exécuter des tests. J'ai de nombreux tests et exécuter tous les tests est un processus très lent. Je souhaite exécuter un seul test pour gagner moins de temps, car tous les tests durent environ 10 minutes.

C'est possible ?

Merci.

45
user3730696

Si vous utilisez la pile Karma/Jasmine , utilisez:

fdescribe("when ...", function () { // to [f]ocus on a single group of tests
  fit("should ...", function () {...}); // to [f]ocus on a single test case
});

... et:

xdescribe("when ...", function () { // to e[x]clude a group of tests
  xit("should ...", function () {...}); // to e[x]clude a test case
});

Quand vous êtes sur Karma/Moka :

describe.only("when ...", function () { // to run [only] this group of tests
  it.only("should ...", function () {...}); // to run [only] this test case
});

... et:

describe.skip("when ...", function () { // to [skip] running this group of tests
  it.skip("should ...", function () {...}); // to [skip] running this test case
});
64
Dan K.K.

Mise à jour: le karma a changé.

Maintenant, utilisez fit() et fdescribe()

f signifie concentré!

19
brendan

Le fait de changer it () en iit () devrait fonctionner pour exécuter un seul test .

2

a) Vous pouvez transmettre un modèle décrivant votre fichier unique comme argument de ligne de commande à la commande karma start:

# build and run all tests
$ karma start

# build and run only those tests that are in this dir
$ karma start --grep app/modules/sidebar/tests

# build and run only this test file
$ karma start --grep app/modules/sidebar/tests/animation_test.js

Source: https://Gist.github.com/KidkArolis/fd5c0da60a5b748d54b2

b) Vous pouvez utiliser une tâche Gulp (ou Grunt ect.) qui lance Karma pour vous. Cela vous donne plus de flexibilité sur la façon d'exécuter Karma. Vous pouvez par exemple transmettre des arguments de ligne de commande personnalisés à ces tâches. Cette stratégie est également utile si vous souhaitez implémenter un mode de surveillance qui exécute uniquement les tests modifiés. (Le mode de veille Karma exécuterait tous les tests.) Un autre cas d'utilisation serait de n'exécuter que les tests des fichiers avec des modifications locales avant d'effectuer une validation. Voir aussi les exemples Gulp ci-dessous.

c) Si vous utilisez VisualStudio, vous pouvez ajouter une commande d’outil externe au menu contextuel de l’explorateur de solutions. De cette façon, vous pouvez démarrer le test à partir de ce menu contextuel au lieu d'utiliser la console. Regarde aussi

Comment exécuter une commande/tâche spécifique à un fichier personnalisé dans Visual Studio?

Exemple de fichier Gulp 

//This gulp file is used to execute the Karma test runner
//Several tasks are available, providing different work flows
//for using Karma. 

var gulp = require('gulp');
var karma = require('karma');
var KarmaServerConstructor = karma.Server;
var karmaStopper = karma.stopper;
var watch = require('gulp-watch');
var commandLineArguments = require('yargs').argv;
var svn = require('gulp-svn');
var exec = require('child_process').exec;
var fs = require('fs');

//Executes all tests, based on the specifications in karma.conf.js
//Example usage: gulp all
gulp.task('all', function (done) {
    var karmaOptions = { configFile: __dirname + '/karma.conf.js' };
    var karmaServer = new KarmaServerConstructor(karmaOptions, done);
    karmaServer.on('browsers_change', stopServerIfAllBrowsersAreClosed); //for a full list of events see http://karma-runner.github.io/1.0/dev/public-api.html
    karmaServer.start();   
});

//Executes only one test which has to be passed as command line argument --filePath
//The option --browser also has to be passed as command line argument.
//Example usage:  gulp single --browser="Chrome_With_Saved_DevTools_Settings" --filePath="C:\myTest.spec.js"
gulp.task('single', function (done) {     

    var filePath = commandLineArguments.filePath.replace(/\\/g, "/");

    var karmaOptions = {
        configFile: __dirname + '/karma.conf.js',
        action: 'start',        
        browsers: [commandLineArguments.browser],       
        files: [
            './Leen.Managementsystem/bower_components/jquery/dist/jquery.js',
            './Leen.Managementsystem/bower_components/globalize/lib/globalize.js',
            { pattern: './Leen.Managementsystem/bower_components/**/*.js', included: false },
            { pattern: './Leen.Managementsystem.Tests/App/test/mockFactory.js', included: false },
            { pattern: './Leen.Managementsystem/App/**/*.js', included: false },
            { pattern: './Leen.Managementsystem.Tests/App/test/*.js', included: false },
            { pattern: filePath, included: false },
            './Leen.Managementsystem.Tests/App/test-main.js',
            './switchKarmaToDebugTab.js' //also see https://stackoverflow.com/questions/33023535/open-karma-debug-html-page-on-startup
        ]
    };

    var karmaServer = new KarmaServerConstructor(karmaOptions, done);   
    karmaServer.on('browsers_change', stopServerIfAllBrowsersAreClosed);
    karmaServer.start();     
});

//Starts a watch mode for all *.spec.js files. Executes a test whenever it is saved with changes. 
//The original Karma watch mode would execute all tests. This watch mode only executes the changed test.
//Example usage:  gulp watch 
gulp.task('watch', function () {

    return gulp //
        .watch('Leen.Managementsystem.Tests/App/**/*.spec.js', handleFileChanged)
        .on('error', handleGulpError);

    function handleFileChange(vinyl) {

        var pathForChangedFile = "./" + vinyl.replace(/\\/g, "/");

        var karmaOptions = {
            configFile: __dirname + '/karma.conf.js',
            action: 'start',
            browsers: ['PhantomJS'],
            singleRun: true,
            files: [
                    './Leen.Managementsystem/bower_components/jquery/dist/jquery.js',
                    './Leen.Managementsystem/bower_components/globalize/lib/globalize.js',
                    { pattern: './Leen.Managementsystem/bower_components/**/*.js', included: false },
                    { pattern: './Leen.Managementsystem.Tests/App/test/mockFactory.js', included: false },
                    { pattern: './Leen.Managementsystem/App/**/*.js', included: false },
                    { pattern: './Leen.Managementsystem.Tests/App/test/*.js', included: false },
                    { pattern: pathForChangedFile, included: false },
                    './Leen.Managementsystem.Tests/App/test-main.js'
            ]
        };

        var karmaServer = new KarmaServerConstructor(karmaOptions);
        karmaServer.start();

    }

});

//Executes only tests for files that have local changes
//The option --browser has to be passed as command line arguments.
//Example usage:  gulp localChanges --browser="Chrome_With_Saved_DevTools_Settings"
gulp.task('localChanges', function (done) {   

    exec('svn status -u --quiet --xml', handleSvnStatusOutput);

    function handleSvnStatusOutput(error, stdout, stderr) {

        if (error) {
            throw error;
        }

        var changedJsFiles = getJavaScriptFiles(stdout);   
        var specFiles = getSpecFiles(changedJsFiles);


        if(specFiles.length>0){
            console.log('--- Following tests need to be executed for changed files: ---');
            specFiles.forEach(function (file) {
                console.log(file);
            });
            console.log('--------------------------------------------------------------');
        } else{
            console.log('Finsihed: No modified files need to be tested.');
            return;
        }

        var files = [
                './Leen.Managementsystem/bower_components/jquery/dist/jquery.js',
                './Leen.Managementsystem/bower_components/globalize/lib/globalize.js',
                { pattern: './Leen.Managementsystem/bower_components/**/*.js', included: false },
                { pattern: './Leen.Managementsystem.Tests/App/test/mockFactory.js', included: false },
                { pattern: './Leen.Managementsystem/App/**/*.js', included: false },
                { pattern: './Leen.Managementsystem.Tests/App/test/*.js', included: false }];

        specFiles.forEach(function (file) {
            var pathForChangedFile = "./" + file.replace(/\\/g, "/");
            files = files.concat([{ pattern: pathForChangedFile, included: false }]);
        });

        files = files.concat([ //
            './Leen.Managementsystem.Tests/App/test-main.js', //
            './switchKarmaToDebugTab.js'
        ]);

        var karmaOptions = {
            configFile: __dirname + '/karma.conf.js',
            action: 'start',
            singleRun: false,
            browsers: [commandLineArguments.browser],
            files: files              
        };

        var karmaServer = new KarmaServerConstructor(karmaOptions, done);
        karmaServer.on('browsers_change', stopServerIfAllBrowsersAreClosed);
        karmaServer.start();
    }  


});

function getJavaScriptFiles(stdout) {
    var jsFiles = [];

    var lines = stdout.toString().split('\n');
    lines.forEach(function (line) {
        if (line.includes('js">')) {
            var filePath = line.substring(9, line.length - 3);
            jsFiles.Push(filePath);
        }
    });
    return jsFiles;
}

function getSpecFiles(jsFiles) {

    var specFiles = [];
    jsFiles.forEach(function (file) {

        if (file.endsWith('.spec.js')) {
            specFiles.Push(file);
        } else {
            if (file.startsWith('Leen\.Managementsystem')) {
                var specFile = file.replace('Leen\.Managementsystem\\', 'Leen.Managementsystem.Tests\\').replace('\.js', '.spec.js');
                if (fs.existsSync(specFile)) {
                    specFiles.Push(specFile);
                } else {
                    console.error('Missing test: ' + specFile);
                }
            }
        }
    });
    return specFiles;
}

function stopServerIfAllBrowsersAreClosed(browsers) {
    if (browsers.length === 0) {
        karmaStopper.stop();
    }
}

function handleGulpError(error) {


  throw error;
}

Exemple de paramètres pour ExternalToolCommand dans VisualStudio:

Titre: Run Karma utilisant Chrome

Commande: cmd.exe

Arguments:/c gulp single --browser = "Chrome_With_Saved_DevTools_Settings" --filePath = $ (ItemPath) 

Répertoire initial: $ (SolutionDir)

Utiliser la fenêtre de sortie: true

2
Stefan

Pour Angular utilisateurs!

Je connais deux manières:

  1. Extension de code Visual Studio:

Le moyen le plus simple consiste à utiliser l'extension vscode-test-Explorer avec son enfant angular-karma-test-Explorer et jasmine-test-adapter , vous obtiendrez une liste de test actuel à exécuter un par un si vous voulez:

 enter image description here 

  1. Modifier directement test.ts

Pour moi, j’ai été incapable d’utiliser l’extension à cause de ce bogue , et j’ai donc modifié le fichier test.ts (comme indiqué ici par Shashi ) , juste pour consolider cette réponse ici, le contexte par défaut ressemble à ceci:

const context = require.context('./', true, /\.spec\.ts$/);

Vous devez modifier son RegExp pour qu'il corresponde aux fichiers que vous souhaitez tester. Par exemple, si vous souhaitez tester un seul fichier nommé "my.single.file.custom.name.spec.ts", il se présentera ainsi:

const context = require.context('./', true, /my\.single\.file\.custom\.name\.spec\.ts$/);

Pour plus de détails sur les paramètres require, vous pouvez le trouver ici sur leur wiki .

  1. Amélioration du coureur Karma

Il existe actuellement un problème en cours pour améliorer leur comportement actuel. Vous pouvez suivre leur progression sur la page github ( https://github.com/karma-runner/karma/issues/1507 ).

2
Luis Limas

Si vous voulez exécuter karma test avec angular, il vous suffit de modifier votre fichier test.ts.

Trouver la ligne const context = require.context('./', true, /\.spec\.ts$/);

Si vous voulez exécuter your.component.spec.ts, modifiez la ligne sur: const context = require.context('./', true, /your\.component\.spec\.ts$/);

1
Shashi Ranjan

Changez votre karma conf pour inclure uniquement le test que vous voulez exécuter au lieu d’un répertoire complet.

Dans les fichiers: [...]

Vous voudrez peut-être commenter les préprocesseurs si vous avez besoin/voulez déboguer votre test en chrome pour éviter d'avoir votre js réduit.

0
Ronan Quillevere