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 相关文章推荐
基于jquery的一个拖拽到指定区域内的效果
Sep 21 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
Oct 09 Javascript
nullJavascript中创建对象的五种方法实例
May 07 Javascript
jquery的ajax异步请求接收返回json数据实例
Jun 16 Javascript
Backbone.js中的集合详解
Jan 14 Javascript
jQuery中inArray方法注意事项分析
Jan 25 Javascript
node+experss实现爬取电影天堂爬虫
Nov 20 Javascript
Vue.js bootstrap前端实现分页和排序
Mar 10 Javascript
如何让微信小程序页面之间的通信不再变困难
Jun 03 Javascript
如何使用Javascript中的this关键字
May 28 Javascript
解决vue一个页面中复用同一个echarts组件的问题
Jul 19 Javascript
Vue实现简单的拖拽效果
Aug 25 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
phpBB BBcode处理的漏洞
2006/10/09 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
详解django自定义中间件处理
2018/11/21 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python连接字符串过程详解
2020/01/06 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
档案接收函范文
2014/01/10 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
总经理任命书范本
2014/06/05 职场文书
欢迎词怎么写
2015/01/23 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
【海涛教你打DOTA】虚空假面第一视角骨弓3房29杀
2022/04/01 DOTA