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 相关文章推荐
用于判断用户注册时,密码强度的JS代码
Jan 01 Javascript
一个js写的日历(代码部分网摘)
Sep 20 Javascript
javascript继承之为什么要继承
Nov 10 Javascript
javascript中call apply 与 bind方法详解
Mar 10 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
socket.io学习教程之深入学习篇(三)
Apr 29 Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 Javascript
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
Vue中img的src是动态渲染时不显示的解决
Nov 14 Javascript
jQuery实现电梯导航模块
Dec 22 jQuery
解决基于 keep-alive 的后台多级路由缓存问题
Dec 23 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实现的MySQL通用查询程序
2007/03/11 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
vue组件学习教程
2017/09/09 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
python列表操作使用示例分享
2014/02/21 Python
打包发布Python模块的方法详解
2016/09/18 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
python中Apriori算法实现讲解
2017/12/10 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python web框架 django wsgi原理解析
2019/08/20 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
物业门卫岗位职责
2013/12/28 职场文书
报告会主持词
2014/04/02 职场文书
安全横幅标语
2014/06/09 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
热情服务标语
2014/10/07 职场文书
四群教育工作总结
2015/08/10 职场文书
新教师教学工作总结
2015/08/14 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
python之json文件转xml文件案例讲解
2021/08/07 Python