Karma 실행 단일 테스트
나는 실행 테스트에 카르마를 사용합니다. 많은 테스트가 있고 모든 테스트를 실행하는 것은 매우 느린 프로세스입니다. 모든 테스트는 약 10 분 정도 실행되므로 시간을 줄이기 위해 단일 테스트 만 실행하고 싶습니다.
가능합니까?
감사.
Karma / Jasmine 스택을 사용하는 경우 다음을 사용하십시오 .
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
});
Karma / Mocha 에있을 때 :
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
});
업데이트 : 카르마가 변경되었습니다.
이제 사용 fit()
하고fdescribe()
f는 집중을 의미합니다!
Angular 사용자를 위해!
두 가지 방법을 알고 있습니다.
- Visual Studio 코드 확장 :
가장 쉬운 방법은 vscode-test-explorer 확장을 자식 angular-karma-test-explorer 및 jasmine-test-adapter 와 함께 사용하는 것입니다. 원할 경우 현재 테스트 목록을 하나씩 실행할 수 있습니다.
- 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
매개 변수에 대한 자세한 내용은 위키에서 찾을 수 있습니다 .
- 카르마 러너 개선
현재 그들의 현재 행동을 개선하기위한 미해결 문제가 있습니다 . github 페이지 ( https://github.com/karma-runner/karma/issues/1507 ) 에서 진행 상황을 확인할 수 있습니다 .
각도로 카르마 테스트를 실행하려면 test.ts
파일 을 수정하기 만하면 됩니다.
라인 찾기 const context = require.context('./', true, /\.spec\.ts$/);
your.component.spec.ts
라인 수정 을 실행하려면 다음을 수행하십시오 .const context = require.context('./', true, /your\.component\.spec\.ts$/);
it ()을 iit ()로 변경하면 단일 테스트를 실행할 수 있습니다. 또한 유사하게 describe () 블록의 경우 ddescribe ()를 사용할 수 있습니다.
a) 단일 파일을 설명하는 패턴을 명령 줄 인수로 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
b) Karma를 시작하는 Gulp (또는 Grunt 요법) 작업을 사용할 수 있습니다. 이것은 Karma를 실행하는 방법에 더 많은 유연성을 제공합니다. 예를 들어 이러한 작업에 사용자 지정 명령 줄 인수를 전달할 수 있습니다. 이 전략은 변경된 테스트 만 실행하는 감시 모드를 구현하려는 경우에도 유용합니다. (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;
}
VisualStudio의 ExternalToolCommand 설정 예 :
제목 : Chrome을 사용하여 Karma 실행
명령 : cmd.exe
인수 : / c gulp single --browser = "Chrome_With_Saved_DevTools_Settings"--filePath = $ (ItemPath)
초기 디렉토리 : $ (SolutionDir)
출력 창 사용 : true
전체 디렉토리 대신 실행할 테스트 만 포함하도록 karma conf를 변경하십시오.
파일 내부 : [...]
js가 축소되는 것을 방지하기 위해 크롬에서 테스트를 디버깅해야하거나 원하는 경우 전처리기에 주석을 달 수 있습니다.
참조 URL : https://stackoverflow.com/questions/26552729/karma-run-single-test
'IT TIP' 카테고리의 다른 글
자바 스크립트에서 긴 숫자를 축약 된 문자열로 변환합니다. (0) | 2020.12.15 |
---|---|
AttributeError : Python에서 속성을 설정할 수 없습니다. (0) | 2020.12.15 |
계산 된 속성과 클로저로 설정된 속성의 차이점 (0) | 2020.12.15 |
열려있는 모든 문서 탭을 표시합니다. (0) | 2020.12.15 |
VSCode의 열에서 자동으로 줄 바꿈 (0) | 2020.12.15 |