angularjs中的e2e测试实例


Posted in Javascript onDecember 06, 2014

在上一篇文章里有讲到ng的单元测试,今天来说说e2e(端对端)测试.

当我们测试某个模块的单个功能点时,单元测试最适合,不过当面临用户进行多个页面交互的时候产生bug了,单元测试就不行了,这时候就得用e2e来模拟用户操作还原问题现场.当然利用e2e测试也能够测试程序的健壮性,很多单元测试办不到的事情,e2e测试都能够办到.

之前,ng是利用Angular Scenario Runner来运行e2e测试,现在已经换成Protractor来跑e2e了.

Protractor

Protractor是Angularjs里用来测试e2e的框架,它本身是一个npm模块,内部是构建在WebDriverJS之上的,Protractor能够真正让你的测试用例运行在浏览器上,完全模拟用户的真实行为.

下面贴上它的一些资源地址:

1.Protractor提供的测试api
2.Protractor简单使用例子
3.WebDriverJs指南,这是Protractor依赖的核心,npm模块名为selenium-webdriver

Protractor运行原理

Protractor运行e2e测试所依赖的主要有以下几个东西:

1.WebDriver APIs,就是上面提到的WebDriverJs,是由Selenium提供给前端测试用的相关js api
2.Selenium Server,一个后端jar包,用来负责跟浏览器驱动进行通讯用的
3.WebDriver browser drivers,用来显示真实网站内容并与Selenium Server通讯用,这里才是传递真实浏览器操作的地方

整个运行过程如下图

angularjs中的e2e测试实例

想了解更多关于这几个组件之前交互的可以点击这里

利用ng种子项目来讲解e2e

我们利用ng官方提供的种子项目来讲解一个真实的e2e例子,首先利用下面命令获取种子项目

git clone https://github.com/angular/angular-seed.git

然后运行

npm install

安装相关的所有依赖文件

这里先说下运行e2e测试需要的配置文件,可以看到test/protractor-conf.js这个文件就是用来配置相关功能的,重点说下几个属性

1.specs 代表要运行的测试文件路径,这里写的是e2e/*.js
2.baseUrl 代表测试文件中浏览器间跳转页面的根地址
3.capabilities 代表使用哪个浏览器来运行测试用例,比如使用chrome,可以这样设置

capabilities: {

    'browserName': 'chrome'

  }

framework 代表使用的哪种测试框架,这里使用的是jasmine

想了解更多关于这个配置文件的可以点击这里查看

说完了配置文件,我们再来看看测试用例的写法,先贴上一个官网上的例子

'use strict';
/* https://github.com/angular/protractor/blob/master/docs/getting-started.md */
describe('my app', function() {
  browser.get('index.html');

  it('should automatically redirect to /view1 when location hash/fragment is empty', function() {

    expect(browser.getLocationAbsUrl()).toMatch("/view1");

  });


  describe('view1', function() {
    beforeEach(function() {

      browser.get('index.html#/view1');

    });


    it('should render view1 when user navigates to /view1', function() {

      expect(element.all(by.css('[ng-view] p')).first().getText()).

        toMatch(/partial for view 1/);

    });
  });


  describe('view2', function() {
    beforeEach(function() {

      browser.get('index.html#/view2');

    });


    it('should render view2 when user navigates to /view2', function() {

      expect(element.all(by.css('[ng-view] p')).first().getText()).

        toMatch(/partial for view 2/);

    });
  });

});

 
首先上面的语法是jasmine框架支持的写法,不了解它的用法的可以点击这里 

这里只说下上面例子里关于protractor提供的一些常用方法与属性

1.browser,全局对象,代表当前浏览器的一个实例,常用的get方法用来实现浏览器改变地址
2.element,全局对象,提供像jquery里负责查找文档元素的功能,常于by对象联合使用
3.by, 全局对象,提供一个选择器类型,比如可以通过css,model,bind等特性来查找一个元素

关于element与by的方法可以参考上面的protractor api文档

说了这么多,该跑一跑上面的测试用例了,命令比较简单

npm run update-webdriver

这个负责下载相关的浏览器驱动与selenium-server 本地jar包,一般情况下这个都是会失败的,因为这两个资源都在google服务器那,所以可以利用浏览器翻墙单独下载,地址如下:

1.Chrome Driver地址,一般下载chromedriver_2.9.zip这个文件.

2.selenium-server 本地jar包 下载,一般下载selenium-server-standalone-2.40.0.jar这个文件.

然后把selenium-server拷到protractor包里的selenium文件夹里去,假如上面的命令超时之后,这里也会出现文件不过是空的,直接替换就可以;还要把chromedriver_2.9.zip解压之后的文件拷到这里

最后运行下面的命令可以看到测试结果了

npm run protractor

想了解更多关于ng种子项目里的命令行,可以点击这里查看

总结

ng的e2e测试要比单元测试配置要繁琐的多,不过它能做的事情也很多,非常值的你也试一试,有什么问题可以回复到评论里去.

Javascript 相关文章推荐
JQuery 入门实例1
Jun 25 Javascript
picChange 图片切换特效的函数代码
May 06 Javascript
jQuery简单tab切换效果实现方法
Apr 08 Javascript
浅析JS异步加载进度条
May 05 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
基于js实现二级下拉联动
Dec 17 Javascript
js读取json文件片段中的数据实例
Mar 09 Javascript
基于vue-resource jsonp跨域问题的解决方法
Feb 03 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
Vue 自定义指令功能完整实例
Sep 17 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
Sep 25 Javascript
JS封装cavans多种滤镜组件
Feb 15 Javascript
angularjs中的单元测试实例
Dec 06 #Javascript
angularjs指令中的compile与link函数详解
Dec 06 #Javascript
angularjs的一些优化小技巧
Dec 06 #Javascript
JavaScript开发人员的10个关键习惯小结
Dec 05 #Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 #Javascript
node.js中实现同步操作的3种实现方法
Dec 05 #Javascript
node.js实现BigPipe详解
Dec 05 #Javascript
You might like
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
JavaScript 对象模型 执行模型
2010/10/15 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python IDLE入门简介
2017/12/08 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
Django自定义用户认证示例详解
2018/03/14 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
super关键字的用法
2012/04/10 面试题
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
Linux开机引导的步骤是什么
2014/02/26 面试题
毕业自荐书
2013/12/09 职场文书
上班看电影检讨书
2014/02/12 职场文书
品质管理部岗位职责范文
2014/03/01 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
作文批改评语大全
2014/04/23 职场文书
教师节学生演讲稿
2014/09/03 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
团员自我评价范文
2015/03/10 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
公司2015年终工作总结
2015/05/26 职场文书
创业计划书之书店
2019/09/10 职场文书