Karma chạy thử nghiệm đơn


77

Tôi sử dụng nghiệp cho các bài kiểm tra chạy. Tôi có nhiều bài kiểm tra và chạy tất cả các bài kiểm tra là quá trình rất chậm. Tôi chỉ muốn chạy thử nghiệm duy nhất để tốn ít thời gian hơn, vì tất cả thử nghiệm chạy khoảng 10 phút.

Có khả thi không?

Cảm ơn.


Vấn đề về Karma liên quan: github.com/karma-runner/karma/issues/…
Stefan

bạn có thể thay đổi describebởi fdescribeitbằngfit
Ernesto Alfonso

Câu trả lời:


99

Nếu bạn đang sử dụng ngăn xếp Karma / Jasmine , hãy sử dụng:

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

... và:

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

Khi bạn sử dụng Karma / Mocha :

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

... và:

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

16
Nhưng điều gì sẽ xảy ra nếu một người đóng góp đã gỡ lỗi điều gì đó và đổi tên một số bài kiểm tra để thu hẹp vấn đề quên làm như vậy và cam kết điều đó? Tôi thấy thật ngu ngốc khi chỉnh sửa bài kiểm tra tới lui để lấy nét và không tập trung. Không có cách nào sử dụng CLI để giống như "chạy thử nghiệm này, và chỉ thử nghiệm này"?
Ingwie Phoenix

1
Thông thường, có một số trường hợp và nhóm kiểm tra trong một tệp, và đôi khi bạn chỉ cần chạy một trong số chúng chẳng hạn. Tính năng "tiêu điểm" là thứ "phải có" trong bất kỳ thư viện kiểm thử đơn vị nào. Ngoài ra, bạn có thể thêm "git-hook" để kiểm tra .onlyhoặc xuất hiện fitmã và từ chối cam kết nếu tìm thấy.
Dan KK

Tôi hiểu - điểm tốt! Nhưng tôi không thể kiểm tra git-hook vào VCS, có thể không?
Ingwie Phoenix

Câu hỏi hay, nhưng có vẻ như nó vượt ra ngoài vấn đề này.
Dan KK

39

Cập nhật: nghiệp chướng đã thay đổi.

Bây giờ sử dụng fit()fdescribe()

f là viết tắt của tập trung!


ahhh flà viết tắt của focused... kinda câm nhưng tôi sẽ mang nó lol
Alexander Mills

14

Đối với người dùng Angular!

Tôi biết hai cách:

  1. Phần mở rộng mã Visual Studio:

Cách dễ nhất là sử dụng tiện ích mở rộng vscode-test-explorer cùng với phần mở rộng góc-karma-test-explorerjasmine-test-adapter con của nó , bạn sẽ nhận được danh sách thử nghiệm hiện tại để chạy từng cái một nếu bạn muốn:

nhập mô tả hình ảnh ở đây

  1. Trực tiếp sửa đổi test.ts

Đối với tôi, tôi đã không thể sử dụng cách mở rộnglỗi này , và vì vậy tôi đã kết thúc sửa đổi test.tstập tin (như đã nêu ở đây bởi Shashi ), chỉ để củng cố câu trả lời rằng ở đây, bởi bối cảnh vẻ mặc định như thế này:

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

Bạn nên sửa đổi RegExp của nó để phù hợp với các tệp mà bạn muốn kiểm tra, ví dụ: nếu bạn muốn kiểm tra một tệp duy nhất có tên "my.single.file.custom.name.spec.ts", nó sẽ có dạng như sau:

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

Để biết thêm chi tiết về requirecác thông số, bạn có thể tìm thấy nó ở đây tại wiki của họ .

  1. Cải tiến người chạy Karma

Hiện tại, có một vấn đề mở để cải thiện hành vi hiện tại của họ, bạn có thể theo dõi tiến trình của họ tại trang github ( https://github.com/karma-runner/karma/issues/1507 ).


6

a) Bạn có thể chuyển một mẫu mô tả tệp đơn của bạn dưới dạng đối số dòng lệnh cho lệnh khởi động nghiệp:

# 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

Nguồn: https://gist.github.com/KidkArolis/fd5c0da60a5b748d54b2

