What is Karma
Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma。Karma是一个让人感到非常神秘的名字,表示佛教中的缘分,因果报应,比Cassandra这种名字更让人猜不透!
Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuous integration)工具,也可和其他代码编辑器一起使用。这个测试工具的一个强大特性就是,它可以监控(Watch)文件的变化,然后自行执行,通过console.log显示测试结果。
Install Karma
Using below commands to install Karma with npm
npm install -g karma npm install -g karma-cli npm install karma-jasmine karma-chrome-launcher [optional]
Karma Config
karma.conf.js
- basePath
- frameworks
- files
- excludes
- port
- browsers
Example:
// Karma configuration
// Generated on Fri Aug 14 2015 14:42:50 GMT-0400 (Eastern Daylight Time)
module.exports = function (config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine', 'requirejs'],
// list of files / patterns to load in the browser
files: [
'test-main.js',
{ pattern: 'Web/src/**/*.js', included: false },
{ pattern: 'Web/src/**/*.html', included: false },
{ pattern: 'Web/tests/**/*.test.js', included: false },
],
// list of files to exclude
exclude: [
'Web/src/main.js',
'Web/src/**/*.test.js'
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress'],
// web server port
port: 9876,
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['Chrome'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: false
})
}
test-main.js
test-main.js is the entrance of the test run.
Example:
var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;
// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function (file) {
if (TEST_REGEXP.test(file)) {
// Normalize paths to RequireJS module names.
// If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
// then do not normalize the paths
var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
allTestFiles.push(normalizedTestModule);
}
});
require.config({
// Karma serves files under /base, which is the basePath from your config file
baseUrl: '/base',
paths: {
'angular': 'http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular.min',
'angularMocks': 'http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular-mocks',
text: 'http://cdnjs.cloudflare.com/ajax/libs/require-text/2.0.12/text.min',
'lodash': 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min',
},
shim: {
'angular': { exports: 'angular' },
'angularMocks': { deps: ['angular'] }
},
// dynamically load all test files
deps: allTestFiles,
// we have to kickoff jasmine, as it is asynchronous
callback: window.__karma__.start
});
Write Typescript UT
Step
1. Create module
var mockedModule = angular.module("mock.module", []);
Create module with $provide
var mockedModule = module('mock.module', ($provide) => {
//register mocked services/values to module runtime
$provide.value('$translate', mockedTranslate);
});
2. Register filter/controller to module
mockedModule.filter(targetFilter.name, targetFilter.filterClass);
3. Apply module
angular.mock.module("mock.module");
4. Inject the filter/scope/controller or other resources
var fieldFilter
inject(($filter) => {
fieldFilter = $filter(targetFilter.name);
});
or use new keyword to create an instance, this can skip the step 1,2 and 3
fieldFilter = new targetModule.filterClass(scope, mockedDataService, mockedBusinessService);
5. Write Cases
it("Should be able to convert number to eggs", () => {
expect(fieldFilter(1)).toEqual("1 egg");
expect(fieldFilter(2)).toEqual("2 eggs");
});
Run UT
At the root folder of the source code, for example,
d:/src/
Run the below command:
karma start
Debug
Click the “Debug” button on the page to enter debug mode
Tips
- It will run UT automatically when it detected file changes
- Terminates it press
Crtl + C
References
Karma Introduction
Karma和Jasmine自动化单元测试


