AngularJS实际项目应用——单元测试框架设计

前端之家收集整理的这篇文章主要介绍了AngularJS实际项目应用——单元测试框架设计前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转自: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中执行脚本

  1. npm install bower -save

2) 初始化bower.json文件

执行脚本生成bower.json文件,用于管理bower的依赖和配置。

  1. bower init

3) 安装angular等框架

除了项目要用到的angular框架外还需要安装angular-mocks框架

  1. install bootstrap -save
  1. install angular -install angular-mocks -save

安装服务器端框架

服务器依赖于nodejs,需要安装nodejs的包,首先在根目录下创建package.json文件

1)安装http-server模块

  1. 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节点的内容会在后面讲解。

  1. "name": "angularjs-test",
  2. "version": "0.0.1",21)">"dependencies": {
  3. "bower": "^1.7.7",
  4. "http-server": "^0.9.0",
  5. "jasmine-core": "^2.4.1",
  6. "karma": "^0.13.22",
  7. "karma-chrome-launcher": "^0.2.3",
  8. "karma-jasmine": "^0.3.8",
  9. "karma-junit-reporter": "^0.4.1",
  10. "protractor": "^3.2.1"
  11. },21)">"scripts": {
  12. "postinstall": "bower install",
  13. "prestart": "npm install",
  14. "start": "http-server -a localhost -p 8000 -c-1",
  15. "pretest": "test": "karma start karma.conf.js",
  16. "test-single-run": "karma start karma.conf.js --single-run"
  17. }

配置后运行命令,启动服务器,浏览器上输入http://localhost:8000

  1. npm start

开始单元测试

编写功能代码

文件js中新建js文件index.js。在index.js中定义congroller,实现简单累加方法add,代码如下:

  1. /** * Created by stephen on 2016/3/24. */
  2.  
  3. (function (angular) {
  4. angular.module('app', []).
  5. controller('indexCtrl', function ($scope) {
  6. $scope.add = function (a, b) {
  7. if(a&&b)
  8. return Number(a) + Number(b)
  9. return 0;
  10. }
  11. });
  12. })(window.angular);

文件html中新建html文件index.html,加入两个输入框用户获取输入,当输入后绑定controller中的add方法实现计算器功能代码如下:

  1. <!DOCTYPE html>
  2. <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的单元测试。

  1. 'use strict';
  2. describe(function () {
  3. beforeEach(module('app'));
  4. describe(function () {
  5. it('add 测试', inject(function ($controller) {
  6. var $scope = {};
  7. //spec body
  8. var indexCtrl = $controller({$scope: $scope});
  9. expect(indexCtrl).toBeDefined();
  10. expect($scope.add(2, 3)).toEqual(5);
  11. }));
  12. });
  13. });

单元测试配置

初始化karma配置文件,用于配置karma,执行命令

  1. karma init

在karma配置文件代码中每个节点都有默认注释请参看

  1. module.exports = function (config) {
  2. config.set({
  3.  
  4. // base path that will be used to resolve all patterns (eg. files,exclude)
  5. basePath: './',
  6.  
  7.  
  8. // frameworks to use
  9. // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
  10. frameworks: ['jasmine'],
  11.  
  12.  
  13. // list of files / patterns to load in the browser
  14. files: [
  15. 'bower_components/angular/angular.min.js',
  16. 'bower_components/angular-mocks/angular-mocks.js',21)">'js/index.js',21)">'test/index-test.js'
  17. ],
  18.  
  19. // test results reporter to use
  20. // possible values: 'dots','progress'
  21. // available reporters: https://npmjs.org/browse/keyword/karma-reporter
  22. reporters: ['progress'],
  23.  
  24.  
  25. // web server port
  26. port: 9876,
  27.  
  28.  
  29. // enable / disable colors in the output (reporters and logs)
  30. colors: true,
  31.  
  32.  
  33. // level of logging
  34. // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
  35. logLevel: config.LOG_INFO,
  36.  
  37.  
  38. // enable / disable watching file and executing tests whenever any file changes
  39. autoWatch: // start these browsers
  40. // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
  41. browsers: ['Chrome'],
  42. // Continuous Integration mode
  43. // if true,Karma captures browsers,runs the tests and exits
  44. singleRun: false,
  45. plugins: [
  46. 'karma-chrome-launcher',21)">'karma-jasmine',21)">'karma-junit-reporter'
  47. ],
  48.  
  49. junitReporter: {
  50. outputFile: '/test_out/unit.xml',
  51. suite: 'unit'
  52. }
  53. })
  54. }

在package.json scripts 配置测试信息,指定karma文件地址

"test": "karma startkarma.conf.js",

运行单元测试

运行命令,执行测试

  1. test

运行结果如下,可以看到通过测试:

调试单元测试

除了运行测试外,很多时候需要调试测试,在karma弹出网页中点击debug,进入http://localhost:9876/debug.html页面,就可以用chrome自带的调试工具调试代码了:

单元测试覆盖率

如果需要对单元测试覆盖率进行统计,可以安装karma-coverage并配置karma文件。这样在单元测试完成后,会生成测试覆盖率报告文档。

  1. install karma-coverage -save

