国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

面向小規(guī)模程序的輕型測試方法

2015-12-25 12:10:14葉常春尹良澤
軟件 2015年10期
關(guān)鍵詞:重定向單元測試軟件工程

葉常春++尹良澤

摘要:初級(jí)程序員開發(fā)的程序一般是小規(guī)模程序。對于小規(guī)模程序,軟件工程實(shí)踐采用的重型測試方法是不適用的,因?yàn)闇y試代碼量遠(yuǎn)大于程序代碼量。論文描述三種面向小規(guī)模程序的輕型測試方法。第一種方法是“使用freopen函數(shù)的方法”,做法是在程序中調(diào)用freopen函數(shù)把輸入輸出重定向至文件,并用文件比較命令來比對輸出結(jié)果和期望結(jié)果是否一致。好處是免除手工輸入和人工比對,消除繁瑣和減少犯錯(cuò)的機(jī)會(huì)。第二種方法是“使用重定向和批處理程序的方法”,實(shí)質(zhì)與第一種做法類似,但能夠批處理地使用多組測試數(shù)據(jù)對程序進(jìn)行測試。第三種方法是“輕型單元測試方法”,做法是把程序分解成多個(gè)函數(shù),對函數(shù)進(jìn)行測試。好處是便于定位錯(cuò)誤。上述三種輕型程序測試方法的優(yōu)點(diǎn)是易學(xué)易用,適用于在OJ網(wǎng)站刷題和計(jì)算機(jī)軟件能力認(rèn)證考試等場合。

關(guān)鍵詞:軟件工程;輕型測試方法;小規(guī)模程序;重定向;單元測試

中圖分類號(hào):TP3 11.1 文獻(xiàn)標(biāo)識(shí)碼:A DOI:10.3969/j.issn.1003-6970.2015.10.024

引言

這些年,越來越多的大學(xué)生和高中生在OJ(Online Judge,在線判題網(wǎng)站)上做編程題,俗稱“刷題”。初級(jí)程序員經(jīng)常遇到這樣的情況:程序在自己的電腦上運(yùn)行明明是對的,但在網(wǎng)站上提交代碼后,網(wǎng)站卻報(bào)告答案錯(cuò)誤。原因是什么呢?這是因?yàn)樽约哼\(yùn)行時(shí),輸入的數(shù)據(jù)只考慮一種或幾種情形,在這些情形下程序運(yùn)行結(jié)果是正確的。但在另外的情形下,程序運(yùn)行結(jié)果將是不正確的。拿排序程序來講,如果輸入已經(jīng)排好序的數(shù)據(jù),程序能正常工作,那么就能說程序百分百正確了嗎?

初級(jí)程序員還經(jīng)常遇到另一種情況,就是程序運(yùn)行一直異常終止或者結(jié)果總是不對,不得不一遍又一遍地修改,一遍又一遍地運(yùn)行程序。遇到這種情況是很耗費(fèi)時(shí)間的。如果加上以下兩種狀況,時(shí)間耗費(fèi)就更嚴(yán)重了。第一種狀況是每次運(yùn)行都在命令行終端上輸入一大批數(shù)據(jù)。第二種狀況是程序輸出內(nèi)容多又長。拿多又長的輸出內(nèi)容和期望輸出進(jìn)行人工比對,不僅耗時(shí)而且容易犯錯(cuò)。

假如在計(jì)算機(jī)協(xié)會(huì)舉辦的軟件能力認(rèn)證考試中遇到以上問題,考生的表現(xiàn)將大打折扣。除此之外,另一個(gè)阻礙考生在軟件能力認(rèn)證考試中拿高分的因素是:針對所提交的程序代碼,考試服務(wù)器不提供任何反饋。這與OJ的做法不同。針對所提交的程序代碼,OJ會(huì)提供諸如編譯錯(cuò)誤、超時(shí)、答案有誤和答案正確等反饋。

本文闡述解決以上問題的有效方法。方法的本質(zhì)是對程序進(jìn)行測試。這一本質(zhì)與軟件工程實(shí)踐采用的軟件測試方法是相同的。但不同的是,本文闡述的程序測試方法是輕型方法,而軟件工程實(shí)踐采用的方法是重型方法。初級(jí)程序員編寫的程序一般是小規(guī)模程序(代碼行數(shù)多在300行以下)。對于小規(guī)模的程序,采用重型測試方法是不現(xiàn)實(shí)的。原因在于,測試代碼量(以基于xUnit的單元測試為例),將遠(yuǎn)遠(yuǎn)大于程序代碼量。對于小規(guī)模的程序,本文闡述的輕型測試方法是非常適用的。近兩年的程序設(shè)計(jì)教學(xué)過程中,學(xué)生的實(shí)踐已經(jīng)證明了這一點(diǎn)。這一方法也可應(yīng)用到測試驅(qū)動(dòng)開發(fā)中。

