亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        利用控制臺(tái)語(yǔ)句實(shí)現(xiàn)JavaScript代碼單元測(cè)試研究

        2017-04-18 18:02:31董寧王波
        軟件導(dǎo)刊 2017年2期
        關(guān)鍵詞:單元測(cè)試

        董寧 王波

        摘要 運(yùn)行和調(diào)試JavaScript代碼的主要工具是Web瀏覽器,現(xiàn)代Web瀏覽器一般包含調(diào)試JavaScript代碼的控制臺(tái)。JavaScript代碼運(yùn)行中的錯(cuò)誤信息、Ajax調(diào)用、性能分析結(jié)果、命令行執(zhí)行結(jié)果都會(huì)顯示在控制臺(tái)界面上。Firefox瀏覽器的Firebug提供了很多手段,可以將JavaScript代碼運(yùn)行中的信息輸出到Firebug控制臺(tái)。通過靈活使用控制臺(tái)語(yǔ)句,可以方便地實(shí)現(xiàn)對(duì)JavaScript代碼的單元測(cè)試。

        關(guān)鍵詞 JavaScript ;控制臺(tái);單元測(cè)試

        DOI DOI: 10.11907/rjdk.162418

        中圖分類號(hào): TP306

        文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào) 文章編號(hào): 16727800(2017)002001303

        0 引言

        在計(jì)算機(jī)編程中,單元測(cè)試[1]是針對(duì)程序模塊(軟件設(shè)計(jì)的最小單位)進(jìn)行正確性檢驗(yàn)的測(cè)試工作。程序單元是最小的測(cè)試部件。在過程化編程中,一個(gè)單元就是單個(gè)程序、函數(shù)、過程等;對(duì)于面向?qū)ο缶幊?,最小單元就是方法,包括基類(超類)、抽象類或者派生類(子類)中的方法。每個(gè)理想的測(cè)試案例獨(dú)立于其它案例。為測(cè)試時(shí)隔離模塊,經(jīng)常使用stubs、mock或fake等測(cè)試馬甲程序。單元測(cè)試通常由軟件開發(fā)人員編寫,用于確保所寫代碼符合軟件需求和遵循開發(fā)目標(biāo)。

        運(yùn)行和調(diào)試JavaScript代碼[2]的主要工具是Web瀏覽器,現(xiàn)代的Web瀏覽器一般包含調(diào)試JavaScript代碼的控制臺(tái)。對(duì)于JavaScript代碼,Mozilla Firefox是最適合運(yùn)行與調(diào)試的瀏覽器之一。Mozilla Firefox瀏覽器的插件Firebug是調(diào)試JavaScript代碼必不可少的,尤其是涉及到Ajax技術(shù)的Web應(yīng)用。在Mozilla Firefox瀏覽器中安裝好Firebug插件后,JavaScript代碼運(yùn)行中的錯(cuò)誤信息、Ajax調(diào)用、性能分析結(jié)果、命令行執(zhí)行結(jié)果都會(huì)顯示在控制臺(tái)界面上。Firebug提供了很多手段可以將JavaScript代碼運(yùn)行中的信息輸出到Firebug控制臺(tái),通過靈活使用控制臺(tái)語(yǔ)句可以方便實(shí)現(xiàn)對(duì)JavaScript代碼的單元測(cè)試。

        1 JavaScript代碼中控制臺(tái)語(yǔ)句使用

        在JavaScript代碼中可以使用console.log()方法向控制臺(tái)輸出信息。實(shí)際上,console.log()方法包含在conosle對(duì)象中,而console對(duì)象則是由瀏覽器提供的(IE6及以前瀏覽器不支持console對(duì)象)。

        除了最基本的console.log()方法外,conosle對(duì)象還提供了多種方法以便向控制臺(tái)輸出不同類型的信息和調(diào)試JavaScript代碼。

        (1)不同類型輸出方法。

        根據(jù)信息的不同性質(zhì),console對(duì)象除了console.log()方法外還有4種輸出信息方法:一般信息console.info()、調(diào)試信息console.debug()、警告提示console.warn()和錯(cuò)誤提示console.error()。

        (2)自定義輸出格式。

        console對(duì)象所有的輸出方法都可以使用printf風(fēng)格的占位符對(duì)輸出內(nèi)容進(jìn)行格式化。支持的占位符有字符(%s)、整數(shù)(%d或%i)、浮點(diǎn)數(shù)(%f)和對(duì)象(%o)。

        (3)分組輸出。

        如果在JavaScript代碼運(yùn)行過程中需要輸出數(shù)據(jù)太多,則可以使用分組的方式輸出到控制臺(tái)以便查看和分析。conosle對(duì)象中的console.group()和console.groupEnd()方法提供了數(shù)據(jù)分組輸出功能。

        (4)輸出指定對(duì)象所有屬性和方法。

        console.dir()方法可以輸出傳入對(duì)象的所有屬性和方法。

        (5)顯示頁(yè)面對(duì)象的HTML代碼。

        console.dirxml()方法可以顯示輸入的頁(yè)面對(duì)象HTML代碼,以便查看和調(diào)試。

        (6)斷言。

        console.assert()方法提供了基本的代碼測(cè)試功能。該方法用來判斷一個(gè)表達(dá)式或變量是否為真,如果不為真,則在控制臺(tái)輸出一條相應(yīng)信息,并且拋出一個(gè)異常。

        (7)跟蹤方法調(diào)用軌跡。

        console.trace()方法可以用來追蹤方法的調(diào)用軌跡,用來對(duì)遞歸方法或調(diào)用過程較復(fù)雜的方法進(jìn)行分析。

        (8)計(jì)時(shí)方法。

        console.time()和console.timeEnd()方法可以用來記錄并輸出代碼的運(yùn)行時(shí)間。

        (9)性能分析方法。

        性能分析指分析程序各個(gè)部分的運(yùn)行時(shí)間,console.profile()可以用來對(duì)JavaScript代碼進(jìn)行性能分析,找出代碼瓶頸。

        2 JavaScript代碼單元測(cè)試實(shí)現(xiàn)

        如果需要測(cè)試某些不涉及DOM和CSS操作的JavaScript代碼,用Qunit之類的第三方JavaScript單元測(cè)試框架[3]略顯繁瑣,效率不高,這類JavaScript代碼最適合用控制臺(tái)語(yǔ)句做單元測(cè)試。

        例如某項(xiàng)目需要用JavaScript代碼實(shí)現(xiàn)快速排序[4],具體實(shí)現(xiàn)代碼如下:

        //swap函數(shù)實(shí)現(xiàn)元素交換

        function swap(list,firstIndex,secondIndex){

        var temp = list[firstIndex];

        list[firstIndex]= list[secondIndex];

        list[secondIndex]=temp;

        }

        //getMiddle函數(shù)獲取中軸點(diǎn)

        function getMiddle(list,left,right) {

        var pivot = list[Math.floor((right + left)/2)];

        var i = left;

        var j = right;

        while (i <= j) {

        while (list[i]< pivot) {

        i++;

        }

        while (list[j]> pivot) {

        j--;

        }

        if (i <= j) {

        swap(list,i,j);

        i++;

        j--;

        }

        }

        return i;

        }

        //quickSort函數(shù)以遞歸方式完成快速排序

        function quickSort(list,left,right) {

        var index;

        if (list.length > 1) {

        index = getMiddle(list,left,right);

        if (left < index - 1) {

        quickSort(list,left,index - 1);

        }

        if (index < right) {

        quickSort(list,index,right);

        }

        }

        return list;

        }

        上述快速排序的實(shí)現(xiàn)代碼可以使用控制臺(tái)語(yǔ)句中的斷言部分完成測(cè)試,具體如下:

        //待排序list

        var array=[6,2,9,8,1,7];

        //預(yù)期的結(jié)果

        var result=[1,2,6,7,8,9];

        //測(cè)試swap函數(shù)

        swap(array,1,5);

        console.assert(array[1]==7&&array[5]==2,"swap函數(shù)錯(cuò)誤!");

        //測(cè)試getMiddle函數(shù)

        var m = getMiddle(array,0,array.length-1);

        console.assert(m==5,"getMiddle函數(shù)錯(cuò)誤!");

        //測(cè)試quickSort函數(shù)

        quickSort(array,0,array.length-1);

        console.assert(array.toString()==result.toString(),"quickSort函數(shù)錯(cuò)誤!");

        //單元測(cè)試結(jié)束

        console.info("測(cè)試完成!");

        通過控制臺(tái)語(yǔ)句中的console.assert()方法可以分別測(cè)試代碼中的swap函數(shù)、getMiddle函數(shù)和quickSort函數(shù)。如果測(cè)試通過,則會(huì)看到在控制臺(tái)中輸出帶有信息提示圖標(biāo)的“測(cè)試完成!”字樣。

        如果其中某一個(gè)函數(shù)出錯(cuò)則會(huì)有相應(yīng)提示,如圖1所示。

        上述針對(duì)快速排序模塊的測(cè)試很簡(jiǎn)單,測(cè)試結(jié)果也沒有問題。但是對(duì)單元測(cè)試來說,這個(gè)測(cè)試用例太單一和普通了。為了提高測(cè)試用例[5]覆蓋率,最好寫一個(gè)輔助函數(shù)tester來調(diào)用被測(cè)試代碼和使用控制臺(tái)語(yǔ)句輸出結(jié)果,具體做法如下:

        function tester(name,result,expect){

        //使用分組語(yǔ)句輸出測(cè)試用例名

        console.group(name);

        if(result==expect){

        //測(cè)試通過,信息提示

        console.info("通過!");

        }else{

        //測(cè)試失敗,警告提示

        console.warn("失敗");

        }

        //分組結(jié)束

        console.groupEnd();

        }

        如果用上述tester函數(shù)測(cè)試完成快速排序的quickSort函數(shù),可以這樣實(shí)現(xiàn):

        //待排序list

        var array1=[6,2,9,8,1,7];

        //預(yù)期的結(jié)果

        var result1=[1,2,6,7,8,9];

        //待排序list2

        var array2= [6,2,9,8,1,7,85,12,48,56,78,987,45,

        12,-78,45,0,58,96,12.56,12.3,7.36];

        //預(yù)期的結(jié)果2

        var result2 = [-78,0,1,2,6,7,7.36,8,9,12,12,12.3,

        12.56,45,45,48,56,58,78,85,96,987];

        //錯(cuò)誤結(jié)果測(cè)試

        tester("測(cè)試錯(cuò)誤輸入",1,0);

        //測(cè)試快速排序

        quickSort(array1,0,array1.length-1);

        tester("常規(guī)測(cè)試",array1.toString(),result1.toString());

        quickSort(array2,0,array2.length-1);

        tester("包含負(fù)數(shù)與小數(shù)測(cè)試",array2.toString(),result2.toString());

        代碼運(yùn)行結(jié)果如圖2所示。

        可使用tester函數(shù)添加許多測(cè)試用例,并且還能為用例命名,在控制臺(tái)中直接顯示每個(gè)用例是否通過,同時(shí)用不同顏色標(biāo)記,使結(jié)果一目了然。至此一個(gè)基本的單元測(cè)試就完成了。

        3 結(jié)語(yǔ)

        快速排序算法的JavaScript代碼,靈活使用控制臺(tái)語(yǔ)句可快速完成代碼模塊的單元測(cè)試,比起專業(yè)的第三方JavaScript單元測(cè)試框架更高效,學(xué)習(xí)曲線也不那么陡峭。但是,利用控制臺(tái)語(yǔ)句實(shí)現(xiàn)JavaScript代碼單元測(cè)試主要適用于邏輯代碼,而前端開發(fā)很多時(shí)候要和UI關(guān)聯(lián),雖然UI相關(guān)的代碼也可以進(jìn)行單元測(cè)試,但很麻煩,比起邏輯代碼難度大得多。隨著單元測(cè)試的普及,尤其是敏捷開發(fā)的推動(dòng),涌現(xiàn)了許多優(yōu)秀的JavaScript單元測(cè)試框架,如Qunit和Jasmine等,每個(gè)都有各自擅長(zhǎng)的領(lǐng)域。對(duì)于基于JavaScript語(yǔ)言的前端項(xiàng)目單元測(cè)試,結(jié)合控制臺(tái)語(yǔ)句,精心選擇框架,綜合考慮項(xiàng)目實(shí)際情況,一定可以寫出合適的測(cè)試代碼。

        參考文獻(xiàn):

        [1] 張軍,李攀,邢光輝,等.軟件測(cè)試的認(rèn)知誤區(qū)和單元測(cè)試實(shí)戰(zhàn)流程[J].科技創(chuàng)新與應(yīng)用,2016 (25):120120.

        [2] 張令芬.JavaScript API自動(dòng)化測(cè)試方案的管理設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2016,24(2):3537,41.

        [3] 王婷婷,申啟杰.JavaScript調(diào)試器軟件架構(gòu)[J].湖南師范大學(xué)學(xué)報(bào),2014(6):8892.

        [4] 王善坤,陶禎蓉.一種三路劃分快速排序的改進(jìn)算法[J].計(jì)算機(jī)應(yīng)用研究,2012,29(7):25132516.

        [5] 張智軼,陳振宇,徐寶文,等.測(cè)試用例演化研究進(jìn)展[J].軟件學(xué)報(bào),2013,24(4):663674.

        (責(zé)任編輯:杜能鋼)

        猜你喜歡
        單元測(cè)試
        圓錐曲線單元測(cè)試卷
        《一次函數(shù)》單元測(cè)試題
        一年級(jí)上冊(cè)第五單元測(cè)試
        一年級(jí)上冊(cè)一、二單元測(cè)試
        第五單元測(cè)試卷
        第六單元測(cè)試卷
        欧美黑人性暴力猛交喷水| 偷偷夜夜精品一区二区三区蜜桃| 91九色最新国产在线观看| 51看片免费视频在观看| 97精品伊人久久大香线蕉app| 亚洲AV日韩Av无码久久| 男女视频一区二区三区在线观看| 成视频年人黄网站免费视频| 一本之道高清无码视频| 在线偷窥制服另类| 日韩av在线不卡一区二区| 97久久精品人妻人人搡人人玩| 国产午夜影视大全免费观看| 激情五月婷婷久久综合| 久久蜜桃资源一区二区| 色欲av蜜桃一区二区三| 爱我久久国产精品| 丰满人妻无套内射视频| 免费国产自拍在线观看| 国产黄在线观看免费观看不卡| 精品国产福利片在线观看| av人妻在线一区二区三区| 伊人久久精品无码二区麻豆| 2019年92午夜视频福利| 国产经典免费视频在线观看| 日韩av一区二区观看| 人妻少妇精品视频无码专区 | 亚洲永久免费中文字幕| 成人精品一区二区三区电影| 又污又黄又无遮挡的网站| 久久久久无码中文字幕| 亚洲乱码中文字幕综合久久| 久久无码av中文出轨人妻| 波霸影院一区二区| 快射视频网站在线观看| 亚洲av无码久久精品色欲| 日韩欧美区| 久久国产精品免费久久久| 99riav国产精品视频| 亚洲av色无码乱码在线观看| 久久精品国产一区二区涩涩|