在karma.conf.js文件中加入节点

  1. // 新增节点用于配置输出文件
  2. coverageReporter: {
  3. type: 'html',
  4. dir: 'coverage'
  5. },
  6. // 新增节点用于配置需要测试的文件地址(这里是controller地址)
  7. preprocessors: {'js/*.js': ['coverage']}
  8.  
  9. // 新增元素'karma-coverage'
  10. plugins: [
  11. 'karma-junit-reporter',21)">'karma-coverage',
  12. ],
  13. // 新增元素 coverage
  14. reporters: ['progress', 'coverage'],

运行单元测试后在目录中生成coverage文件夹,点击index.html可以查看测试覆盖率。

E2E测试

e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样。简而言之,它从一个用户的角度出发,认为整个系统都是一个黑箱,只有UI会暴露给用户

配置E2E测试

新建文件夹e2e-test新建protractor.conf.js文件,用于配置protractor框架,代码如下。

  1. exports.config = {
  2.  
  3. allScriptsTimeout: 11000,
  4.  
  5. baseUrl: 'http://localhost:8000/app/',
  6.  
  7. // Capabilities to be passed to the webdriver instance.
  8. capabilities: {
  9. 'browserName': 'chrome'
  10. },
  11.  
  12. framework: 'jasmine',
  13.  
  14. // Spec patterns are relative to the configuration file location passed
  15. // to protractor (in this example conf.js).
  16. // They may include glob patterns.
  17. specs: ['*.js'],
  18.  
  19. // Options to be passed to Jasmine-node.
  20. jasmineNodeOpts: {
  21. showColors: // Use colors in the command line report.
  22. },
  23. defaultTimeoutInterval: 30000
  24. };

配置package.json scripts脚本节点

"preupdate-webdriver": "npminstall", "update-webdriver": "webdriver-managerupdate",21)">"preprotractor": runupdate-webdriver",21)">"protractor": "protractore2e-test/protractor.conf.js"

编写e2e测试脚本

设计测试用例:文本框a的值录入1,文本框b录入2,期望结果3

  1. describe('index.html',255)">function() {
  2.  
  3. beforeEach(function() {
  4. browser.get('http://localhost:8000/html');
  5. });
  6.  
  7. it('get index html',255)">function() {
  8.  
  9. var a = element(by.model('a'));
  10. var b = element(by.model('b'));
  11. a.sendKeys(1);
  12. b.sendKeys(2);
  13. var result = element(by.id('result'));
  14. expect(result.getText()).toEqual('3');
  15. });
  16. });

执行测试查看测试结果

需要执行命名,查看是否更新webdriver(什么是webdriverhttp://sentsin.com/web/658.html),
手动安装protractor至全局
npm i -g protractor

注:安装或更新webdriver需要FQ,请在webstrom中设置代理地址
webstrom中切换至Terminal窗口,在Terminal窗口通过以下方式设置代理:

  1. set PROXY=http://localhost:1080
  2. set HTTP_PROXY=%PROXY%
  3. set HTTPS_PROXY=%PROXY%

代理设置成功后,运行以下命令

  1. npm run update-webdriver

执行e2e测试,这是会弹出浏览器,自动点击浏览器,录入脚本输入完成自动化e2e测试,其本质还是调用selenium测试。

  1. 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


=================================================================

上面这篇文章是简单的angular单元测试,如果用到requirejs,angularAMD等框架,配置起来会更复杂一些,具体的可以参考一下这篇文章https://monkeyissexy.github.io/2016/08/17/karma_jasmine_with_requirejs_angularjs/

这里我要说几点:
1)controller中用了ngload类似的异步加载机制,去加载文件,在用karma跑的时候有时候会出错,因为不能保证ngload已经把文件加载进来了。我们看上面的测试case都是用$controller方法去实例化controller的,这样就会出我说的问题。所以需要改用$injector.instantiate这个方法去实例化,用instantiate这个方法,对controller的写法有要求,可以参考我介绍controller的文章,怎么写controller,下面看一个例子:
  1. var ldapCtrlInst = $injector.instantiate(LDAPCtrlDef,{
  2. $scope:scope,ldapSrv:ldapSrv,uiGridUtils:{
  3. createGridOptions:function(){return {};},resetGridSelection:jasmine.createSpy('resetGridSelection')
  4. },modalUtils:{
  5. showDlg:function(){
  6. var deferred = $q.defer();
  7. deferred.resolve("");
  8. return deferred.promise;
  9. }
  10. }
  11. });
上面代码中的LDAPCtrlDef是通过define把ldap.controller.js引入进来时的变量,然后$scope,ldapSrv,uiGridUtils等都是需要注入controller的参数。

2)由于是单元测试,不需要真正调用后台的service,可以用下面的方式进行模拟
  1. var deferred = $q.defer();
  2. deferred.resolve({resultCode:"200",resultObject:[]});
  3. spyOn(ldapSrv,'listLDAP').and.returnValue(deferred.promise);
3)在it方法里记得调用scope.$digest();触发angular的变量改变绑定机制

猜你在找的Angularjs相关文章