【原】YUI Test自动化测试实例详解
测试在软件开发中至关重要,目前针对不同的开发语言,都有比较成熟的测试框架,如jUnit,cUnit,cppUnit,nUnit等,我们统称为xUnit,他们的都遵守统一的规则:
- 针对代码测试
- 断言
- 启动测试
- 结果生成,结果上报
Javascript的自动化测试一直以来都是一个比较头疼的问题,对于javascript,目前也有比较规范的测试框架,如Qunit,YUI Test,JSTestDriver等,他们也各有其特点及使用范围
Quint是jQuery团队用它来对JQuery库进行单元测试的,需要下载quit.css和qunit.js文件。
YUI Test开发的初衷也是开发对于为了对YUI进行单元测试,需要使用test,console等模块。
JSTestDriver能够在多个浏览器中从命令行运行javaScript。JSTD带有一个JAR文件,它可以让您启用服务器,捕获一个或多个浏览器并在这些浏览器中进行测试。
这里主要介绍一下YUI Test以及一些使用心得,我们看一下YUI对它的官方描述:While not a direct port form any specific xUnit framework, YUI Test does derive some characteristics form nUnit and jUnit,即它不是直接用的xUnit框架,但是确实会从nUint和jUnit派生出一些特性,怎么理解呢,就是说他的一些特性也是遵从xUnit的,下面看YUI Test的一些特性:
- Rapid creation of test cases through simple syntax-使用简单的语法快速创建测试用例
- Advanced failure detection for methods that throw errors.- 对于抛出错误的方法有先进的错误监测
- Grouping of related test cases using test suites.- 对相关的测试用例使用测试套件分组
- Mock objects for writing tests without external dependencies.- 使用mock(虚假)对象从而避免外部依赖
- Asynchronous tests for testing events and Ajax communication.- 针对事件以及ajax通讯的异步测试
- DOM Event simulation in all A-grade browsers-在所有的A级浏览器中的事件模拟
YUI Test的测试用例编写过程也比较简单:
- 引用YUI框架
- 引用模块test,console(or test-console),test-console可用来分类展示,可分为info,pass,fail,status等,展示更加直观,但是只有在3.5版本以上才有
- 编写测试用例
我们看一个简单的例子
YUI({logInclude : { TestRunner: true }}).use("test", "test-console", "console", function (Y) {
var Test = {
drawConsole : function(){
var console = new Y.Test.Console({
newestOnTop : false,
filters: {
pass: true,
fail: true,
info: true
}
});
console.render('#testLogger');
},
testBegin : function(){
var testCase1 = new Y.Test.Case({
name : "Data Tests",
setUp : function(){
this.data = {
name : "test",
year : 2007,
beta : true
};
},
tearDown : function(){
if(this.data){
delete this.data;
}
},
testName: function(){
var assert = Y.Assert;
assert.isObject(this.data);
assert.isString(this.data.name);
assert.areEqual("test", this.data.name);
},
testYear : function(){
var assert = Y.Assert;
assert.isObject(this.data);
assert.isNumber(this.data.year);
assert.areEqual(2007, this.data.year);
assert.areEqual("2007", this.data.year);
assert.areSame(2007, this.data.year);
assert.areSame("2007", this.data.year);
},
testBeta : function(){
var assert = Y.Assert;
assert.isObject(this.data);
assert.isBoolean(this.data.beta);
assert.isTrue(this.data.beta);
}
});
var testCase2 = new Y.Test.Case({
name : "Array Tests",
setUp : function () {
this.data = [0, 1, 2, 3, 4];
},
tearDown : function () {
if(this.data){
delete this.data;
}
},
testPop : function () {
var Assert = Y.Assert;
var value = this.data.pop();
Assert.areEqual(4, this.data.length);
Assert.areEqual(4, value);
},
testPush : function () {
var Assert = Y.Assert;
this.data.push(5);
Assert.areEqual(6, this.data.length);
Assert.areEqual(5, this.data[5]);
},
testSplice : function () {
var Assert = Y.Assert;
this.data.splice(2, 1, 6, 7);
Assert.areEqual(6, this.data.length);
Assert.areEqual(6, this.data[2]);
Assert.areEqual(7, this.data[3]);
}
});
var testSuite = new Y.Test.Suite("Example Suite");
testSuite.add(testCase1);
testSuite.add(testCase2);
Y.Test.Runner.add(testSuite);
Y.Test.Runner.run();
},
init : function(){
this.drawConsole();
this.testBegin();
}
}
Test.init();
});
其中,Y.Test.Case用来生成一个测试用例,而Y.Test.Suite是一个测试集,可以add多个测试用例,Y.Test.Runner用来生成一个测试实例对象,调用其run方法即可开始测试。
Y.Test.Case需要接纳一个object对象作为参数,包含如下属性及方法
- Name(用例的名称)
- setUp(用于在所有测试方法执行之前执行,初始化一些变量信息等)
- tearDown(用户在每个测试方法执行完毕之后,清除变量,释放内存等)
- testMethod1(具体的测试方法)
- testMethod2(具体的测试方法)
PS:对于setUp及tearDown的理解,setUp在每个测试方法运行之前都会被重新执行,重新初始化,以此防止原始数据被其它测试方法锁污染。
Y.Assert即断言,是所有xUnit自动化测试框架的核心方法,具体方法使用时可参考官方文档,其实YUI test主要是进行单元测试,对一些核心算法的内部数据结构进行测试,以保证方法的正确性,对界面的测试就需要灵活利用断言来组合测试方法。
测试结果如下:

