JQuery團(tuán)隊(duì)打造的javascript單元測(cè)試工具QUnit介紹
單元測(cè)試又稱為模塊測(cè)試,是針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)來進(jìn)行正確性檢驗(yàn)的測(cè)試工作。單元測(cè)試主要是用來檢驗(yàn)程式的內(nèi)部邏輯,也稱為個(gè)體測(cè)試、結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試。通常由撰寫程式碼的程式設(shè)計(jì)師負(fù)責(zé)進(jìn)行。
通常來說,程式設(shè)計(jì)師每修改一次程式就會(huì)進(jìn)行最少一次單元測(cè)試,在編寫程式的過程中前後很可能要進(jìn)行多次單元測(cè)試,以證實(shí)程式達(dá)到軟件規(guī)格書(en:Specification)要求的工作目標(biāo),沒有臭蟲;雖然單元測(cè)試不是什么必須的,但也不壞,這牽涉到專案管理的政策決定。
單元測(cè)試的優(yōu)點(diǎn)
1、它是一種驗(yàn)證行為。
程序中的每一項(xiàng)功能都是測(cè)試來驗(yàn)證它的正確性。它為以后的開發(fā)提供支緩。就算是開發(fā)后期,我們也可以輕松的增加功能或更改程序結(jié)構(gòu),而不用擔(dān)心這個(gè)過程中會(huì)破壞重要的東西。而且它為代碼的重構(gòu)提供了保障。這樣,我們就可以更自由的對(duì)程序進(jìn)行改進(jìn)。
2、它是一種設(shè)計(jì)行為。
編寫單元測(cè)試將使我們從調(diào)用者觀察、思考。特別是先寫測(cè)試(test-first),迫使我們把程序設(shè)計(jì)成易于調(diào)用和可測(cè)試的,即迫使我們解除軟件中的耦合。
3、它是一種編寫文檔的行為。
單元測(cè)試是一種無價(jià)的文檔,它是展示函數(shù)或類如何使用的最佳文檔。這份文檔是可編譯、可運(yùn)行的,并且它保持最新,永遠(yuǎn)與代碼同步。
4、它具有回歸性。
自動(dòng)化的單元測(cè)試避免了代碼出現(xiàn)回歸,編寫完成之后,可以隨時(shí)隨地的快速運(yùn)行測(cè)試。
參考:
http://miiceic.org.cn/phrase/200602281036115.html
http://tech.ddvip.com/2009-06/1245992965124860.html
http://www.blogjava.net/square/articles/158103.html
javscript中單元測(cè)試框架
- jsUnit
系統(tǒng)化的解決方案,基于XNuit規(guī)范,如果你會(huì)使用jUnit、NUnit等框架,對(duì)這個(gè)應(yīng)該會(huì)很容易上手,且包括服務(wù)器端(Java的)。http://www.jsunit.net/
評(píng)價(jià):非常全面,專業(yè),適合大型企業(yè)級(jí)開發(fā)。 - Test.Simple & Test.More
這個(gè)是jQuery之父John Resig在他的著作《Pro Javascript》中推薦的測(cè)試框架http://openjsan.org/doc/t/th/theory/Test/Simple/0.21/lib/Test/Simple.html 。
評(píng)價(jià):非常容易上手,非常簡(jiǎn)潔,適合中小型項(xiàng)目快速引入單元測(cè)試。 - FireUnit
這個(gè)是John Resig另起爐灶做的,在他的博客John Resig - FireUnit: JavaScript Unit Testing Extension,發(fā)布了他與Jan Odvarko合作開發(fā)的基于Firebug的擴(kuò)展FireUnit。簡(jiǎn)單說來,F(xiàn)ireUnit給Firebug增加了一個(gè)標(biāo)簽面板,并提供了一些簡(jiǎn)單的JavaScript API來記錄和查看測(cè)試。更多http://shawphy.com/2008/12/fireunit.html。
評(píng)價(jià):里面有Test.Simple的痕跡,呵呵,John Resig是個(gè)非常善于學(xué)習(xí)并創(chuàng)新的家伙。FireUnit果然在易用性上表現(xiàn)非常出眾,非常適合基于Firebug做調(diào)試環(huán)境的前端工程師。 - QUnit
QUnit是jQuery團(tuán)隊(duì)開發(fā)的JavaScript單元測(cè)試工具,可以到http://docs.jquery.com/QUnit中下載評(píng)價(jià):使用方便,界面美觀。
參考:
http://www.cnblogs.com/kaima/archive/2009/04/09/javascritp_unittest.html
下面我們重點(diǎn)來介紹一下QUnit
QUnit 介紹
JavaScript 依然需要很好的可讀性,所以重構(gòu)也必不可少,我們知道沒有單元測(cè)試的重構(gòu)是不靠譜的,有好的單元測(cè)試覆蓋會(huì)讓我們重構(gòu)時(shí)更容易成本也更低,所以對(duì)于優(yōu)秀的javascript編程人員來說非常需要單元測(cè)試框架,QUnit 是一款強(qiáng)大而且容易使用的JavaScript 測(cè)試框架,它被用于jQuery 與其插件的測(cè)試,同時(shí)它也同樣可以測(cè)試普通的JavaScript 代碼。
使用QUnit
首先我們先要http://docs.jquery.com/QUnit中找到qunit.js 和 qunit.css兩個(gè)文件,Qunit的框架如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />
<script type="text/javascript" src="qunit.js" ></script>
<script>
$(document).ready(function() {
});
</script>
</head>
<body>
<h1 id="qunit-header">QUnit example</h1>
<h2 id="qunit-banner"></h2>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
</body>
</html>
注:body中的元素id命名必須依照如下形式,否則無法正常顯示,我們可以將要測(cè)試的內(nèi)容放在$(document).ready()中。
我們先來看一個(gè)簡(jiǎn)單的例子
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd%22>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js%22></script>
<link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />
<script type="text/javascript" src="qunit.js" ></script>
<script>
$(document).ready(function() {
test("一個(gè)基本測(cè)試?yán)?, function() {
ok( true, "測(cè)試布爾類型" );
var value = "hello";
equals( "hello", value, "我們期望得到hello" );
});
});
</script>
</head>
<body>
<h1 id="qunit-header">QUnit example</h1>
<h2 id="qunit-banner"></h2>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
</body>
</html>
將此文件存為html直接在本地運(yùn)行,結(jié)果如下

