转自:http://www.cnblogs.com/vipyoumay/p/5331787.html
关于本文:介绍通过karma与jsmine框架对angular开发的应用程序进行单元与E2E测试。
先决条件
- nodejs
- webstorm
创建项目
webstorm中创建空白web项目
创建html、js文件夹
在项目中创建2个文件夹分别用于存放项目中用到的html、js文件。
安装框架
安装前端框架
项目中的前端框架主要为angularjs相关的框架,为了安装框架方便可安装bower包管理器。
1) 安装bower包管理器
在webstorm的terminal中执行脚本
- npm install bower -save
2) 初始化bower.json文件
执行脚本生成bower.json文件,用于管理bower的依赖和配置。
- bower init
3) 安装angular等框架
除了项目要用到的angular框架外还需要安装angular-mocks框架
- install bootstrap -save
- install angular -install angular-mocks -save
安装服务器端框架
服务器依赖于nodejs,需要安装nodejs的包,首先在根目录下创建package.json文件。
1)安装http-server模块
- install http-server -save
2)安装其他模块
- jasmine-core:javascript单元测试框架;
- karma:模拟javascript脚本在各种浏览器执行的工具;
- karma-chrome-launcher: 在chrome浏览器执行的工具;
- karma-jasmine: jasmine-core在karma中的适配器;
- karma-junit-reporter: 生成junit报告;
- protractor:E2E测试框架
启动服务器
要启动node服务器需要在package.json中配置script节点,dependencies中定义依赖包,在script配置start节点用于启动服务器,test节点的内容会在后面讲解。
- "name": "angularjs-test",
- "version": "0.0.1",21)">"dependencies": {
- "bower": "^1.7.7",
- "http-server": "^0.9.0",
- "jasmine-core": "^2.4.1",
- "karma": "^0.13.22",
- "karma-chrome-launcher": "^0.2.3",
- "karma-jasmine": "^0.3.8",
- "karma-junit-reporter": "^0.4.1",
- "protractor": "^3.2.1"
- },21)">"scripts": {
- "postinstall": "bower install",
- "prestart": "npm install",
- "start": "http-server -a localhost -p 8000 -c-1",
- "pretest": "test": "karma start karma.conf.js",
- "test-single-run": "karma start karma.conf.js --single-run"
- }
配置后运行命令,启动服务器,浏览器上输入http://localhost:8000
- npm start
开始单元测试
编写功能代码
在文件js中新建js文件index.js。在index.js中定义congroller,实现简单累加方法add,代码如下:
- /** * Created by stephen on 2016/3/24. */
-
- (function (angular) {
- angular.module('app', []).
- controller('indexCtrl', function ($scope) {
- $scope.add = function (a, b) {
- if(a&&b)
- return Number(a) + Number(b)
- return 0;
- }
- });
- })(window.angular);
在文件html中新建html文件index.html,加入两个输入框用户获取输入,当输入后绑定controller中的add方法实现计算器功能,代码如下:
- <!DOCTYPE html>
- <html lang="en" ng-app"app"> headMeta charset"UTF-8"title>index</title> </headbodydiv ngcontroller"indexCtrl"input type"text"model"a" value"0"> + "b"> =span id'result'>{{add(a,b)}}/span> </div/body> </htmlscript src"/bower_components/angular/angular.min.js"></script> <script src="/bower_components/angular-mocks/angular-mocks.js"></script> "/js/index.js"/script>
启动服务器看到下图效果
编写测试代码
在test文件夹中新建文件index-test.js用于编写index.js的单元测试。
- 'use strict';
- describe(function () {
- beforeEach(module('app'));
- describe(function () {
- it('add 测试', inject(function ($controller) {
- var $scope = {};
- //spec body
- var indexCtrl = $controller({$scope: $scope});
- expect(indexCtrl).toBeDefined();
- expect($scope.add(2, 3)).toEqual(5);
- }));
- });
- });
单元测试配置
初始化karma配置文件,用于配置karma,执行命令
- karma init
- 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'],
-
-
- // list of files / patterns to load in the browser
- files: [
- 'bower_components/angular/angular.min.js',
- 'bower_components/angular-mocks/angular-mocks.js',21)">'js/index.js',21)">'test/index-test.js'
- ],
-
- // 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: // 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,
- plugins: [
- 'karma-chrome-launcher',21)">'karma-jasmine',21)">'karma-junit-reporter'
- ],
-
- junitReporter: {
- outputFile: '/test_out/unit.xml',
- suite: 'unit'
- }
- })
- }
在package.json scripts 配置测试信息,指定karma文件地址
运行单元测试
运行命令,执行测试
- test
运行结果如下,可以看到通过测试:
调试单元测试
除了运行测试外,很多时候需要调试测试,在karma弹出网页中点击debug,进入http://localhost:9876/debug.html页面,就可以用chrome自带的调试工具调试代码了:
单元测试覆盖率
如果需要对单元测试覆盖率进行统计,可以安装karma-coverage并配置karma文件。这样在单元测试完成后,会生成测试覆盖率报告文档。
- install karma-coverage -save
在karma.conf.js文件中加入节点
运行单元测试后在目录中生成coverage文件夹,点击index.html可以查看测试覆盖率。
E2E测试
e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样。简而言之,它从一个用户的角度出发,认为整个系统都是一个黑箱,只有UI会暴露给用户。
配置E2E测试
新建文件夹e2e-test新建protractor.conf.js文件,用于配置protractor框架,代码如下。
- exports.config = {
-
- allScriptsTimeout: 11000,
-
- baseUrl: 'http://localhost:8000/app/',
-
- // Capabilities to be passed to the webdriver instance.
- capabilities: {
- 'browserName': 'chrome'
- },
-
- framework: 'jasmine',
-
- // Spec patterns are relative to the configuration file location passed
- // to protractor (in this example conf.js).
- // They may include glob patterns.
- specs: ['*.js'],
-
- // Options to be passed to Jasmine-node.
- jasmineNodeOpts: {
- showColors: // Use colors in the command line report.
- },
- defaultTimeoutInterval: 30000
- };
配置package.json scripts脚本节点
编写e2e测试脚本
设计测试用例:文本框a的值录入1,文本框b录入2,期望结果3
- describe('index.html',255)">function() {
-
- beforeEach(function() {
- browser.get('http://localhost:8000/html');
- });
-
- it('get index html',255)">function() {
-
- var a = element(by.model('a'));
- var b = element(by.model('b'));
- a.sendKeys(1);
- b.sendKeys(2);
- var result = element(by.id('result'));
- expect(result.getText()).toEqual('3');
- });
- });
执行测试查看测试结果
需要执行命名,查看是否更新webdriver(什么是webdriverhttp://sentsin.com/web/658.html),
手动安装protractor至全局
npm i -g protractor
注:安装或更新webdriver需要FQ,请在webstrom中设置代理地址。
在webstrom
中切换至Terminal
窗口,在Terminal
窗口通过以下方式设置代理:
- set PROXY=http://localhost:1080
- set HTTP_PROXY=%PROXY%
- set HTTPS_PROXY=%PROXY%
代理设置成功后,运行以下命令
- npm run update-webdriver
执行e2e测试,这是会弹出浏览器,自动点击浏览器,录入脚本输入完成自动化e2e测试,其本质还是调用selenium测试。
- npm run protractor
参考资料
[1] 官方测试demohttps://github.com/angular/angular-seed
[2] protractor 官方文档http://angular.github.io/protractor/#/tutorial
[3] 自动化E2E测试http://sentsin.com/web/658.html
[4] karma官方文档https://karma-runner.github.io/latest/intro/configuration.html
[5] angular单元测试官方文档https://docs.angularjs.org/guide/unit-testing
源码地址https://github.com/stephen-v/angular-e2etest-showcase
上面代码中的LDAPCtrlDef是通过define把ldap.controller.js引入进来时的变量,然后$scope,ldapSrv,uiGridUtils等都是需要注入controller的参数。
- var ldapCtrlInst = $injector.instantiate(LDAPCtrlDef,{
- $scope:scope,ldapSrv:ldapSrv,uiGridUtils:{
- createGridOptions:function(){return {};},resetGridSelection:jasmine.createSpy('resetGridSelection')
- },modalUtils:{
- showDlg:function(){
- var deferred = $q.defer();
- deferred.resolve("");
- return deferred.promise;
- }
- }
- });