b) Bạn có thể sử dụng một nhiệm vụ Gulp (hoặc Grunt vv.) để bắt đầu Karma cho bạn. Điều này giúp bạn linh hoạt hơn về cách thực hiện Karma. Ví dụ, bạn có thể chuyển các đối số dòng lệnh tùy chỉnh cho các tác vụ đó. Chiến lược này cũng hữu ích nếu bạn muốn triển khai chế độ đồng hồ chỉ thực hiện các thử nghiệm đã thay đổi. (Chế độ đồng hồ Karma sẽ thực hiện tất cả các bài kiểm tra.) Một trường hợp sử dụng khác là chỉ thực hiện các bài kiểm tra cho các tệp có thay đổi cục bộ trước khi bạn thực hiện cam kết. Cũng xem các ví dụ về Gulp bên dưới.

c) Nếu bạn sử dụng VisualStudio, bạn có thể muốn thêm lệnh công cụ bên ngoài vào menu ngữ cảnh của trình khám phá giải pháp. Bằng cách này, bạn có thể bắt đầu kiểm tra từ menu ngữ cảnh đó thay vì sử dụng bảng điều khiển. Cũng thấy

Làm thế nào để thực thi lệnh / tác vụ tệp tùy chỉnh cụ thể trong Visual Studio?

Tệp Gulp mẫu

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

Cài đặt mẫu cho ExternalToolCommand trong VisualStudio:

Tiêu đề: Chạy Karma bằng Chrome

Lệnh: cmd.exe

Đối số: / c gulp single --browser = "Chrome_With_Saved_DevTools_Settings" --filePath = $ (ItemPath)

Thư mục ban đầu: $ (SolutionDir)

Sử dụng cửa sổ đầu ra: true


6

Nếu bạn muốn chạy thử nghiệm karma với angle, Bạn chỉ cần sửa đổi test.tstệp của mình .

Tìm dòng const context = require.context('./', true, /\.spec\.ts$/);

Nếu bạn muốn chạy your.component.spec.tsdòng sửa đổi thành:const context = require.context('./', true, /your\.component\.spec\.ts$/);


1
Đây là câu trả lời Angular đầu tiên!
Luis Limas

2

Thay đổi nó () thành iit () sẽ hoạt động để chạy thử nghiệm đơn lẻ. Ngoài ra, tương tự, đối với khối description (), chúng ta có thể sử dụng ddescribe ()


2
tùy thuộc vào phiên bản nghiệp của bạn, bạn có thể cần phải sử dụng fdescribe()fit()như điểm brendan ra
mgojohn

0

Thay đổi tâm sự nghiệp của bạn để chỉ bao gồm thử nghiệm bạn muốn chạy thay vì một thư mục đầy đủ.

Bên trong các tệp: [...]

Bạn có thể muốn nhận xét bộ xử lý trước nếu bạn cần / muốn gỡ lỗi thử nghiệm của mình trong chrome để tránh việc js của bạn bị rút gọn.


0

Vâng, đây là một chủ đề cũ.

Tình trạng sau đây đã xảy ra với tôi 2 - 3 lần trong vài năm qua. Còn hơn thế nữa khi tôi chưa thực hiện nhiều thử nghiệm đơn vị và đã quay lại với nó.

Tôi khởi động Karma của mình và nhận thấy các bài kiểm tra, sau khi khởi động ban đầu, lẽ ra phải hoàn thành trong vòng 1 giây thì bây giờ mất 20 giây. Ngoài ra, việc cố gắng gỡ lỗi các bài kiểm tra đơn vị trong Chrome trở nên chậm chạp. Tab mạng hiển thị tất cả các tệp mất 2 - 3 giây cho mỗi tệp.

Giải pháp: Tôi không nhận ra Fiddler đã mở. Đóng nó và khởi động lại các thử nghiệm của bạn.


0

Đề xuất trả lời cho trường hợp Angular / IE đặc biệt: Điều duy nhất hoạt động cho đến nay đối với tôi khi sử dụng "karma-ie-launcher", để chạy IE làm trình duyệt, là sửa đổi thuộc tính "include" của tsconfig.spec.json để tham chiếu rõ ràng nhắm mục tiêu tệp kiểm tra bằng cách sử dụng đường dẫn đủ điều kiện chung chứ không phải các hình cầu, ví dụ: "C: \ filepath \ my-test.spec.ts", cho mục đích biên dịch. "Ngoài ra" tệp test.ts nên được sửa đổi thích hợp để nhắm mục tiêu tệp đã nói cho mục đích giới hạn tệp thử nghiệm. Lưu ý rằng bộ nhớ cache sẽ cần được xóa ban đầu trong IE để chương trình này có hiệu lực.

(Chỉ riêng việc sửa đổi trường hợp Angular / Chrome của test.ts là đủ.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.