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自动化单元测试