本文闡述三種輕型測試方法。第一種是使用freopen函數(shù)的測試方法,在第二節(jié)展開敘述。第二種是使用重定向和批處理程序的方法,在第三節(jié)展開敘述。第三種是輕型單元測試方法,在第四節(jié)展開敘述。第五節(jié)是結(jié)束語。

1 使用freopen函數(shù)的方法

這一做法是在程序中調(diào)用freopen函數(shù)。該函數(shù)的功能是把文件重定向?yàn)闃?biāo)準(zhǔn)輸入,或把標(biāo)準(zhǔn)輸出重定向至文件。freopen函數(shù)聲明如下:

FILE*freopen(const char*filename,const char*mode,F(xiàn)ILE*stream):

其中,參數(shù)filename是文件路徑。參數(shù)mode是文件打開方式,例如“r”代表讀打開,“w”代表寫打開。參數(shù)stream是已經(jīng)打開的文件流。函數(shù)的功能是:(1)關(guān)閉stream關(guān)聯(lián)的文件流。(2)以mode方式打開filename所指定的文件file;(3)把文件file與文件流stream相關(guān)聯(lián)。(4)如果函數(shù)執(zhí)行失敗,則返回NULL。圖1舉例說明freopen函數(shù)的用法。

圖l中,stdin代表標(biāo)準(zhǔn)輸入,stdout代表標(biāo)準(zhǔn)輸出?!癴reopen(“in.txt”,“r”,stdin)”是把標(biāo)準(zhǔn)輸入重定向到in.txt文件。這樣,當(dāng)程序從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)時(shí),不再從鍵盤讀取,而是從in.txt文件讀取?!癴reopen(”out.txt”,”w”,stdout)”是把標(biāo)準(zhǔn)輸出重定向到out.txt文件。這樣,當(dāng)程序向標(biāo)準(zhǔn)輸出寫數(shù)據(jù)時(shí),不再寫到屏幕上,而是寫到out.txt文件中。值得提醒的是,freopen函數(shù)的第一個(gè)參數(shù)可以是任意的文件路徑。提交代碼的時(shí)候,要把調(diào)用freopen函數(shù)的相關(guān)語句注釋掉。

利用freopen函數(shù)測試程序的做法是:(1)編輯測試用的輸入數(shù)據(jù),保存至文本文件IN中。編輯包含正確輸出結(jié)果的文本文件EXPECTED。(2)在程序中,把標(biāo)準(zhǔn)輸入重定向至文本文件IN,把標(biāo)準(zhǔn)輸出重定向至文本文件OUT。(3)比對OUT文件與EXPECTED文件,如果內(nèi)容一致,則測試通過,否則測試不通過。

使用freopen函數(shù)的好處有兩點(diǎn)。一是減免了手工輸入數(shù)據(jù)的環(huán)節(jié)。這在反復(fù)運(yùn)行程序的情形下是有幫助的。二是可以利用文件比較命令來比對運(yùn)行結(jié)果文件和期望結(jié)果文件是否一致。Windows系統(tǒng)中,文件比對命令fc能夠比對兩個(gè)文件的內(nèi)容是否一致。fc命令的用法如下:

fc /Nd:\tmp\out.txt d:\result\expected.txt

上述命令比對的是out.txt文件和expected.txt的內(nèi)容是否一致。如果一致,將報(bào)告兩個(gè)文件無差異;否則將分別顯示兩個(gè)文件相異之處的行號(hào)及內(nèi)容。Linux系統(tǒng)中,文件比對命令是diff命令,用法類似于fc命令。

在程序中調(diào)用freopen函數(shù)這一做法的毛病在于一次運(yùn)行只能處理一組測試數(shù)據(jù)。要處理另一組測試數(shù)據(jù),要么改動(dòng)調(diào)用freopen函數(shù)所使用的文件路徑參數(shù),要么更換輸入文件的內(nèi)容。下面闡述的“使用重定向和批處理程序”的做法能一次處理多組測試數(shù)據(jù)。

2 使用重定向和批處理程序的方法

