karma runner - unit - Karma ejecuta una sola prueba
test with angular (7)
Yo uso karma para ejecutar pruebas. Tengo muchas pruebas y ejecutar todas las pruebas es un proceso muy lento. Quiero ejecutar solo una prueba para pasar menos tiempo, porque todas las pruebas duran unos 10 minutos.
Es posible ?
Gracias.
Para usuarios angulares!
Sé dos maneras:
- Extensión de código de Visual Studio:
La forma más fácil es usar la vscode-test-explorer junto con su hijo angular-karma-test-explorer y jasmine-test-adapter , obtendrá una lista de las pruebas actuales para ejecutar una por una si lo desea:
- Modificar directamente test.ts
Para mí,
no pude usar la forma de extensión
debido a
este error
, así que terminé modificando el archivo
test.ts
(como lo indicó
Shashi
), solo para consolidar esa respuesta aquí, por defecto el contexto se ve así :
const context = require.context(''./'', true, //.spec/.ts$/);
Debe modificar su RegExp para que coincida con los archivos que está dispuesto a probar, por ejemplo, si desea probar un solo archivo llamado "my.single.file.custom.name.spec.ts" se verá de esta manera:
const context = require.context(''./'', true, /my/.single/.file/.custom/.name/.spec/.ts$/);
Para obtener más detalles sobre
require
parámetros
require
, puede encontrarlo
aquí en su wiki
.
- Mejora del corredor de karma
Actualmente hay un problema abierto para mejorar su comportamiento actual, puede seguir su progreso en su página de github ( github.com/karma-runner/karma/issues/… ).
Actualización: el karma ha cambiado.
Ahora usa
fit()
y
fdescribe()
f significa enfocado!
Cambiarlo () a iit () debería funcionar para ejecutar una sola prueba. Además, de manera similar, para el bloque describe () podemos usar ddescribe ()
Cambie su configuración de karma para incluir solo la prueba que desea ejecutar en lugar de un directorio completo.
Dentro de los archivos: [...]
Es posible que desee comentar los preprocesadores si necesita / desea depurar su prueba en Chrome para evitar que su js sea minimizado.
Si desea ejecutar la prueba de karma con angular, solo necesita modificar su archivo
test.ts
Buscar línea
const context = require.context(''./'', true, //.spec/.ts$/);
Si desea ejecutar
your.component.spec.ts
modifique la línea a:
const context = require.context(''./'', true, /your/.component/.spec/.ts$/);
Si está utilizando la pila Karma / Jasmine , use:
fdescribe("when ...", function () { // to [f]ocus on a single group of tests
fit("should ...", function () {...}); // to [f]ocus on a single test case
});
... y:
xdescribe("when ...", function () { // to e[x]clude a group of tests
xit("should ...", function () {...}); // to e[x]clude a test case
});
Cuando estás en Karma / Mocha :
describe.only("when ...", function () { // to run [only] this group of tests
it.only("should ...", function () {...}); // to run [only] this test case
});
... y:
describe.skip("when ...", function () { // to [skip] running this group of tests
it.skip("should ...", function () {...}); // to [skip] running this test case
});
a) Puede pasar un patrón que describa su archivo único como argumento de línea de comando al comando de inicio de karma:
# 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
Fuente: https://gist.github.com/KidkArolis/fd5c0da60a5b748d54b2
b) Puedes usar una tarea Gulp (o Grunt ect.) que inicie Karma por ti. Esto le brinda más flexibilidad sobre cómo ejecutar Karma. Por ejemplo, puede pasar argumentos de línea de comandos personalizados a esas tareas. Esta estrategia también es útil si desea implementar un modo de observación que solo ejecute las pruebas modificadas. (El modo de observación Karma ejecutaría todas las pruebas). Otro caso de uso sería ejecutar solo pruebas para archivos con cambios locales antes de realizar una confirmación. También vea los ejemplos de Gulp a continuación.
c) Si usa VisualStudio, es posible que desee agregar un comando de herramienta externa al menú contextual del explorador de soluciones. De esta manera, puede comenzar la prueba desde ese menú contextual en lugar de usar la consola. Ver también
¿Cómo ejecutar un comando / tarea específica de un archivo personalizado en Visual Studio?
Archivo Gulp de ejemplo
//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://.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;
}
Configuraciones de ejemplo para ExternalToolCommand en VisualStudio:
Título: Ejecute Karma usando Chrome
Comando: cmd.exe
Argumentos: / c gulp single --browser = "Chrome_With_Saved_DevTools_Settings" --filePath = $ (ItemPath)
Directorio inicial: $ (SolutionDir)
Usar ventana de salida: verdadero