YUI Test自動化測試實例詳解
針對代碼測試
斷言
啟動測試
結果生成,結果上報
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中或者上報日志中使用多種格式,有興趣的可以嘗試一下
posted on 2014-04-24 10:19 順其自然EVO 閱讀(227) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