设为首页 收藏本站
查看: 650|回复: 0

[经验分享] angular单元测试与自动化UI测试实践

[复制链接]

尚未签到

发表于 2017-2-23 12:10:06 | 显示全部楼层 |阅读模式
  关于本文:介绍通过karma与jsmine框架对angular开发的应用程序进行单元与E2E测试。
  




  • angular单元测试与集成测试实践

    • 先决条件
    • 创建项目

      • webstorm中创建空白web项目
      • 创建html、js文件夹

    • 安装框架

      • 安装前端框架

        • 1) 安装bower包管理器
        • 2) 初始化bower.json文件
        • 3) 安装angular等框架

      • 安装服务器端框架

        • 1)安装http-server模块
        • 2)安装其他模块

      • 启动服务器

    • 开始单元测试

      • 编写功能代码
      • 编写测试代码
      • 单元测试配置
      • 运行单元测试
      • 调试单元测试
      • 单元测试覆盖率

    • E2E测试

      • 配置E2E测试
      • 编写e2e测试脚本
      • 执行测试查看测试结果

    • 参考资料
    • 源码地址 https://github.com/stephen-v/angular-e2etest-showcase

先决条件


  • nodejs
  • webstorm
创建项目

webstorm中创建空白web项目
DSC0000.jpg


创建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框架
  

bower install bootstrap -save  

bower install angular -save  

bower install angular-mocks -save  

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

1)安装http-server模块
  

npm 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",
  "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"
  },
  "scripts": {
  "postinstall": "bower install",
  "prestart": "npm install",
  "start": "http-server -a localhost -p 8000 -c-1",
  "pretest": "npm install",
  "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=&quot;en&quot; ng-app=&quot;app&quot;>
  
<head>
  <meta charset=&quot;UTF-8&quot;>
  <title>index</title>
  

  
</head>
  
<body>
  
<div ng-controller=&quot;indexCtrl&quot;>
  <input type=&quot;text&quot; ng-model=&quot;a&quot; value=&quot;0&quot;>
  +
  <input type=&quot;text&quot; ng-model=&quot;b&quot; value=&quot;0&quot;>

  =<span>  
</div>
  
</body>
  
</html>
  
<script src=&quot;/bower_components/angular/angular.min.js&quot;></script>
  
<script src=&quot;/bower_components/angular-mocks/angular-mocks.js&quot;></script>
  
<script src=&quot;/js/index.js&quot;></script>
  启动服务器看到下图效果
DSC0001.jpg


编写测试代码
  在test文件夹中新建文件index-test.js用于编写index.js的单元测试。
'use strict';  
describe('app', function () {
  beforeEach(module('app'));
  describe('indexCtrl', function () {
  it('add 测试', inject(function ($controller) {
  var $scope = {};
  //spec body
  var indexCtrl = $controller('indexCtrl', {$scope: $scope});
  expect(indexCtrl).toBeDefined();
  expect($scope.add(2, 3)).toEqual(5);
  }));
  

  });
  
});

单元测试配置
  初始化karma配置文件,用于配置karma,执行命令
  

karma init  

  在karma配置文件代码中每个节点都有默认注释请参看
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',
  'js/index.js',
  '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: 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,
  

  plugins: [
  'karma-chrome-launcher',
  'karma-jasmine',
  'karma-junit-reporter'
  ],
  

  junitReporter: {
  outputFile: '/test_out/unit.xml',
  suite: 'unit'
  }
  })
  
}
  在package.json scripts 配置测试信息,指定karma文件地址
&quot;test&quot;: &quot;karma start karma.conf.js&quot;,
运行单元测试
  运行命令,执行测试
  

npm test  

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


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

DSC0004.jpg


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

npm install karma-coverage -save  

  在karma.conf.js文件中加入节点
  
// 新增节点用于配置输出文件夹
  
coverageReporter: {
  type: 'html',
  dir: 'coverage'
  },
  
// 新增节点用于配置需要测试的文件地址(这里是controller地址)
  
preprocessors: {'js/*.js': ['coverage']}
  

  
// 新增元素'karma-coverage'
  
plugins: [
  'karma-chrome-launcher',
  'karma-jasmine',
  'karma-junit-reporter',
  'karma-coverage',
  ],
  
// 新增元素 coverage
  
reporters: ['progress', 'coverage'],
  运行单元测试后在目录中生成coverage文件夹,点击index.html可以查看测试覆盖率。
DSC0005.jpg


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>  // to protractor (in this example conf.js).
  // They may include glob patterns.
  specs: ['*.js'],
  

  // Options to be passed to Jasmine-node.
  jasmineNodeOpts: {
  showColors: true, // Use colors in the command line report.
  },
  

  defaultTimeoutInterval: 30000
  
};
  配置package.json scripts脚本节点
&quot;preupdate-webdriver&quot;: &quot;npm install&quot;,  
&quot;update-webdriver&quot;: &quot;webdriver-manager update&quot;,
  
&quot;preprotractor&quot;: &quot;npm run update-webdriver&quot;,
  
&quot;protractor&quot;: &quot;protractor e2e-test/protractor.conf.js&quot;

编写e2e测试脚本
  设计测试用例:文本框a的值录入1,文本框b录入2,期望结果3
describe('index.html', function() {  

  beforeEach(function() {
  browser.get('http://localhost:8000/html');
  });
  

  it('get index html', 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(什么是webdriver http://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  

DSC0006.jpg


参考资料
  [1] 官方测试demo https://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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346236-1-1.html 上篇帖子: 为Node.js编写组件的几种方式 下篇帖子: 使用Babel和ES7创建JavaScript模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表