test( name, expected, test ):加入測(cè)試去運(yùn)行,其中可以包含若干斷言函數(shù),比方說ok,equals等。
ok( state, [message] ) 是QUnit中常用的一個(gè)判斷函數(shù),可以判斷布爾類型,整型非零為true,字符串非“”為true。
equals( actual, expected, [message] ) 是QUnit中常用的一個(gè)判等函數(shù)
我們?cè)賮砜匆粋€(gè)稍微復(fù)雜一點(diǎn)的例子:
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />
<script type="text/javascript" src="qunit.js"></script>
<script>
$(document).ready(function() {
test("a basic test example", function() {
ok(true, "this test is fine");
var value = "hello";
equals("hello", value, "We expect value to be hello");
});
module("Module A");
test("first test within module", function() {
ok(true, "all pass");
});
test("second test within module", function() {
ok(true, "all pass");
});
module("Module B");
test("some other test", function() {
expect(2);
equals(true, false, "failing test");
equals(true, true, "passing test");
});
});
</script>
</head>
<body>
<h1 id="qunit-header">QUnit example</h1>
<h2 id="qunit-banner"></h2>
<h2 id="qunit-userAgent"></h2>
<ol id="qunit-tests"></ol>
</body>
</html>
得到的結(jié)果:
module( name, lifecycle ):是用于對(duì)測(cè)試模塊進(jìn)行分組,[lifecycle] 用于初始化測(cè)試和清理測(cè)試。
參考如下實(shí)例:
module("module2", {
setup: function() {
ok(true, "once extra assert per test");
this.testData = "foobar";
},
teardown: function() {
ok(true, "and one extra assert after each test");
}
});
test("test with setup and teardown", function() {
expect(3);
same(this.testData, "foobar");
});
異步測(cè)試:
codeasyncTest("異步測(cè)試", function() {
expect(2);
$.getJSON("/Home/JosnDemo", function(result) {
equals(result.x, "sss");
equals(result.y, "sss");
start();
});
});
"/Home/JosnDemo"是提供json數(shù)據(jù)的地址,這里需要注意的是必須在寫完斷言函數(shù)后調(diào)用start()函數(shù)。
Qunit還提供了在測(cè)試時(shí)的一些更為高級(jí)的應(yīng)用,比如希望在某個(gè)測(cè)試開始時(shí)做些工作等,可以參見http://docs.jquery.com/QUnit#Integration_into_Browser_Automation_Tools
JQuery的很多核心套件是使用Qunit來進(jìn)行測(cè)試的,http://docs.jquery.com/QUnit#Reference_Test_Suites中有很多的例子可以供大家參考。
例子下載
相關(guān)文章
jQuery實(shí)現(xiàn)別踩白塊兒網(wǎng)頁(yè)版小游戲
本文主要介紹了jQuery實(shí)現(xiàn)別踩白塊兒網(wǎng)頁(yè)版小游戲的思路分析與代碼。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
使用element-ui的el-menu導(dǎo)航選中后刷新頁(yè)面保持當(dāng)前選中狀態(tài)
這篇文章主要介紹了使用element-ui的el-menu導(dǎo)航選中后刷新頁(yè)面保持當(dāng)前選中狀態(tài),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
jQuery結(jié)合HTML5制作的愛心樹表白動(dòng)畫
這篇文章主要給大家分享的是一則jQuery結(jié)合HTML5制作的愛心樹表白動(dòng)畫的特效代碼,各位宅在家里的程序猿們,再辛苦的工作,也不要忘記你們的女朋友哦。2015-02-02
JQuery判斷子iframe何時(shí)加載完成解決方案
需要知道iframe何時(shí)加載完成,用JQuery很簡(jiǎn)單就能實(shí)現(xiàn),具體如下,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08
基于JQuery的6個(gè)Tab選項(xiàng)卡插件
今天在修整博客側(cè)欄信息時(shí),利用到了Tab選項(xiàng)卡方式,因?yàn)閆Blog封裝的是JQuery庫(kù),所以很自然地就想到了IdTabs。2010-09-09
Jquery實(shí)現(xiàn)地鐵線路指示燈提示牌效果的方法
這篇文章主要介紹了Jquery實(shí)現(xiàn)地鐵線路指示燈提示牌效果的方法,實(shí)例分析了jQuery動(dòng)態(tài)顯示特效的使用技巧,需要的朋友可以參考下2015-03-03
jQuery中:only-child選擇器用法實(shí)例
這篇文章主要介紹了jQuery中:only-child選擇器用法,實(shí)例分析了:only-child選擇器的功能、定義及匹配父元素的唯一子元素使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01

