Gruntを使用してユニットテストケースを実行するためにKarmaを実行しています。完全に正常に実行されていますが、テストの実行完了後にKarmaプロセスが自動的に停止することはありません。エラーなし/ログなし。以下は、configファイルとgruntファイルの詳細です。
karma-config.js
module.exports = function(config) {
config.set({
// base path, that will be used to resolve files and exclude
basePath: './../../../../',
// frameworks to use
frameworks: ['jasmine'],
// generate js files from html templates
preprocessors: {
'ThemeLibrary/client/templates/categoryview/Category.html': 'ng-html2js'
},
// list of files / patterns to load in the browser
files: [
//Note: Order of file listing does matter therefore loading using * may cause issue
//Load external libraries
'ThemeLibrary/client/js/vendor/others/underscore-min_1.6.0.js',
'ThemeLibrary/client/js/vendor/jquery/jquery.min-1.9.1.js',
'ThemeLibrary/client/js/vendor/angularjs/angular.min.js',
'ThemeLibrary/client/js/vendor/angularjs/angular-resource.min.js',
'ThemeLibrary/client/js/vendor/angularjs/angular-route.min.js',
'ThemeLibrary/client/js/vendor/angularjs/keypress.js',
'ThemeLibrary/client/js/vendor/angularjs/truncate.js',
'Test/unit/client/lib/angularjs/angular-mocks.js',
'Test/unit/client/lib/jasmin/JasminHelper.js',
//Load application library used by code.
'ThemeLibrary/client/js/application/utilities/JavascriptExtension.js',
'ThemeLibrary/client/js/application/App.js',
//Load directives HTML templates
'ThemeLibrary/client/templates/categoryview/Category.html',
//Load application source code which needs to be tested
'ThemeLibrary/client/js/application/utilities/*.js',
'ThemeLibrary/client/js/application/controllers/*.js',
'ThemeLibrary/client/js/application/services/*.js',
'ThemeLibrary/client/js/application/factories/*.js',
'ThemeLibrary/client/js/application/factories/implementation/*.js',
'ThemeLibrary/client/js/application/directives/categoryview/Category.js',
//Load test data
'Test/unit/client/testdata/*.js',
'Test/unit/client/js/mock/*.js',
//Test files
'Test/unit/client/js/application/utilities/*.js',
'Test/unit/client/js/application/controllers/*.js',
'Test/unit/client/js/application/services/*.js',
'Test/unit/client/js/application/factories/implementation/*.js',
'Test/unit/client/js/application/factories/*.js',
//'Test/unit/client/js/application/directives/categoryview/Category.test.js'
],
// list of files to exclude
exclude: [
],
// test results reporter to use
reporters: ['progress'],
// web server port
port: 9101,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// Start these browsers
browsers: ['PhantomJS'],
// If browser does not capture in given timeout [ms], kill it
captureTimeout: 60000,
// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false,
ngHtml2JsPreprocessor: {
'moduleName': 'Templates',
stripPrefix: '.*/ThemeLibrary/client',
// Function that transforms the path to look exactly like you have it in templateUrl in your Angular code
cacheIdFromPath: function(filepath) {
//return filepath.match(/\/templates\/categoryview\/.*\.html/);
//return filepath.match('/templates/categoryview/Category.html');
//return 'ThemeLibrary/client'+filepath;
return filepath;
//return 'ThemeLibrary/client/templates/categoryview/Category.html';
}
}
});
};
Gruntfile.js
/**
* New node file
*/
module.exports = function(grunt){
//globalConfig and paths which will used in the grunt script
var config={
srcFolderName: 'src',
distFolderName: 'dist',
appFileName: 'server.js',
nodeModuleFolderName: 'node_modules',
testSourceFolderName: 'src-test',
testDestFolderName: 'Test',
//change this command based on project requirement
apiDocCommand:'apidoc -i src/server -o apidoc',
npmInstallCommand: 'npm install --prefix ./dist/<%= pkg.name %>/node_modules'
}
//init
grunt.initConfig({
config:config,
pkg: grunt.file.readJSON('package.json'),
copy: {
//copy all source files to distribution folder
sourceFiles: {
cwd: '<%= config.srcFolderName %>',
src: [ '**' ],
dest: '<%= config.distFolderName %>/<%= pkg.name %>',
expand: true
},
//copy main app file to dist folder
mainAppFile: {
src: '<%= config.appFileName %>',
dest: '<%= config.distFolderName %>/<%= pkg.name %>/<%= config.appFileName %>'
},
copyPackage:{
src: 'package.json',
dest: '<%= config.distFolderName %>/<%= pkg.name %>/package.json'
},
//copy all source test files to distribution folder
testFiles: {
cwd: '<%= config.testSourceFolderName %>',
src: [ '**' ],
dest: '<%= config.distFolderName %>/<%= config.testDestFolderName %>',
expand: true
}
},
clean : {
build : {
src : [ '<%=config.distFolderName%>/','apidoc/' ]
},
pkgJson : {
src : ['<%= config.distFolderName %>/<%= pkg.name %>/package.json']
}
},
uglify: {
serverCode:{
files: [{
expand:true,
cwd:'<%= config.distFolderName %>/<%= pkg.name %>/server',
src:'**/*.js',
dest:'<%= config.distFolderName %>/<%= pkg.name %>/server'
}]
},
clientCode:{
files: [{
expand:true,
cwd:'<%= config.distFolderName %>/<%= pkg.name %>/client/js/application',
src:'**/*.js',
dest:'<%= config.distFolderName %>/<%= pkg.name %>/client/js/application'
}]
},
mainAppFile: {
files: {
'<%= config.distFolderName %>/<%= pkg.name %>/<%= config.appFileName %>':['<%= config.distFolderName %>/<%= pkg.name %>/<%= config.appFileName %>']
}
}
},
jshint:{
serverCode:{
files:[{
expand:true,
cwd:'<%= config.distFolderName %>/<%= pkg.name %>/server',
src:'**/*.js'
}]
},
clientCode:{
files: [{
expand:true,
cwd:'<%= config.distFolderName %>/<%= pkg.name %>/client/js/application',
src:'**/*.js'
}]
},
clientTestCode:{
files: [{
expand:true,
cwd:'<%= config.distFolderName %>/<%= config.testDestFolderName %>/unit/client/js',
src:'**/*.js'
}]
},
serverTestCode:{
files: [{
expand:true,
cwd:'<%= config.distFolderName %>/<%= config.testDestFolderName %>/server',
src:'**/*.js'
}]
}
},
//mocha is used to automate unit testing of server side nodejs/express code.
simplemocha: {
options: {
globals: ['expect'],
timeout: 3000,
ignoreLeaks: false,
ui: 'bdd',
reporter: 'tap'
},
all: { src: ['dist/Test/unit/server/**/*.js'] }
},
//karma is used to automate unit testing of client side angular/javascript test cases writtin in jasmine.
karma: {
unit: {
configFile: 'dist/Test/unit/client/config/karma.conf.js',
background: false
}
},
protractor: {
options: {
configFile: "protractor-config.js", //your protractor config file
keepAlive: true, // If false, the grunt process stops when the test fails.
noColor: false, // If true, protractor will not use colors in its output.
args: {
// Arguments passed to the command
}
},
chrome: {
options: {
args: {
browser: "chrome"
}
}
},
safari: {
options: {
args: {
browser: "safari"
}
}
},
firefox: {
options: {
args: {
browser: "firefox"
}
}
}
},
exec: {
generateAPIDoc : {
command: '<%= config.apiDocCommand %>'
},
buildDependencies :{
command: '<%= config.npmInstallCommand %>'
}
}
});
// load our tasks
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-simple-mocha');
grunt.loadNpmTasks('grunt-karma');
grunt.loadNpmTasks('grunt-protractor-runner');
//for running executables
grunt.loadNpmTasks('grunt-exec');
grunt.registerTask('start-server', 'Start a custom web server', function() {
grunt.log.writeln('Started web server on port 3000');
require('./dist/ThemeLibrary/server.js');
});
//register the tasks
grunt.registerTask('build',
'Compiles all of the assets and copies the files to the build directory for Dev',
[ 'clean:build', 'clean:pkgJson','copy','exec:buildDependencies','jshint','exec:generateAPIDoc','uglify:serverCode','uglify:clientCode','uglify:mainAppFile','simplemocha','start-server', 'karma:unit']
);
grunt.registerTask('build-dev',
'Only copies the source files for Dev',
[ 'copy:sourceFiles','copy:mainAppFile', 'copy:testFiles', 'jshint', 'simplemocha','start-server','karma:unit']
);
};
package.json
{
"name": "ThemeLibrary",
"version": "0.0.1",
"private": true,
"scripts": {
"install": "node ./node_modules/protractor/bin/webdriver-manager update --standalone",
"start": "node ./dist/ThemeLibrary/server.js",
"start": "node ./node_modules/protractor/bin/webdriver-manager start",
"start": "node ./node_modules/protractor/bin/protractor ./dist/Test/integration/config/protractor-config.js"
},
"repository": {
"type": "git",
"url": "https://devops-tools.pearson.com/stash/projects/PTL/repos/pxe_theme_library/browse/ThemeLibrary"
},
"dependencies": {
"express": "*",
"body-parser": "*",
"connect-busboy": "*",
"cookie-parser": "*",
"express-session": "*",
"morgan": "*",
"ejs": "*",
"bcrypt-nodejs": "*",
"mongodb": "*",
"mongoskin": "*",
"connect-flash": "*",
"string": "*"
},
"devDependencies": {
"grunt": "*",
"chai": "*",
"mocha": "*",
"karma": "*",
"grunt-contrib-copy": "*",
"grunt-contrib-clean": "*",
"grunt-contrib-uglify": "*",
"grunt-contrib-jshint": "*",
"grunt-simple-mocha": "*",
"grunt-exec": "*",
"karma-script-launcher": "*",
"karma-chrome-launcher": "*",
"karma-firefox-launcher": "*",
"karma-ie-launcher": "*",
"karma-jasmine": "*",
"karma-phantomjs-launcher": "*",
"karma-story-reporter": "*",
"grunt-karma": "*",
"grunt-cli": "*",
"karma-sauce-launcher": "*",
"phantomjs": "*",
"karma-ng-html2js-preprocessor": "*",
"node-inspector": "*",
"protractor": "0.22.0",
"grunt-protractor-runner": "*"
}
}
「singleRun」をtrueに設定する必要があります。それ以外の場合は、ファイルを監視し、変更があれば再度実行します。