接口测试框架引入redis
介绍
Tellurium自动化测试框架 (Tellurium)是用于测试Web应用程序的框架,它由Jian Fang于2007年6月启动,并于2008年6月成为Google Code的开源项目 。它已定期发布,目前为0.7 .0。 Selenium框架 ,但具有不同的测试概念。 大多数现有的Web测试框架(例如Selenium)主要集中于单个UI元素。 另一方面,碲将整个UI元素视为小部件; 将该元素称为UI模块。ui.Container(uid: "GoogleSearchModule", clocator: [tag: "td"]){
InputBox(uid: "Input", clocator: [title: "Google Search"])
SubmitButton(uid: "Search", clocator: [name: "btnG", value: "Google
Search"])
SubmitButton(uid: "ImFeelingLucky", clocator: [value: "I'm Feeling
Lucky"])
}
如本示例所示,UI模块是一组带有标签和属性的嵌套UI元素。 UI模块的采用使Tellurium富有表现力,并且对更改具有鲁棒性。 它也很容易表示动态Web内容,并且易于维护。
该框架包括以下组件:
- Trump-一个Firefox插件,适当地是Tellurium UI模块插件 ,在用户从要测试的网页中选择UI元素后,该模块会自动生成UI模块。
- Tellurium IDE –一个Firefox插件,可记录用户操作并生成Tellurium测试脚本,包括UI模块定义,操作和断言。 脚本是用Groovy编写的。
- TelluriumWorks –一个独立的Java Swing应用程序,用于编辑和运行Tellurium测试脚本。 用于IntelliJ IDEA的IDE插件正在开发中。
- JavaScript Widget Extensions-流行JavaScript框架(如Dojo和jQuery UI)的扩展。 这允许用户包括已发布的Tellurium jar文件,然后将UI小部件视为UI模块定义中的常规Tellurium对象。
特征
主要特点是:
- UI模块清楚地表示了要测试的UI。 在Tellurium的测试代码中,不直接使用定位符。 对象uid用来引用具有表现力的UI元素。
例如:
type "GoogleSearchModule.Input", "Tellurium test"
click "GoogleSearchModule.Search" - UI属性用于描述UI,而不是固定定位符。 实际的定位器是在运行时生成的。 如果更改了属性,则框架会生成新的运行时定位符。 然后,碲会根据需要自适应UI更改。
Tellurium 0.7.0中的Santa算法通过一次定位整个UI模块来进一步提高测试的鲁棒性。 然后,将UI模块部分匹配机制用于适应特定级别的属性更改。 - Tellurium UI模板和Tellurium UID描述语言(UDL)用于表示动态Web内容。
- 该框架强制将UI模块从测试代码中分离出来,从而使重构变得容易。
例如,UI和相应的方法在单独的Groovy类中定义。 通过这种方式,将测试代码与UI模块分离。
另外的框架:
- 使用抽象UI对象封装Web UI元素
- 支持小部件的可重用性
- 提供用于UI定义,操作和测试的DSL
- 支持组定位以一次定位UI组件的集合
- 包括CSS选择器支持以提高IE中的测试速度
- 具有定位器缓存和命令包以提高测试速度
- 支持数据驱动的测试支持
Selenium和碲的比较
Selenium Web测试框架是最流行的开源自动化Web测试框架之一。 它是一个突破性的框架,提供了许多独特的功能和优势,例如:基于浏览器的测试,Selenium Grid以及用户与Selenium IDE的交互的“记录和重放”。
但是,Selenium存在一些问题。 以以下测试代码为例:
setUp("http://www.google.com/", "*chrome");
selenium.open("/");
selenium.type("q", "Selenium test");
selenium.click("//input[@value='Google Search' and @type='button']");
如果不熟悉Google搜索页面,可以根据该代码判断页面的用户界面是什么样吗? 在这种情况下,定位器q是什么意思?
如果XPath // input [@ value ='Google Search'和@ type ='button']由于网络上的更改而变得无效怎么办? 很有可能,必须完全检查测试代码以找到需要更新的行。
如果测试代码中有数十个或数百个定位符怎么办? 最初使用Selenium IDE创建测试代码可能很容易,但是很难一概而论。
与从头开始生成新的测试代码相比,重构是一个更繁琐的过程。 原因是使用与测试代码紧密结合的硬编码定位符。 维护代码可能很困难,因为测试代码不是结构化的。
当Selenium充当低级Web测试驱动框架时,它是一个很好的框架。 但是,创建健壮的测试代码需要大量的精力。
碲的建造旨在解决Selenium中的大多数问题。
碲还旨在解决Selenium的其他弱点。 例如,IE性能对于Selenium是一个突出的问题。 碲的解决方案是使用CSS选择器作为默认定位器。 定位器是从UI模块自动生成的,从而提高了测试速度。
使用新的Tellurium Engine的Tellurium UI模块缓存和命令捆绑可进一步提高测试速度。 Tellurium还有助于测试Ajax应用程序:List和Table Tellurium UI对象用于在运行时表示动态Web内容。 选项对象用于在运行时表示同一Web元素的两个不同的UI。
与Selenium一样,Tellurium用于测试基于HTML DOM结构的任何Web应用程序。
测试方法
Tellurium通过UI模块的概念采用了一种新的自动化网络测试方法。 对象用于封装Web UI元素,因此不需要手动概括和重构UI定位器。 UI模块只是一个由嵌套的基本UI对象组成的复合UI对象。
该框架以两种模式运行。 第一种模式是充当Selenium框架的包装器。 也就是说,Tellurium核心基于UI模块中UI对象的属性来生成运行时定位器。 然后,将生成的运行时定位符在Selenium调用中传递给带有Tellurium扩展的Selenium核心。
Tellurium还开发了自己的测试驱动引擎Tellurium Engine,以更好,更有效地支持UI模块。
- 首先,Tellurium Core将UI模块转换为JSON表示形式。
- 然后,当使用UI模块时,首次将JSON表示形式传递给Tellurium引擎。
- 然后,Tellurium引擎使用圣诞老人算法来定位整个UI模块,并将其放入缓存中。
- 对于后续调用,将使用缓存的UI模块,而不是再次重新定位它们。
- 此外,Tellurium内核将多个命令组合为一个称为宏命令的批处理,然后通过一次调用将该批处理发送给Tellurium Engine。 这样可以减少往返延迟。
下面的示例使用项目网站上的问题搜索UI,说明了这一想法。
我们首先为问题搜索UI定义UI模块
ui.Form(uid: "issueSearch", clocator: [action: "list", method: "GET"]) {
Selector(uid: "issueType", clocator: [name: "can", id: "can", direct:
"true"])
TextBox(uid: "searchLabel", clocator: [tag: "span", text: "for"])
InputBox(uid: "searchBox", clocator: [type: "text", name: "q", id: "q"])
SubmitButton(uid: "searchButton", clocator: [value: "Search", direct:
"true"])
}
使用以下测试方法:
public void searchIssue(String type, String issue){
select "issueSearch.issueType", type
keyType "issueSearch.searchBox", issue
click "issueSearch.searchButton"
waitForPageToLoad 30000
}
如果由于某种原因将选择器更改为输入框,那么我们只需相应地更新UI模块
ui.Form(uid: "issueSearch", clocator: [action: "list", method: "GET"]) {
InputBox(uid: "issueType", clocator: [name: "can", direct: "true"])
TextBox(uid: "searchLabel", clocator: [tag: "span", text: "for"])
InputBox(uid: "searchBox", clocator: [type: "text", name: "q", id: "q"])
SubmitButton(uid: "searchButton", clocator: [value: "Search", direct: "true"])
}
然后更改命令:
select "issueSearch.issueType", type
至:
type "issueSearch.issueType", type
其余的保持不变。
当存在动态Web内容时,以Google图书网站为例,用户界面包括图书类别列表和每个类别内的图书列表。 令人惊讶的是,此UI的UI模块易于使用,如下所示:
ui.Container(uid: "GoogleBooksList", clocator: [tag: "table", id: "hp_table"]) {
List(uid: "subcategory", clocator: [tag: "td", class: "sidebar"], separator:
"div") {
Container(uid: "{all}") {
TextBox(uid: "title", clocator: [tag: "div", class: "sub_cat_title"])
List(uid: "links", separator: "p") {
UrlLink(uid: "{all}", clocator: [:])
}
}
}}
碲UID描述语言 (UDL)提供了更大的灵活性来定义动态Web内容。 让我们看一个复杂的例子。
ui.StandardTable(uid: "GT", clocator: [id: "xyz"], ht: "tbody"){
TextBox(uid: "{header: first} as One", clocator: [tag: "th", text: "one"], self:
true)
TextBox(uid: "{header: 2} as Two", clocator: [tag: "th", text: "two"], self: true)
TextBox(uid: "{header: last} as Three", clocator: [tag: "th", text: "three"],
self: true)
TextBox(uid: "{row: 1, column -> One} as A", clocator: [tag: "div", class: "abc"])
Container(uid: "{row: 1, column -> Two} as B"){
InputBox(uid: "Input", clocator: [tag: "input", class: "123"])
Container(uid: "Some", clocator: [tag: "div", class: "someclass"]){
Span(uid: "Span", clocator: [tag: "span", class: "x"])
UrlLink(uid: "Link", clocator: [:])
}
}
TextBox(uid: "{row: 1, column -> Three} as Hello", clocator: [tag: "td"], self:
true)
}
在上面的示例中,我们使用元数据“ first”,number和“ last”指示标头位置。 元数据“ {行:1,列-> One}为A”表示UI元素(在我们的情况下为TextBox)在第1行中,并且与标头“ One”所在的列相同。 测试代码非常干净,例如:
getText "GT.A"
keyType "GT.B.Input", input
click "GT.B.Some.Link"
waitForPageToLoad 30000
未来的计划
Tellurium是一个年轻而创新的框架,具有来自开发团队和用户社区的许多新颖创意。 碲想在很多领域发展:
- Tellurium 0.7.0已使用jQuery实现了新的测试驱动引擎。 该引擎的主要功能包括:UI模块组定位,UI模块缓存,命令捆绑处理,在jQuery中重新实现的Selenium API和新的Tellurium API。 碲将继续开发新发动机直至其成熟。
- Tellurium UI模块插件0.8.0 RC1刚刚发布,它包含许多新功能。 Tellurium IDE发行候选版本也可以记录和生成测试脚本。 它们是碲的成功的关键,它们将继续得到改进。 除了Trump和Tellurium IDE,Tellurium还计划改进TelluriumWorks,以便它可以编辑,完成语法检查并运行Tellurium DSL测试脚本。
- 碲作为云测试工具是另一个非常重要的未来发展。 项目团队计划重新考虑该体系结构,以使其更易于并行执行测试。 利用对等技术来使测试服务器能够以最少的管理工作在云环境中进行自组织和自协调是非常具有挑战性的。
待开发框架的其他领域包括:
- 创建可重用的Dojo,ExtJS和jQuery UI Tellurium小部件。 这将使其他人只需在其项目中包含jar文件即可重复使用这些小部件。
- 行为驱动测试支持。
- 测试流程支持。
- Web安全测试。
- 支持其他语言,例如Ruby。
接口测试框架引入redis