qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          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中或者上報日志中使用多種格式,有興趣的可以嘗試一下

          posted on 2014-04-24 10:19 順其自然EVO 閱讀(227) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 九寨沟县| 邳州市| 柞水县| 阆中市| 郸城县| 阿鲁科尔沁旗| 怀仁县| 宜城市| 定日县| 岚皋县| 富平县| 桂林市| 青川县| 龙海市| 平度市| 陵川县| 疏勒县| 鄂州市| 岳普湖县| 左云县| 溆浦县| 凉山| 东阿县| 循化| 光泽县| 宁晋县| 仙桃市| 剑川县| 辉南县| 竹溪县| 吴堡县| 望都县| 延吉市| 威海市| 兴义市| 玉溪市| 宝鸡市| 静宁县| 保山市| 宝丰县| 梅河口市|