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

        ?

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

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

        葉常春++尹良澤

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

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

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

        引言

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

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

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

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

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

        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是文件打開(kāi)方式,例如“r”代表讀打開(kāi),“w”代表寫(xiě)打開(kāi)。參數(shù)stream是已經(jīng)打開(kāi)的文件流。函數(shù)的功能是:(1)關(guān)閉stream關(guān)聯(lián)的文件流。(2)以mode方式打開(kāi)filename所指定的文件file;(3)把文件file與文件流stream相關(guān)聯(lián)。(4)如果函數(shù)執(zhí)行失敗,則返回NULL。圖1舉例說(shuō)明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í),不再?gòu)逆I盤(pán)讀取,而是從in.txt文件讀取?!癴reopen(”out.txt”,”w”,stdout)”是把標(biāo)準(zhǔn)輸出重定向到out.txt文件。這樣,當(dāng)程序向標(biāo)準(zhǔn)輸出寫(xiě)數(shù)據(jù)時(shí),不再寫(xiě)到屏幕上,而是寫(xiě)到out.txt文件中。值得提醒的是,freopen函數(shù)的第一個(gè)參數(shù)可以是任意的文件路徑。提交代碼的時(shí)候,要把調(diào)用freopen函數(shù)的相關(guān)語(yǔ)句注釋掉。

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

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

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

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

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

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

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

        上圖中的命令行中,“c:\Users\yeah>”是命令行提示符。shuZuQuShu是命令名(省略了后綴名“.exe”),即程序名。“

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

        shuZuQuShuout2.txt

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

        一旦需要反復(fù)運(yùn)行程序,在命令行界面中輸入包含重定向的命令有些繁瑣。一個(gè)更好的做法是使用批處理程序。圖3是一個(gè)批處理程序的示例。批處理程序中,每一行都是一條命令。例如,圖3的第一行是運(yùn)行shuZuQuShu程序。第二行是運(yùn)行文件比對(duì)命令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é)果文件,然后比對(duì)輸出結(jié)果文件和期望結(jié)果文件。運(yùn)行這樣的批處理程序一次,能用多組測(cè)試數(shù)據(jù)來(lái)驗(yàn)證程序的正確性。

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

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

        C:\Users\yeah>runTestcases.bat

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

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

        3 輕型單元測(cè)試方法

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

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

        說(shuō)明幾點(diǎn):

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

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

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

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

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

        4.結(jié)論

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

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

        猜你喜歡
        重定向單元測(cè)試軟件工程
        解決安卓文件夾亂象
        重復(fù)壓裂裂縫重定向的措施研究
        4G偽基站的監(jiān)測(cè)定位與規(guī)避協(xié)同分析
        依托工作室的軟件工程實(shí)踐教學(xué)研究
        基于工程教育認(rèn)證的《軟件工程》課程教學(xué)質(zhì)量建設(shè)研究 
        關(guān)于提高軟件工程實(shí)踐教學(xué)質(zhì)量的幾點(diǎn)思考
        關(guān)于如何創(chuàng)新和完善計(jì)算機(jī)軟件工程管理的探討
        一年級(jí)上冊(cè)第五單元測(cè)試
        一年級(jí)上冊(cè)一、二單元測(cè)試
        基于馬氏體重定向的鐵磁形狀記憶合金本構(gòu)理論分析
        中文字幕久久精品波多野结百度| 欧美群妇大交群| 国产精品永久久久久久久久久| 最近中文字幕完整版免费| 日本少妇人妻xxxxx18| 亚洲欧美国产成人综合不卡| 色综合久久人妻精品日韩| 精品人妻久久一区二区三区| 亚洲欧美色一区二区三区| 98久9在线 | 免费| 国产精品久久久久精品一区二区| 精品国模一区二区三区| 久久久久亚洲AV无码专区喷| 热热久久超碰精品中文字幕| 老女人下面毛茸茸的视频| 亚洲av中文无码字幕色本草| 中文字字幕在线精品乱码| 久久精品一品道久久精品9| 日韩一区二区,亚洲一区二区视频| 久久综合久久综合久久| 一女被多男玩喷潮视频| 色伦专区97中文字幕| 欧美1区二区三区公司| 中文字幕亚洲乱码熟女1区2区| 国产av在线观看久久| 久久综合给合综合久久| 亚洲国产A∨无码影院| av二区三区在线观看| 人妻熟女翘屁股中文字幕| 女的扒开尿口让男人桶30分钟| 国产av国片精品| 亚洲av成人一区二区三区不卡| 国产在线91精品观看| 亚洲性无码一区二区三区| 精品熟女少妇av免费观看| 日韩av一区二区三区精品| 精品三级国产一区二区三| 综合色区亚洲熟妇另类| 国偷自产av一区二区三区| 国产精品一区二区三区黄片视频 | 五月婷婷丁香视频在线观看|