假設(shè)編譯一個(gè)源程序生成的可執(zhí)行程序叫shuZuQuShu.exe,那么我們可以在命令行界面運(yùn)行該程序并且進(jìn)行輸入輸出重定向,見圖2。

上圖中的命令行中,“c:\Users\yeah>”是命令行提示符。shuZuQuShu是命令名(省略了后綴名“.exe”),即程序名?!?in.txt”是輸入重定向,作用是拿in.txt文件代替鍵盤輸入?!皁ut.txt”是輸出重定向,就是把輸出到屏幕的內(nèi)容改成寫入out.txt文件中。查看out.txt文件的內(nèi)容,你可以判斷程序是否正確運(yùn)行。需要注意的是,源程序中不能使用freopen()函數(shù)。

要用另一組數(shù)據(jù)來檢驗(yàn)該程序,命令可以換成:

shuZuQuShuout2.txt

效果是拿in2.txt文件代替鍵盤輸入,把輸出寫入到out2.txt文件中。查看out2.txt文件的內(nèi)容,你可以判斷程序是否正確運(yùn)行。

一旦需要反復(fù)運(yùn)行程序,在命令行界面中輸入包含重定向的命令有些繁瑣。一個(gè)更好的做法是使用批處理程序。圖3是一個(gè)批處理程序的示例。批處理程序中,每一行都是一條命令。例如,圖3的第一行是運(yùn)行shuZuQuShu程序。第二行是運(yùn)行文件比對命令fc,其中no_sell_expected.txt是期望的結(jié)果文件。該批處理程序的功能是多次運(yùn)行shuZuQuShu.exe這個(gè)程序,每次運(yùn)行把不同的數(shù)據(jù)文件重定向?yàn)闃?biāo)準(zhǔn)輸入,把標(biāo)準(zhǔn)輸出重定向至不同的結(jié)果文件,然后比對輸出結(jié)果文件和期望結(jié)果文件。運(yùn)行這樣的批處理程序一次,能用多組測試數(shù)據(jù)來驗(yàn)證程序的正確性。

批處理程序是一個(gè)文本文件,可用一個(gè)編輯器(比如notepad)編輯生成。Windows系統(tǒng)中,批處理程序文件的后綴名是“.bat”,取的是batch(中文翻譯是批處理)的前三個(gè)字母。Linux系統(tǒng)中,則可以使用腳本程序來完成類似功能。

運(yùn)行一個(gè)批處理程序的方法是:啟動(dòng)命令行界面,用cd命令(切換文件夾命令,有時(shí)還要用到切換盤符命令)把當(dāng)前文件夾切換到批處理程序所在文件夾。然后敲入運(yùn)行批處理程序的命令(見以下示例中下劃線部分),例如:

C:\Users\yeah>runTestcases.bat

要注意的是,一個(gè)批處理程序要能夠找到它用到的各類文件,例如命令程序文件和數(shù)據(jù)文件。上述批處理程序要在自己所在的文件夾的debug子文件夾內(nèi)能找到shuZuQuShu.exe文件,也能夠找到testdataYno_sell_in.txt文件。

“利用重定向和批處理”的方法是對程序整體進(jìn)行測試。這種方法的不足是:在程序有錯(cuò)誤時(shí),能告訴你不正確,但沒有提供錯(cuò)在哪里的線索。下面描述的輕型單元測試方法能幫助你定位錯(cuò)誤的位置。

3 輕型單元測試方法

輕型單元測試方法包含兩個(gè)環(huán)節(jié):編寫完成程序功能的函數(shù)(叫做功能代碼)和編寫測試函數(shù)正確性的代碼(叫做測試代碼)。這里強(qiáng)調(diào),寫功能代碼時(shí)避免使用大函數(shù),要把大函數(shù)分解成若干短小的函數(shù),分別測試。這樣就容易定位錯(cuò)誤和改正錯(cuò)誤。

下面舉例講解輕型單元測試方法。示例使用的程序題目取自2015年3月軟件能力認(rèn)證考試的第3題,題目名稱為“節(jié)日”。該題目提供的輸入有兩個(gè)年份yl和y2,月份m,第n個(gè)星期d(d=l,2,…,7,7對應(yīng)星期日);要求輸出對于yl年到y(tǒng)2年之間的每一年,該年m月第n個(gè)星期d是幾月幾號(hào)。該題的代碼見代碼清單1。限于篇幅,僅僅給出部分代碼(用省略號(hào)代替部分代碼),但足以說清楚輕型單元測試方法是什么和怎么做。完整的程序代碼一共有6個(gè)功能函數(shù)(不含主函數(shù))。我們測試了其中兩個(gè)擔(dān)心會(huì)出錯(cuò)的函數(shù)。

