JS自動化測試 單元測試之Qunit


前言

因為公司開發了一套javascript SDK需要測試,在網上找了很久,找到了JQuery團隊開發的QUnit,和基於JUnit的JsUnit,還有一些還沒有看,先講講QUnit吧

下載

登錄JQuery官網http://qunitjs.com/直接首頁右邊可以下載最新版本的QUnit。

或者直接點擊下載qunit-1.16.0.js,使用QUnit還需要下載官方css文件。下載地址qunit-1.16.0.css

使用QUnit前提條件

1、需要引用qunit-1.16.0.js和qunit-1.16.0.css,有人會問,css可以不引用嗎,答案是不行。展示執行用例結果的樣式,需要css來顯示。

2、需要在body標簽中加入兩行HTML代碼,id屬性不能去掉的哦~

<div id="qunit"></div>
<div id="qunit-fixture"></div>

 3、需要寫一個js用於測試。這里隨便寫了一個user.js 有登錄登出和判斷用戶名是否存在的方法。引用這個user.js

貼出user.js代碼

// JavaScript Document
// 創建user類
var user={
    ///登錄 userName:用戶名  userPwd:密碼
     login:function(userName,userPwd){
          return userName+userPwd;
         },
     ///退出 返回1為成功 返回0為失敗
     logout:function(){
         ///省去登出代碼
          return "1";
        },
     getUser:function(){
         return {userName:'',userPwd:''};
         },
      ///判斷用戶名是否存在 返回1存在 返回0不存在
      ///測試異步操作  需要提供一個回調函數 用於延遲加載
      existUserName:function(userName,callBack){
         setTimeout(function(){
             var state =0;
             if (userName=='milan'){
                   state= 1;
                  }
             else{
                    state= 0;  
                   }
             if (callBack){
                     callBack(state);
                }
              },1000);
         }
          ,
        callback:null,
        existUserName2:function(userName){
            setTimeout(function(){
             var state =0;
             if (userName=='milan'){
                   state= 1;
                  }
             else{
                    state= 0;  
                   }
             if (user.callback){
                     user.callback(state);
                }
              },1000);
          }
    };
View Code

使用QUnit

1、test :所有用例必須在test方法中執行,表示一個測試用例,一般一個用例有N個斷言。

///測試登錄 test('user.login',function(){ equal(user.login('milan','123'),'milan123',"登錄測試"); })

運行結果

2、斷言函數

  1. ok( result, message)斷言返回值為true/false
  2. equal( actual, expected, message )actual為實際值、expected為預期值;淺對比,判斷實際值是否與預期值相等。相當於==
  3. propEqual( actual, expected, message )用於判斷對象和值是否相等
  4. deepEqual( actual, expected, message )深對比,用於判斷兩個值類型和值是否相等,相當於===
  5. 以上2、3、4條分別提供了功能相反的函數 notEqual、notPropEqual、notDeepEqual。參數跟2、3、4條是一樣的。

      大家也可以在qunit-1.16.0.js的源代碼中搜索“notPropEqual”(或者其他函數名稱),搜索到同級函數都是QUnit提供的斷言函數,可以方便大家查看及擴展。 如下圖:

   

 3、使用斷言函數

      樓主一般喜歡一個接口一個測試用例,當然每個人的習慣不一樣。不能一概而論,反正只要做到清晰易讀就可以啦!

///登出測試
test('user.logout',function(){
 ok(user.logout()==1,"登出測試ok");
 //驗證實際值不等於斷言值為正確,這里實際是相等的,所以是錯的
 notEqual(user.logout()==1,true,"登出測試notEqual");
 //驗證實際值等於斷言值
 equal(user.logout()==1,true,"登出測試notEqual");
 //驗證返回值是否同類型同值
 deepEqual(user.logout(),1,"登出測試deepEqual");
});
///獲取用戶信息測試
test("user.getUser",function(){
 ///判斷兩個對象是否相等 此方法 不適用於判斷基本的數值或者字符串
 propEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出測試propEqual");
 ///判斷是否不相等,不相等為通過
 notPropEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出測試propEqual");
});

