Подтвердить что ты не робот

Карма запускает один тест

Я использую карму для запуска тестов. У меня много тестов и все тесты проходят очень медленно. Я хочу запустить только один тест, чтобы тратить меньше времени, потому что весь тест проходит около 10 минут.

Возможно ли это?

Спасибо.

4b9b3361

Ответ 1

Если вы используете стек Карма/Жасмин, используйте:

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

... и:

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

Когда вы находитесь на Карма/Мокко:

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

... и:

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

Ответ 2

Обновление: карма изменилась.

Теперь используйте fit() и fdescribe()

F означает сосредоточенный!

Ответ 3

Изменение его() на iit() должно работать для запуска одиночного теста. Кроме того, аналогично, для блока describe() мы можем использовать ddescribe()

Ответ 4

а) Вы можете передать шаблон, который описывает ваш отдельный файл в качестве аргумента командной строки, команде 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

Источник: https://gist.github.com/KidkArolis/fd5c0da60a5b748d54b2

б) Вы можете использовать задание Gulp (или Grunt и т.д.), которое запускает для вас карму. Это дает вам больше гибкости при выполнении Кармы. Например, вы можете передавать пользовательские аргументы командной строки для этих задач. Эта стратегия также полезна, если вы хотите реализовать режим наблюдения, который выполняет только измененные тесты. (Режим просмотра Karma будет выполнять все тесты.) Еще один вариант использования - выполнение коммитов только для файлов с локальными изменениями. Также см. Примеры Gulp ниже.

c) Если вы используете VisualStudio, вы можете добавить команду внешнего инструмента в контекстное меню обозревателя решений. Таким образом, вы можете запустить тест из этого контекстного меню вместо использования консоли. Также см

Как выполнить специальный файл/команду/задачу в Visual Studio?

Пример файла 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;
}

Пример настроек для ExternalToolCommand в VisualStudio:

Название: Запустите Карму, используя Chrome

Команда: cmd.exe

Аргументы: /c gulp single --browser = "Chrome_With_Saved_DevTools_Settings" --filePath = $ (ItemPath)

Начальный каталог: $ (SolutionDir)

Использовать окно вывода: true

Ответ 5

Если вы хотите запустить тест кармы с помощью angular, вам просто нужно изменить файл test.ts

Найти строку const context = require.context('./', true,/\.spec\.ts$/);

Если вы хотите запустить your.component.spec.ts измените строку на: const context = require.context('./', true,/your\.component\.spec\.ts$/);

Ответ 6

Для пользователей Angular!

Я знаю два способа:

  1. Расширение кода Visual Studio:

Самый простой способ - использовать расширение vscode-test-explorer вместе с его дочерним angular-karma-test-explorer и jasmine-test-adapter, вы получите список текущих тестов для запуска по одному, если хотите:

enter image description here

  1. Непосредственно измените test.ts

Для меня я не смог использовать способ расширения из-за этой ошибки, и поэтому я в итоге test.ts файл test.ts (как указано здесь Shashi), просто чтобы консолидировать этот ответ здесь, по умолчанию контекст выглядит следующим образом:

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

Вы должны изменить его RegExp, чтобы он соответствовал файлам, которые вы хотите протестировать, например, если вы хотите протестировать один файл с именем "my.single.file.custom.name.spec.ts", он будет выглядеть следующим образом:

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

Более подробную информацию о require параметрах вы можете найти здесь на их вики.

  1. Карма бегун улучшение

В настоящее время существует открытая тема для улучшения их текущего поведения, вы можете следить за их ходом на странице github (https://github.com/karma-runner/karma/issues/1507).

Ответ 7

Измените настройку вашей кармы, чтобы включить только те тесты, которые вы хотите запустить, а не полный каталог.

Внутри файлов: [...]

Возможно, вы захотите прокомментировать препроцессоры, если вам нужно/хотите отлаживать ваш тест в хроме, чтобы избежать минимизации js.