Карма пробіг один тест


77

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

Це можливо ?

Дякую.


Пов’язана проблема з кармою: github.com/karma-runner/karma/issues/…
Стефан

ви можете змінити з describeдопомогою fdescribeі itзаfit
Ернесто Альфонсо

Відповіді:


99

Якщо ви використовуєте стек Карма / Жасмин , використовуйте:

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

16
Але що, якщо співавтор, який щось налагодив і перейменував кілька тестів, щоб звузити проблему, забуде це зробити і зробить це? Мені здається дурним редагувати тест вперед-назад, щоб сфокусувати його та розфокусувати. Чи неможливо використовувати CLI, щоб просто сказати: "запустити цей тест і лише цей тест"?
Ingwie Phoenix

1
Зазвичай в одному файлі є кілька тестових випадків та груп, і іноді вам потрібно запустити лише одну з них, наприклад. Функція "фокус" - це "обов'язково" в будь-якій бібліотеці модульного тестування. Крім того, ви можете додати "git-hook", який перевіряє .onlyабо fitз'являється код і відхиляє фіксацію, якщо знайдено.
Dan KK

Бачу - хороший момент! Але я не можу перевірити git-hook у VCS, чи не так?
Ingwie Phoenix

Хороше запитання, але, схоже, воно виходить за рамки цього питання.
Dan KK

39

Оновлення: карма змінилася.

Тепер використовуйте fit()таfdescribe()

f означає сфокусований!


ahhh fрозшифровується як focused... нібито німо, але я прийму це халло
Олександр Міллс

14

Для користувачів Angular!

Я знаю два шляхи:

  1. Розширення коду Visual Studio:

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

введіть тут опис зображення

  1. Безпосередньо модифікуйте 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 )


6

а) Ви можете передати шаблон, який описує ваш файл як аргумент командного рядка, до команди 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 ect.), яке запустить Карма для вас. Це дає вам більшу гнучкість щодо того, як виконувати Карма. Наприклад, ви можете передавати власні аргументи командного рядка цим завданням. Ця стратегія також корисна, якщо ви хочете застосувати режим перегляду, який виконує лише змінені тести. (Режим перегляду Karma виконує всі тести.) Ще одним випадком використання буде тестування файлів із локальними змінами лише перед тим, як зробити коміт. Також див. Приклади Gulp нижче.

в) Якщо ви використовуєте 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 /programming/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:

Назва: Запустіть Karma за допомогою Chrome

Команда: cmd.exe

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

Початковий каталог: $ (SolutionDir)

Використовувати вікно виводу: true


6

Якщо ви хочете запустити тест карми з angular, вам просто потрібно змінити test.tsфайл.

Знайти рядок const context = require.context('./', true, /\.spec\.ts$/);

Якщо ви хочете запустити, your.component.spec.tsзмініть рядок на:const context = require.context('./', true, /your\.component\.spec\.ts$/);


1
Ось перша відповідь Angular!
Луїс

2

Зміна його () на iit () має працювати для запуску одного тесту. Також, аналогічно, для блоку descri () ми можемо використовувати ddescribe ()


2
залежно від вашої версії карми, вам може знадобитися використовувати, fdescribe()і fit()як зазначає Брендан
mgojohn

0

Змініть свою конфіденційність карми, щоб включити лише тест, який ви хочете виконати, замість повного каталогу.

Усередині файлів: [...]

Можливо, ви захочете прокоментувати препроцесори, якщо вам потрібно / ви хочете налагодити ваш тест у chrome, щоб уникнути зменшення вашого js.


0

Так, це стара тема.

Наступна ситуація сталася зі мною 2-3 рази за останні кілька років. Тим більше, коли я не проводив багато модульних тестів і повертався до них.

Я запустив свою Карма і виявив, що після першого запуску тести повинні були бути завершені протягом 1 секунди, і тепер це займе 20 секунд. Крім того, спроби налагодити модульні тести в Chrome стали нудно повільними. На вкладці мережі відображаються всі файли, що займають 2-3 секунди на файл.

Рішення: Я не підозрював, що Скрипаль відкритий. Закрийте його та перезапустіть тести.


0

Пропозиція відповіді для спеціального випадку Angular / IE: Єдине, що досі працювало для мене, використовуючи "karma-ie-launcher", щоб запустити IE як браузер, було зміна властивості "include" tsconfig.spec.json для явного посилання цільовий файл тесту, використовуючи універсальний кваліфікований шлях, а не глобуси, наприклад "C: \ filepath \ my-test.spec.ts", для цілей компіляції. "На додаток" test.ts файл повинен бути відповідним чином змінений, щоб цільовий файл був призначений для обмеження тестового файлу. Майте на увазі, що кеш потрібно спочатку видалити в IE, щоб ця схема набрала чинності.

(Для випадку Angular / Chrome достатньо модифікації test.ts).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.