執行結果如圖:

 4、QUnit實現異步測試

大家都知道,要測試接口/方法,必須等到接口的返回值,才能測試,如果沒有返回值,我們也不知道結果對不對啦。

所以異步測試一般有兩種辦法:一種是把回調當作參數傳入方法中;二是開發者提供一個變量,我們可以把回調函數賦值給變量;等異步處理完畢之后再執行我們寫的回調函數

這里我們用setTimeout來模擬異步延遲返回操作。

用例代碼:

//模塊化 
module("異步測試");
///方法一  回調用參數的方式傳入   異步測試  
user.existUserName('milan',function(result){
  ///注意啦 這里是先調方法,再寫用例哦。
  test("user.existUserName",function(){
    ok(result==1,"判斷用戶名是否存在ok");
    notEqual(result==1,true,"判斷用戶名是否存在notEqual");
  });
});
//方法二 回調用內置變量賦值的方式傳入 異步測試
user.callback=function(result){
 test("user.existUserName2",function(){
    ok(result==1,"判斷用戶名是否存在ok");
    notEqual(result==1,true,"判斷用戶名是否存在notEqual");
  });
};
user.existUserName2('milan');

測試結果:

5、模塊化

在上面的異步測試中,我們看到每個用例的開頭都多了“異步測試”這幾個字。那么這幾個字是怎么來的呢?

很多時候,要測試的用例過多,我們也會眼花繚亂了。QUnit提供module("模塊名稱")來實現用例分組。

使用方法直接放在要模塊化的地方就行啦。參照第4接異步測試的代碼和結果

貼出教程所有html的代碼

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>

<link rel="stylesheet" href="../../qunit/qunit-1.16.0.css">
<script src="../../qunit/qunit-1.16.0.js"></script>
<script src="user.js"></script>

</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

<script type="text/javascript" language="javascript">
///測試登錄
test('user.login',function(){
    equal(user.login('milan','123'),'milan123',"登錄測試");
    
})
//模塊測試
module("基本測試");
///登出測試
test('user.logout',function(){
 ok(user.logout()==1,"登出測試ok");
 //驗證實際值不等於斷言值為正確,這里實際是相等的,所以是錯的
 notEqual(user.logout()==1,true,"登出測試notEqual");
 //驗證實際值等於斷言值
 equal(user.logout()==1,true,"登出測試notEqual");
 //驗證返回值是否同類型同值
 deepEqual(user.logout(),1,"登出測試deepEqual");
});
///獲取用戶信息測試
test("user.getUser",function(){
 ///判斷兩個對象是否相等 不適用於判斷基本的數值或者字符串
 propEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出測試propEqual");
 ///判斷是否不相等,不相等為通過
 notPropEqual(user.getUser(),{"userName": "12","userPwd": ""},"登出測試propEqual");
});
//模塊化
module("異步測試");
///回調用參數的方式傳入   異步測試  
user.existUserName('milan',function(result){
  ///注意啦 這里是先調方法,再寫用例哦。
  test("user.existUserName",function(){
    ok(result==1,"判斷用戶名是否存在ok");
    notEqual(result==1,true,"判斷用戶名是否存在notEqual");
  });
});
//回調用內置變量賦值的方式傳入 異步測試
user.callback=function(result){
 test("user.existUserName2",function(){
    ok(result==1,"判斷用戶名是否存在ok");
    notEqual(result==1,true,"判斷用戶名是否存在notEqual");
  });
};
user.existUserName2('milan');

</script>

</body>
</html>
View Code

結論

在很多時候,我們不可能把每一種方法都講到極致,沒有講到的,還需要大家多多去試一試。第一次寫博客,寫得不好,有什么建議或者問題,都可以在下面回復。樓主會在看到后第一時間解決的。謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM