AngularJs  E2E Testing 详解


Posted in Javascript onSeptember 02, 2016

        当一个应用的复杂度、大小在增加时,使得依靠人工去测试新特性的可靠性、抓Bug和回归测试是不切实际的。

为了解决这个问题,我们建立了Angular Scenario Runner,模仿用户的操作,帮助我们去验证angular应用的健壮性。

一、   总括

我们可以在javascript中写情景测试(scenario test),描述我们的应用发生的行为,在某个状态下给与某些互动。一个情景包含一个或者多个”it”块(我们可以将这些当作对我们应用的要求),依次由命令(command)和期望(expectation)组成。command告诉Runner在应用中做某些事情(例如转到某个页面或者单击某个按钮),expectation告诉runner去判断一些关于状态的东西(例如某个域的值或者当前的URL)。如果任何expectation失败了,那么runner标记这个”it”为”false”,然后继续下一个”it”。Scenario也可以拥有” beforeEach”和” afterEach”block,这些block会在每一个”it”block之前或者之后运行,不管它是否通过。

AngularJs  E2E Testing 详解

除了上述元素外,scenario也可以包含helper function,避免在”it”block中有重复的代码。

这里是一个简单的scenario例子: 

describe('Buzz Client', function() {
 it('should filter results', function() {
  input('user').enter('jacksparrow');
  element(':button').click();
  expect(repeater('ul li').count()).toEqual(10);
  Input('filterText').enter('Bees');
  expect(repeater('ul li').count()).toEqual(1);
 });
});

这个scenario描述了网络客户端的要求,明确地,它应该有过滤user的能力。它开始的时候,输入了一个值到”user”输入框中,单击页面上唯一的按钮,然后它验证是否有10个项目列表。然后,它输入”Bees”到”filterText”的输入框中,然后验证那个列表是不是会减少到只有一个项。

下面的API章节,列出了在Runner中可用的command和expectation。

二、   API

源代码:https://github.com/angular/angular.js/blob/master/src/ngScenario/dsl.js

pause()

暂停执行测试,直到我们在console中调用resume()(也可以在Runner界面中点击resume链接)

sleep(seconds)

暂停测试执行N秒。

browser().navigateTo(url)

在tset frame中加载指定url。

  browser().navigateTo(url,fn)

在test frame中加载fn返回的url地址。这里的url参数只是用作测试输出。当目的url是动态的时候可以使用这个API(写测试的时候,地址还是未知的)。

browser().reload()

在test frame中刷新当前加载的页面。 

  browser().window().href()

返回test frame当前页面的window.location.href。 

browser().window().path()

返回test frame当前页面的window.location.pathname。 

browser().window().search()

返回test frame当前页面的window.location.search。

browser().window().hash()