說明幾點(diǎn):

l.testcases函數(shù)的作用是調(diào)用其他測試函數(shù)。這樣做能避免在源文件上部聲明每一個(gè)測試函數(shù)。

2.assert本質(zhì)上是一個(gè)宏,叫做assert斷言,用法類似于函數(shù)。它的作用是驗(yàn)證括號(hào)內(nèi)的表達(dá)式是否為真,如果不為真則中斷程序執(zhí)行并報(bào)告程序錯(cuò)誤。只有測試函數(shù)內(nèi)所有assert斷言都為真,測試才能夠通過。

3.如果上例中的get_date_in_month函數(shù)不是返回日期值,而是輸出該值到屏幕,則無法對其進(jìn)行測試。

當(dāng)一個(gè)測試函數(shù)中的assert斷言不成立時(shí),表明與之相對的被測函數(shù)存在錯(cuò)誤。這就幫助我們定位了錯(cuò)誤。函數(shù)越簡短,定位錯(cuò)誤越精準(zhǔn),改正錯(cuò)誤也就越容易。要特別注意,測試數(shù)據(jù)需細(xì)心準(zhǔn)備。用錯(cuò)誤的測試數(shù)據(jù)(無論是輸入數(shù)據(jù)還是期望的輸出數(shù)據(jù))來測試函數(shù),即使被測函數(shù)邏輯正確,也會(huì)被視為錯(cuò)誤。

輕型單元測試方法簡便實(shí)用。但它無法對程序輸入環(huán)節(jié)進(jìn)行測試。

4.結(jié)論

本文描述的輕型程序測試方法的優(yōu)點(diǎn)是易學(xué)易用,適用于在OJ網(wǎng)站刷題和計(jì)算機(jī)軟件能力認(rèn)證考試等場合。在這些場合,程序員編寫的程序一般屬于小規(guī)模程序(代碼量多在300行以下)。軟件工程實(shí)踐采用的重型測試方法不適用。原因在于測試代碼量顯著大于程序代碼量。

上面描述的三種輕型程序測試方法各有所長?!笆褂胒reopen函數(shù)的方法”一次只能處理一組測試數(shù)據(jù),而“使用重定向和批處理程序的方法”一次能處理多組測試數(shù)據(jù)。這兩種方法都利用了文件流重定向,對整個(gè)程序進(jìn)行測試。它們的不足是在程序有錯(cuò)誤時(shí),能告訴你不正確,但沒有提供錯(cuò)在哪里的線索。輕型單元測試方法能夠定位錯(cuò)誤,但無法測試程序輸入輸出環(huán)節(jié)。只要輕型單元測試方法與其他兩種方法的任一種結(jié)合使用,就既能定位錯(cuò)誤,又能測試程序輸入輸出環(huán)節(jié)。

猜你喜歡
重定向單元測試軟件工程
解決安卓文件夾亂象
重復(fù)壓裂裂縫重定向的措施研究
4G偽基站的監(jiān)測定位與規(guī)避協(xié)同分析
依托工作室的軟件工程實(shí)踐教學(xué)研究
基于工程教育認(rèn)證的《軟件工程》課程教學(xué)質(zhì)量建設(shè)研究 
關(guān)于提高軟件工程實(shí)踐教學(xué)質(zhì)量的幾點(diǎn)思考
關(guān)于如何創(chuàng)新和完善計(jì)算機(jī)軟件工程管理的探討
一年級(jí)上冊第五單元測試
一年級(jí)上冊一、二單元測試
基于馬氏體重定向的鐵磁形狀記憶合金本構(gòu)理論分析
通渭县| 峨眉山市| 梧州市| 怀仁县| 喀喇沁旗| 石首市| 平阳县| 茌平县| 海原县| 晴隆县| 尤溪县| 景东| 茂名市| 山东| 高安市| 新田县| 托克逊县| 鄂伦春自治旗| 孟州市| 康定县| 贵南县| 庆阳市| 银川市| 扎赉特旗| 洞口县| 德保县| 绵竹市| 鹤庆县| 临澧县| 镇赉县| 萨迦县| 固始县| 轮台县| 金溪县| 湟源县| 建湖县| 远安县| 黄龙县| 新宾| 迭部县| 聂拉木县|