前面提到,测试结果的收集,上报也是xUnit所必不可少的,同样,YUI test也有这样的功能,在生成TestRunner的时候,为其绑定测试完成事件
testRunner.subscribe(testRunner.COMPLETE_EVENT, Y.bind(this.testCompleteEvent, this));
var testCompleteEvent = function(data){
this.console.log("测试完成了下面是测试结果");
var testRunner = Y.Test.Runner;
var resultObj = testRunner.getResults(Y.Test.Format.JSON);
this.console.log(resultObj);
resultObj = testRunner.getResults(Y.Test.Format.XML);
this.console.log(resultObj);
resultObj = testRunner.getResults(Y.Test.Format.JUnitXML);
this.console.log(resultObj);
resultObj = testRunner.getResults(Y.Test.Format.TAP);
this.console.log(resultObj); resultObj = testRunner.getResults();
var reporter = new Y.Test.Reporter("https://www.tenpay.com/report.cgi", Y.Test.Format.JSON);
reporter.report(resultObj);
}
给Reporter对象指定上报的url以及数据格式即可,注释中内容表示可以在console中或者上报日志中使用多种格式,有兴趣的可以尝试一下
【原】YUI Test自动化测试实例详解的更多相关文章
- 【python3+request】python3+requests接口自动化测试框架实例详解教程
转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- C#实现DevExpress本地化实例详解
using System; using System.Collections.Generic; using System.Text; using DevExpress.XtraGrid.Localiz ...
- javascript常用经典算法实例详解
javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与 ...
- linux基础-磁盘阵列(RAID)实例详解
磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 R ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- JavaScript学习笔记-实例详解-类(二)
实例详解-类(二) //===给Object.prototype添加只读\不可枚举\不可配置的属性objectId(function(){ Object.defineProperty(Object ...
- JavaScript学习笔记-实例详解-类(一)
实例详解-类(一): //每个javascript函数(除了bind())都自动拥有一个prototype对象// 在未添加属性或重写prototype对象之前,它只包含唯一一个不可枚举属性const ...
- Entity Framework实例详解
Entity Framework Code First的默认行为是使用一系列约定将POCO类映射到表.然而,有时候,不能也不想遵循这些约定,那就需要重写它们.重写默认约定有两种方式:Data Anno ...
随机推荐
- quick-x 2.2.5 DragonBones 某些fla导出使用后player卡死
1 2 3 4 5 6 7 8 9 10 11 --test 龙骨 self._db = dragonbones.new({ skeleton="game ...
- C++程序设计实践指导1.6分数运算改写要求实现
改写要求:重载>>和<<实现分数类对象的直接输入输出,重载+完成多个分数对象加法 #include <cstdlib> #include <iostream& ...
- jquery中 append 和appendto的区别
1. append(content)方法 方法作用:向每个匹配的元素内部追加内容. 参数介绍:content (<Content>): 要追加到目标中的内容. 用法示例: HTML代码为& ...
- 2015.4.16-C#中ref和out的区别
如图: 输出结果是: 上面显示的是 ref 只是地址传递,所以最初改变的也只是地址,但是如果 在给其赋值,值会随之改变;如果 在方法内直接赋值,那么输出的结果 就是现在的值,之后 ...
- [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令
1- jmp为无条件转移指令,可以只修改IP, 也可以同时修改CS和IP jmp指令要给出两种信息: (1) 转移的目的地址 (2) 转移的距离(段间转移, 段内转移, 段内近转移) 2- 依据位移进 ...
- HDU1043 Eight(BFS)
Eight(South Central USA 1998) Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- 中国大学MOOC-翁恺-C语言程序设计习题集
今年网易出了“中国大学MOOC”,于是选了浙大翁恺老师的“C语言程序设计”学习,近期打算把自己在该课程中的PAT习题解答做一个记录,等自己编程能力提高后再来看现在写的代码哪里还有写的不好,可以改进的地 ...
- css3的盒子模型布局
写在前面的话: css3盒子布局,可以更简单直观的均分页面某一个div,并且还可以达到均分后的每一个元素中的内容上下居中.左右居中,但是该模型对浏览器的版本有要求: { display: -webki ...
- MVC 视频笔记
1.关闭Jquery的浏览器缓存 $.ajaxSetup({cache:fasle});
- Oracle EBS-SQL (INV-9):检查搬运单分配异常.sql
select h.request_number, l.line_number, msib.segment1 item_code, t.transacti ...