返回test frame当前页面的window.location.hash(不包含#)。 

browser().location().url()

返回test frame 当前页面的$location.url()的返回结果(http://docs.angularjs.org/api/ng.$location)

  browser().location().path()

返回test frame 当前页面的$location. path ()的返回结果(http://docs.angularjs.org/api/ng.$location) 

  browser().location().search()

返回test frame 当前页面的$location. search ()的返回结果(http://docs.angularjs.org/api/ng.$location)

  browser().location().hash()

返回test frame 当前页面的$location. hash ()的返回结果(http://docs.angularjs.org/api/ng.$location)

expect(future).{matcher}

判断给定的期望(future)值是否满足matcher。所有API的声明都返回一个在它们执行完毕之后获取到的一个指定值的future对象。matcher是使用angular.scenario.matcher定义的,他们使用futures的值去执行expectation。例如:

            expect(browser().location().href()).toEqual(‘http://www.google.com');

expect(future).not().{matcher}

判断给定future的值是否与指定的matcher的预期相反。 

  using(selector,label)

Scopes the next DSL element selection.(大概是限定选择器的作用域,label估计是用于测试输出)

例子:

          using('#foo', "'Foo' text field").input('bar') 

  binding(name)

返回第一个与指定的name匹配的绑定(也许是跟ng-bind相关)。 

  input(name).enter(value)

输入指定的value到name指定的表单域。

input(name).check()

选中或者解除选中指定name的checkbox。

input(name).select(value)

选中指定name的radio中值为value的input[type=” radio”]。 

  input(name).val()

返回指定name的input的当前值。

repeater(selector,label).count()

返回与指定selector(jQuery selector)匹配的repeater的行数。label只用作测试输出。

              repeater('#products table', 'Product List').count() //number of rows

  repeater(selector,label).row(index)

返回一个数组,绑定指定selector(jQuery selector)匹配的repeater中指定index的行。label仅仅用于测试输出。

              repeater('#products table', 'Product List').row(1) //all bindings in row as an array 

repeater(selector,label).column(binding)

返回一个数组,值为指定selector(jQuery selector)匹配的repeater中符合指定binding的列。label仅仅用于测试输出。

             repeater('#products table', 'Product List').column('product.name') //all values across all rows in an array

  select(name).option(value)

选择指定name的select中指定value的option。 

  select(name).option(value1,value2)

选择指定name的select中指定value的option(多选)。 

element(selector,label).count()

返回与指定selector匹配的元素的个数。label仅仅用作测试输出。 

  element(selector,label).click()

单击与指定selector匹配的元素。label仅仅用作测试输出。 

  element(selector,label).query(fn)

执行指定的fn(selectedElements,done),selectedElement就是与指定selector匹配的元素集合;而done是一个function,会在fn执行完毕后执行。label仅仅用作测试输出。

  element(selector,label).{method}()

返回在指定selector匹配的元素上执行method的返回值。method可以是以下的jQuery方法:val、text、html、height、innerHeight、outerHeight、width、innerWidth、outerWidth、position、scrollLelft、scrollTop、offset。label仅仅用作测试输出。

element(selector,label).{method}(value)

在指定selector匹配的元素上执行指定method,并以key、value作为参数。method可以是以下的jQuery方法:val、text、html、height、innerHeight、outerHeight、width、innerWidth、outerWidth、position、scrollLelft、scrollTop、offset。label仅仅用作测试输出。

element(selector,label).{method}(key)

返回在指定selector匹配的元素上执行指定method的结果,这些方法可以是以下的jQuery方法:attr,prop,css。label仅仅用作测试输出。 

element(selector,label).{method}(key,value)

在指定的selector匹配的元素上执行method并以key、value作为参数,这些方法可以是以下的jQuery方法:attr,prop,css。label仅仅用作测试输出。

javascript是动态类型的语言,带来了强大力量的表达式,但它同时让我们从编译器中几乎得不到任何帮助。因此,我们很强烈地感受到,任何用javascript写的代码都需要进行大量、全面的测试。angular有很多特性,可以让我们更加容易地测试我们的应用。所以我们没有借口不去写测试。(-_-!!)

        以上就是对 AngularJs E2E Testing 的资料整理,后续继续增加相关资料,谢谢大家对本站的支持!

Javascript 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
Mar 10 Javascript
JavaScript与C# Windows应用程序交互方法
Jun 29 Javascript
JavaScript 继承详解(三)
Jul 13 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
Nov 30 Javascript
Dojo 学习要点
Sep 03 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
Nov 15 Javascript
图片无缝滚动代码(向左/向下/向上)
Apr 10 Javascript
jquery的trigger和triggerHandler的区别示例介绍
Apr 20 Javascript
基于vue组件实现猜数字游戏
May 28 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
Sep 27 Javascript
js实现搜索栏效果
Nov 16 Javascript
JavaScript实现公告栏上下滚动效果
Mar 13 Javascript
解决node.js安装包失败的几种方法
Sep 02 #Javascript
js两种拼接字符串的简单方法(必看)
Sep 02 #Javascript
AngularJs Understanding the Controller Component
Sep 02 #Javascript
JS 拼凑字符串的简单实例
Sep 02 #Javascript
AngularJs Understanding the Model Component
Sep 02 #Javascript
浅谈js中StringBuffer类的实现方法及使用
Sep 02 #Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 #Javascript
You might like
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
PHP中动态显示签名和ip原理
2007/03/28 PHP
详解YII关联查询
2016/01/10 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
基于jquery的划词搜索实现(备忘)
2010/09/14 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
angular动态表单制作
2018/02/23 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python生成随机图形验证码详解
2017/11/08 Python
Python补齐字符串长度的实例
2018/11/15 Python
python中嵌套函数的实操步骤
2019/02/27 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
django 简单实现登录验证给你
2019/11/06 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
想学画画?python满足你!
2020/12/24 Python
音乐节策划方案
2014/06/09 职场文书