![[計(jì)算機(jī)軟件及應(yīng)用]C軟件測(cè)試自動(dòng)化之道_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-9/28/1205f032-615e-41f0-ba5f-4cc6381b0dd3/1205f032-615e-41f0-ba5f-4cc6381b0dd31.gif)
![[計(jì)算機(jī)軟件及應(yīng)用]C軟件測(cè)試自動(dòng)化之道_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-9/28/1205f032-615e-41f0-ba5f-4cc6381b0dd3/1205f032-615e-41f0-ba5f-4cc6381b0dd32.gif)
![[計(jì)算機(jī)軟件及應(yīng)用]C軟件測(cè)試自動(dòng)化之道_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-9/28/1205f032-615e-41f0-ba5f-4cc6381b0dd3/1205f032-615e-41f0-ba5f-4cc6381b0dd33.gif)
![[計(jì)算機(jī)軟件及應(yīng)用]C軟件測(cè)試自動(dòng)化之道_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-9/28/1205f032-615e-41f0-ba5f-4cc6381b0dd3/1205f032-615e-41f0-ba5f-4cc6381b0dd34.gif)
![[計(jì)算機(jī)軟件及應(yīng)用]C軟件測(cè)試自動(dòng)化之道_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-9/28/1205f032-615e-41f0-ba5f-4cc6381b0dd3/1205f032-615e-41f0-ba5f-4cc6381b0dd35.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一章api測(cè)試1.0 導(dǎo)讀api(application programming interface)測(cè)試的自動(dòng)化是軟件測(cè)試自動(dòng)化最基本的一種類(lèi)型。從本質(zhì)上說(shuō),api測(cè)試時(shí)用來(lái)驗(yàn)證組成軟件的那些單個(gè)方法的正確性,而不是測(cè)試整個(gè)系統(tǒng)本身。api測(cè)試也被稱(chēng)作單元測(cè)試(unit testing),模塊測(cè)試(module testing),組件測(cè)試(component testing)以及元件測(cè)試(element testing)。1.1存儲(chǔ)用于測(cè)試用例的數(shù)據(jù)問(wèn)題:如何在一個(gè)簡(jiǎn)單的文本文件里創(chuàng)建并存儲(chǔ)用于api測(cè)試用例的數(shù)據(jù);設(shè)計(jì):使用逗號(hào)作為分隔符的文本文件,這個(gè)文件包含一個(gè)唯一的測(cè)試用例id,一
2、個(gè)或者多個(gè)輸入值和期望結(jié)果方案:0001:aritheticmean:2 4 8:4.66670002:aritheticmean:1 5:3.00001.2讀入測(cè)試用例數(shù)據(jù)問(wèn)題:如何從測(cè)試用例文件(簡(jiǎn)單的文本文件)中讀入每條測(cè)試用例。設(shè)計(jì):通過(guò)while循環(huán)遍歷 測(cè)試用例文件的每一行,使用system.io.streamreader 對(duì)象讀入測(cè)試用例。方案:filestream fs= new filestream(“.testcases.txt”, filemode.open);streamreader sr=new streamreader(fs);string line;/解析每個(gè)測(cè)試
3、用例行/調(diào)用待測(cè)方法/判斷通過(guò)與否/記錄測(cè)試用例結(jié)果sr.close ();fs.close ();filestream類(lèi)對(duì)文件系統(tǒng)上的文件進(jìn)行讀取、寫(xiě)入、打開(kāi)和關(guān)閉操作,并對(duì)其他與文件相關(guān)的操作系統(tǒng)句柄進(jìn)行操作,如管道、標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出。讀寫(xiě)操作可以指定為同步或異步操作。filestream對(duì)輸入輸出進(jìn)行緩沖,從而提高性能。filestream對(duì)象支持使用seek方法對(duì)文件進(jìn)行隨機(jī)訪(fǎng)問(wèn)。seek允許將讀取/寫(xiě)入位置移動(dòng)到文件中的任意位置。這是通過(guò)字節(jié)偏移參考點(diǎn)參數(shù)完成的。字節(jié)偏移量是相對(duì)于查找參考點(diǎn)而言的,該參考點(diǎn)可以是基礎(chǔ)文件的開(kāi)始、當(dāng)前位置或結(jié)尾,分別由seekorigin類(lèi)的三個(gè)屬性
4、表示。c# filestream寫(xiě)文件之文件頭:usingsystem; usingsystem.collections.generic; usingsystem.text; usingsystem.io;c# filestream寫(xiě)文件之讀文件核心代碼:bytebydatafilestream=newbyte100; charchardata=newchar1000; try filestreamsfile=newfilestream(文件路徑,filemode.open); sfile.seek(55,seekorigin.begin); sfile.read(bydata,0,100);
5、 /第一個(gè)參數(shù)是被傳進(jìn)來(lái)的字節(jié)數(shù)組, /用以接受filestream對(duì)象中的數(shù)據(jù), /第2個(gè)參數(shù)是字節(jié)數(shù)組中開(kāi)始寫(xiě)入數(shù)據(jù)的位置, /它通常是0,表示從數(shù)組的開(kāi)端文件中向數(shù)組寫(xiě)數(shù)據(jù), /最后一個(gè)參數(shù)規(guī)定從文件讀多少字符. catch(ioexceptione) console.writeline(anioexceptionhasbeenthrown!); console.writeline(e.tostring(); console.readline(); return; decoderd=encoding.utf8.getdecoder(); d.getchars(bydata,0,bydat
6、a.length,chardata,0); console.writeline(chardata); console.readline(); c# filestream寫(xiě)文件之寫(xiě)文件核心代碼:filestreamfs=newfilestream(文件路徑,filemode.create); /獲得字節(jié)數(shù)組 bytedata=newutf8encoding().getbytes(string); /開(kāi)始寫(xiě)入 fs.write(data,0,data.length); /清空緩沖區(qū)、關(guān)閉流 fs.flush(); fs.close();1.3 解析測(cè)試用例問(wèn)題:如何解析出由字符分隔開(kāi)的測(cè)試用例的各
7、個(gè)階段。設(shè)計(jì):使用string.split()方法,把分隔符作為輸入傳給它,然后把返回值存入到一個(gè)字符數(shù)組。方案:string line, caseid, method;string tokens, tempinput;string expected;while ( line=sr.readerline( ) !=null) tokens=line.split( :); caseid=tokens0 method=tokens1; tempinput=tokens2.split( ); expected=tokens3; /etcc# 中 string 的 split 方法將字符串分隔后返回字
8、符串?dāng)?shù)組。如字段ps_class存儲(chǔ)的值是:1,2,3string psclass = drps_class.tostring();string sarray = psclass.split(,);foreach(string i in sarray)console.writeline(i.tostring();輸入為:123有很多類(lèi)似如下的示例:string arr = str.split(o);這是一個(gè)具有語(yǔ)法錯(cuò)誤的語(yǔ)句,split 的 separator 參數(shù)應(yīng)該是 char 或 string,不應(yīng)是字符串。正確的示例:string str = technology;char separ
9、ator = o ;string arr = str.split(separator);split 有六個(gè)重載函數(shù),大概有兩類(lèi):一類(lèi)的 separator 為 char ;另一類(lèi)為 string 。我們以 string 為例講述它的兩個(gè)重載函數(shù)。string.split(string separator, stringsplitoptions options);string.split(string separator, int count, stringsplitoptions options);separator 為分隔字符串的字符串?dāng)?shù)組,由于是數(shù)組,可以同時(shí)使用多個(gè)“分隔符”了。 opt
10、ions 有兩個(gè)值可選:stringsplitoptions.none 分隔后遇到的空字符串要作為數(shù)組元素的一項(xiàng)返回;stringsplitoptions.removeemptyentries 分隔后遇到的空字符串不作為數(shù)組元素的一項(xiàng)返回。 count 分隔后返回的數(shù)組的最大長(zhǎng)度。公交數(shù)據(jù):.廣州060501|數(shù)據(jù)制作:|更新時(shí)間:2006-04-30 00:43:43101路 海印橋站-星之光電器城站-白云路站-越秀南路站-省博物館站-文明路站-大南路站-解放中路站-迎賓館站-越秀公園站-桂花崗站-三元里站-機(jī)場(chǎng)路站:06:00-01:10101路 機(jī)場(chǎng)路站-中醫(yī)學(xué)院站-桂花崗站-越秀公園站
11、-迎賓館站-解放中路站-起義路口站-大南路站-文明.路站-省博物館站-越秀南路站-白云路站-星之光電器城站-海印橋站:06:00-01:10.string txtlines = dat.substring(dat.indexof(rn).split(new string rn , stringsplitoptions.removeemptyentries);這句的意思是 從dat的數(shù)據(jù)中第一個(gè)換行開(kāi)始截取取得的 是101路 海印橋站-星之光電器城站-白云路站-越秀南路站-省博物館站-文明路站-大南路站-解放中路站-迎賓館站-越秀公園站-桂花崗站-三元里站-機(jī)場(chǎng)路站:06:00-01:10101
12、路 機(jī)場(chǎng)路站-中醫(yī)學(xué)院站-桂花崗站-越秀公園站-迎賓館站-解放中路站-起義路口站-大南路站-文明.路站-省博物館站-越秀南路站-白云路站-星之光電器城站-海印橋站:06:00-01:10.然后從這數(shù)據(jù)中 利用換行符 分割成 string 數(shù)組stringsplitoptions.removeemptyentries 是去掉 空的rn 是換行string.join 方法string.join (string, string ) 在指定 string 數(shù)組的每個(gè)元素之間串聯(lián)指定的分隔符 string,從而產(chǎn)生單個(gè)串聯(lián)的字符串string txtlines=fck,fuckdfd,f;string
13、jn = string.join(-, txtlines);jn=fck-fuckdfd-f;-string.split 方法有6個(gè)重載函數(shù):程序代碼1) public string split(params char separator)2) public string split(char separator, int count)3) public string split(char separator, stringsplitoptions options)4) public string split(string separator, stringsplitoptions optio
14、ns)5) public string split(char separator, int count, stringsplitoptions options)6) public string split(string separator, int count, stringsplitoptions options)下邊我們通過(guò)一些實(shí)例來(lái)說(shuō)明下怎么使用(以下string words = 1,2.3,4;):1. public string split(params char separator)程序代碼string split = words.split(new char , );/返回:1,
15、2.3,4string split = words.split(new char , . );/返回:1,2,3,42. public string split(char separator, int count)程序代碼string split = words.split(new char , . , 2);/返回:1,2.3,4string split = words.split(new char , . , 6);/返回:1,2,3,43. public string split(char separator, stringsplitoptions options)程序代碼string
16、split = words.split(new char , . , stringsplitoptions.removeemptyentries);/返回:1,2,3,4 不保留空元素string split = words.split(new char , . , stringsplitoptions.none);/返回:1,2,3,4 保留空元素4. public string split(string separator, stringsplitoptions options)程序代碼string split = words.split(new string , . , stringsp
17、litoptions.removeemptyentries);/返回:1,2,3,4 不保留空元素string split = words.split(new string , . , stringsplitoptions.none);/返回:1,2,3,4 保留空元素5. public string split(char separator, int count, stringsplitoptions options)程序代碼string split = words.split(new char , . , 2, stringsplitoptions.removeemptyentries);
18、/返回:1,2.3,4 不保留空元素string split = words.split(new char , . , 6, stringsplitoptions.none);/返回:1,2,3,4 保留空元素6. public string split(string separator, int count, stringsplitoptions options)程序代碼string split = words.split(new string , . , 2, stringsplitoptions.removeemptyentries);/返回:1,2.3,4 不保留空元素string s
19、plit = words.split(new string , . , 6, stringsplitoptions.none);/返回:1,2,3,4 保留空元素 需要注意的是沒(méi)有重載函數(shù)public string split(string separator),所以我們不能像vb.net那樣使用words.split(,),而只能使用words.split(,)!很多人都很奇怪為什么把雙引號(hào)改為單引號(hào)就可以了?看了上邊的重載函數(shù)該知道答案了1.4把數(shù)據(jù)轉(zhuǎn)化為合適的類(lèi)型問(wèn)題:如何把測(cè)試用例的輸入數(shù)據(jù)或者期望結(jié)果從string類(lèi)型轉(zhuǎn)化成其他的數(shù)據(jù)類(lèi)型,這樣就可以把轉(zhuǎn)化后的數(shù)據(jù)傳給待測(cè)方法或者把期
20、望結(jié)果與實(shí)際結(jié)果進(jìn)行比較。設(shè)計(jì):通過(guò)選用合適的靜態(tài)parse()方法,實(shí)施顯示的類(lèi)型轉(zhuǎn)換。方案:int input=new int tempinput.length;for (int i=0; i input.length; +i)input i=int.parse(tempinputi);每個(gè)c#數(shù)據(jù)類(lèi)型都支持靜態(tài)的parse()方法,這個(gè)方法接受一個(gè)string作為參數(shù),并且返回調(diào)用者所用的數(shù)據(jù)類(lèi)型。例如:string s1=“345.67”;double d=double.parse(s1);string s2=”true”;bool b=bool.parse(s2);除了使用parse
21、( ), 還可以使用systemconvert 類(lèi)的靜態(tài)方法。例如:string s1=”345.67”;double d=convert.todouble(s1);string s2=”true”;bool b=convert.toboolean(s2);convert方法進(jìn)行的是.net數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,而不是直接把它們轉(zhuǎn)換成相應(yīng)的c#類(lèi)型。使用convert的好處是,它從語(yǔ)法上不像parse( )方法那樣是以c#為中心的,所以如果你需要把自動(dòng)化測(cè)試程序從c#轉(zhuǎn)換成vb.net就可以少一些工作量。使用parse ( )方法的好處是,可以直接轉(zhuǎn)換成相應(yīng)的c#數(shù)據(jù)類(lèi)型,如果在100%的c#環(huán)
22、境中,這么做可以讓代碼讀起來(lái)容易。1.5 判定測(cè)試用例是否通過(guò)問(wèn)題:如何判定api測(cè)試用例是通過(guò)還是失敗。設(shè)計(jì):調(diào)用待測(cè)方法,傳給它測(cè)試用例的輸入,得到返回值,然后比較實(shí)際結(jié)果與從測(cè)試用例中讀入的期望結(jié)果是否一致。方案:string method, expected;double actual=0.0;if (method=”arithmeticmean”) actual=mathlib.methods.arithmeticmean(input); if (actual.tostring(“f4”)=expected) console.writeline(“pass”); else conso
23、le.writeline(“*fail*”);1.6 記錄測(cè)試用例結(jié)果問(wèn)題:如何判定api測(cè)試用例是通過(guò)還是失敗。設(shè)計(jì):在處理測(cè)試用例的主循環(huán)中,使用一個(gè)system.io.streamwriter對(duì)象,把測(cè)試用例和測(cè)試結(jié)果寫(xiě)到一個(gè)文本文件。方案:/此處打開(kāi)streamreader srfilestream ofs=new filestream(“.testresults.txt”, filemode.createnew);streamwriter sw=new streamwriter(ofs);string line, caseid, method, expected;double act
24、ual=0.0;while (line=sr.readline( )!=null) /此處對(duì)”line” 進(jìn)行解析 if (method=”arithmeticmean”) actual=mathlib.methods.arithmeticmean(input); if (actual.tostring(“f4”)=expected) console.writeline(caseid+“pass”); sw.writeline(caseid+”pass”); else console.writeline (caseid+”*fail*”); sw.writeline(caseid + “*fa
25、il*”); 1.7 給測(cè)試用例結(jié)果加上時(shí)間戳問(wèn)題:如何給測(cè)試用例結(jié)果加上時(shí)間戳,以便于區(qū)分不同批次的運(yùn)行結(jié)果。設(shè)計(jì):把datetime.now 屬性作為參數(shù)傳給ceatedirectoy( )這個(gè)靜態(tài)方法,用以創(chuàng)建一個(gè)帶時(shí)間戳的文件夾。另外,可以把datetime.now 傳給filesteam()的構(gòu)造函數(shù),并且用它來(lái)創(chuàng)建一個(gè)帶時(shí)間戳的文件名。方案:創(chuàng)建時(shí)間戳的文件夾string folder=”results”+datetime.now.tostring(“s”);folder=folder.replace(“:”,”-“);directory.createdirectory(“.”+f
26、older);string path=”.” +folder+testresults.txt;filestream ofs=new filestream(path, filemode.create);streamwriter sw=new streamwriter(ofs);創(chuàng)建時(shí)間戳的文件名string stamp =datetime.now.tostring(“s”);stamp=stamp.replace(“:”,”-“);string path =”.testresults-“+stamp+”.txt”;filestream ofs=new filestream(path, filem
27、ode.create);streamwriter sw=new streamwriter(ofs);1.8 通過(guò)計(jì)算對(duì)測(cè)試結(jié)果進(jìn)行總結(jié)問(wèn)題:如何給測(cè)試用例結(jié)果加上時(shí)間戳,以便于區(qū)分不同批次的運(yùn)行結(jié)果。設(shè)計(jì):使用簡(jiǎn)單的整數(shù)計(jì)數(shù)器,在每次運(yùn)行測(cè)試的時(shí)候,把計(jì)數(shù)器初始化為0。方案:int numpass=0, numfail=0;while (line=sr.readline( )!=null)actual=mathlib.methods.arithmeticmean(input);if (actual.tostring(“f4”)= =expected) console.writeline(“pa
28、ss”); +uumpass; else console.writeline(“*fail*”); +numfail;elseconsole.writeline(“unkonwn method”/對(duì)numpass 或numfail沒(méi)有影響/loop1.9 獲得測(cè)試運(yùn)行的總時(shí)間問(wèn)題:如何給測(cè)試用例結(jié)果加上時(shí)間戳,以便于區(qū)分不同批次的運(yùn)行結(jié)果。設(shè)計(jì):通過(guò)datetime.now 屬性記錄測(cè)試開(kāi)始運(yùn)行的時(shí)間,以及測(cè)試結(jié)束的時(shí)間。然后用一個(gè)timespan對(duì)象計(jì)算本次運(yùn)行的總時(shí)間。方案:datetime starttime=datetime.now;while (line=sr. readline(
29、) )!=null)/運(yùn)行測(cè)試datetime endtime=datetime.now;timespan elapsedtime=endtime-starttime;console.writeline(“elapsed time=”+elaspedtime.tostring( ) );1.10 處理輸入為空值或期望值為空的情況問(wèn)題: 如何驗(yàn)證待測(cè)程序的api方法能否正確地處理傳給它的null參數(shù)設(shè)計(jì): 使用一個(gè)特殊的字符串標(biāo)記來(lái)表示測(cè)試用例數(shù)據(jù)文件里的null值。在測(cè)試套件里添加相應(yīng)的處理邏輯,把null標(biāo)記轉(zhuǎn)換成null輸入值。方案: 修改最初的待測(cè)方法arithmeticmean(),以
30、處理null輸入:public static double arithmeticmean(params int vals) if(vals = null) return 0.0;/修正 double sum = 0.0; foreach(int v int vals) sum += v; return (double)(sun/vals.length);/arithmeticmean可以像下面這樣把null標(biāo)記加入測(cè)試用例數(shù)據(jù):0001:arithmeticmean:2 4 8:4.66670002:arithmeticmean:null:0.0000然后像下面這樣處理這個(gè)標(biāo)記:string
31、line,caseid,method;string tokens,tempinput;int input = null;double expected,actual;while (line = sr.readline() != null) tokens = line.split(:); caseid = tokens0; method = tokens1; if(tokens2 = null) /輸入為null input = null; else tempinput = tokens2.split( ); input = new inttempinput.length; for(int i
32、= 0;i input.length; +i) inputi = int.parse(tempinputi); expected = double.parse(tokens3); actual = mathlib.methods.arithmeticmean(input); if(actual = expected) console.writeline(caseid + pass); else console.writeline(caseid + *fail*);/while注解: 針對(duì)輸入?yún)?shù)為null的情況,對(duì)api方法進(jìn)行測(cè)試是非常重要的。由于我們沒(méi)有辦法在測(cè)試用例數(shù)據(jù)文件里直接存儲(chǔ)一個(gè)
33、null值,所以我們使用字符串標(biāo)記null。用null來(lái)表示null值并不是什么嚴(yán)格的規(guī)定,但這么做較之使用nil或者invalid可以使測(cè)試用例數(shù)據(jù)和測(cè)試代碼更容易被讀懂。當(dāng)我們?cè)陂喿x或者解析一個(gè)測(cè)試用例的時(shí)候,如果檢測(cè)到字符串“null”,就轉(zhuǎn)到測(cè)試套件中處理特殊情況的邏輯分支。到底采用什么樣的處理邏輯取決于待測(cè)方法的行為。 請(qǐng)注意:在聲明input變量的時(shí)候,給它賦的初值是null: int input = null; 如果在測(cè)試用例文件中讀到了null,就再給它賦一次null值: if(tokens2 = null) input = null; 從技術(shù)上說(shuō)這并不是必須的,但這么做可以讓
34、代碼更容易被讀懂并且易于修改。處理期望結(jié)果為null的情況與處理輸入?yún)?shù)為null的情況,其思想是一樣的。設(shè)想有一個(gè)名為hypergeometric()的新方法添加到了mathlib庫(kù)并接受測(cè)試,如果hypergemetic()方法的輸入?yún)?shù)全為0,那么這個(gè)方法返回一個(gè)null值。要測(cè)試這種情況,就可以在測(cè)試用例文件里存儲(chǔ)一個(gè)null字符串標(biāo)記:0001:hypergemetic:0 0 0 0:null:0002:hypergemetic:1 3 5 7:2 4:然后在測(cè)試套件里加上如下邏輯處理代碼:object expected = null;while (line = sr.readli
35、ne() != null) if(tokens3 = null) expected = null; else /此處把tokens3解析成期望對(duì)象 /etc.1.11 處理方法拋出異常的情況問(wèn)題: 如何測(cè)試一個(gè)拋出異常的方法。設(shè)計(jì): 在測(cè)試用例數(shù)據(jù)文件中嵌入一個(gè)特殊的字符串標(biāo)記,用來(lái)表示應(yīng)該由一個(gè)異常被拋出,把待調(diào)用的方法放到一個(gè)try塊里,這樣如果有異常拋出,就可以捕獲它。方案: 在測(cè)試程序數(shù)據(jù)里加一個(gè)exception標(biāo)記,作為期望值。0004:geometricmean:1 2 4 8 16 32:6.65690005:geometricmean:0 0 0 0 :exception00
36、06:geometricmean:2 4 8:4.0000然后就可以在測(cè)試程序的主循環(huán)里像下面這樣進(jìn)行處理:mathlib.methods m = new mathlib.methods();if(tokens3 = exception) try actual = m.geometricmean(input); catch(exception ex) console.writeline(caseid + pass); continue; console.writeline(caseid + *fail* no exception throw);else /采用常規(guī)的測(cè)試邏輯注解: 一種常見(jiàn)的情
37、況是,很多方法在處理某些給定的輸入時(shí)會(huì)拋出異常。例如,某個(gè)方法針對(duì)它的輸入?yún)?shù)做除法操作,如果這個(gè)參數(shù)值為0,就可能會(huì)拋出一個(gè)異常。在本例中,修改最初的geometricmean()方法。如果傳給它的參數(shù)值都是0,則拋出一個(gè)異常。通過(guò)檢查測(cè)試用例中是否有exception字符串來(lái)確定上述特殊的輸入值。如果找到,就轉(zhuǎn)到try塊里執(zhí)行g(shù)eometricmean()調(diào)用。如果像期望的那樣,有一個(gè)異常拋出,程序的控制權(quán)就會(huì)轉(zhuǎn)向catch塊,并且打印出的結(jié)果為pass。接下來(lái)會(huì)執(zhí)行continue語(yǔ)句,這時(shí)候就會(huì)轉(zhuǎn)向下一個(gè)測(cè)試用例。如果調(diào)用geometricmean()沒(méi)有拋出異常,程序的控制權(quán)會(huì)轉(zhuǎn)向下
38、面這條語(yǔ)句:console.writeline(caseid + *fail* no exception throw); 請(qǐng)注意,不要把那些調(diào)用不拋出異常的待測(cè)方法的代碼放到try塊里,因?yàn)槿绻挟惓1粧伋龅脑?huà),就會(huì)得到pass的結(jié)果。如果把處理拋出異常的情況和測(cè)試套件的正常處理邏輯含有成在一起處理,有可能會(huì)相當(dāng)棘手。有鑒于此,好的策略就是創(chuàng)建兩個(gè)不同的輕量級(jí)測(cè)試套件一個(gè)用來(lái)測(cè)試那些不拋出異常的測(cè)試用例,一個(gè)用來(lái)測(cè)試那些拋出異常的測(cè)試用例。 前面的這個(gè)方案只能測(cè)試是否有異常被拋出,而不能測(cè)試是否是某個(gè)特定的異常。某些情況下,可能想要檢查某個(gè)特定的異常是否被拋出。一種方法是在測(cè)試用戶(hù)文件中嵌入異
39、常信息,并且在測(cè)試套件中檢驗(yàn)它。例如,設(shè)想geometricmean()方法包含以下代碼:if (denominator = 0) throw new exception(invalid division);那么可以創(chuàng)建下面這個(gè)測(cè)試用例:0005:geometricmean:0 0 0 0:invalid division然后在測(cè)試程序的主循環(huán)里加入測(cè)試代碼:expected = tokens3; /invalid divisiontry actual = m.geometricmean(input);catch(exception ex) if(ex.message = expected)
40、console.writeline(caseid + pass;correct exception); continue; else console.writeline(caseid + *fail*;wrong exception); console.writeline(caseid + *fail*;no exception throw);1.12 處理輸入?yún)?shù)為空字符串的情況問(wèn)題: 如何測(cè)試傳給待測(cè)api方法的參數(shù)為空字符串的情況設(shè)計(jì): 使用一個(gè)特殊的字符串標(biāo)記來(lái)表示測(cè)試用例文件中的空字符串,并且在測(cè)試套件中加入相應(yīng)的邏輯處理分支,把真正的空字符串作為參數(shù)傳給待測(cè)api方法。方案: 創(chuàng)建
41、如下測(cè)試用例數(shù)據(jù):0001:substring:put:computer:true0002:substring:xyz:computer:false0003:substring:emptystring:computer:true在測(cè)試套件中加入特殊的邏輯處理代碼處理emptystring這個(gè)標(biāo)記:tokens = line.split(:);if (tokens2 = emptystring)/特殊輸入 arg1 = ;else arg1 = tokens2;bool actual = stringlib.methods.substring(arg1, tokens3);if (actual
42、= bool.parse(tokens4) console.writeline(pass);else console.writeline(*fail*);注解: 當(dāng)測(cè)試以字符串為參數(shù)的api方法時(shí),應(yīng)該總是測(cè)試字符串為空的情況。一種方法是,在測(cè)試用例文件里存儲(chǔ)一個(gè)特殊的字符串標(biāo)記,比如emptystring,然后在程序讀到這個(gè)標(biāo)記的時(shí)候轉(zhuǎn)入相應(yīng)的處理分支。例如,設(shè)想正在測(cè)試一個(gè)名為stringlib的程序庫(kù),它包含一個(gè)substring()方法,這個(gè)方法接受兩個(gè)字符串參數(shù),如果第二個(gè)字符串包含第一個(gè)字符串,則返回true。在設(shè)計(jì)的時(shí)候,規(guī)定:如果傳給它的第一個(gè)參數(shù)是空字符串,那么substri
43、ng()方法返回true。 與輸入值為null的情況不同,我們可以間接地在測(cè)試用例數(shù)據(jù)文件里存儲(chǔ)空字符串。例如,如下測(cè)試用例數(shù)據(jù):0003:substring:computer:true當(dāng)通過(guò)string.split()解析成一個(gè)名為tokens的字符串?dāng)?shù)組的時(shí)候,tokens2存儲(chǔ)的就是一個(gè)空字符串,因?yàn)橛袃蓚€(gè)相鄰的的冒號(hào)中間沒(méi)有值。但是,通常來(lái)說(shuō),最好還是存儲(chǔ)一個(gè)特殊的字符串,因?yàn)檫@樣可以例測(cè)試用例數(shù)據(jù)更容易讀懂并且易于通過(guò)程序進(jìn)行驗(yàn)證。 在測(cè)試用例數(shù)據(jù)文件里嵌入特殊字符串標(biāo)記來(lái)處理空字符串輸入,這種同樣可以應(yīng)用到測(cè)試其他不常用的輸入數(shù)據(jù)。例如,設(shè)想正在測(cè)試一個(gè)以字符為輸入?yún)?shù)的方法。你需
44、要測(cè)試控制字符,比如和,并且比較asii字符和unicode字符??梢栽跍y(cè)試用例數(shù)據(jù)存儲(chǔ)一些像,以及n0041“這樣的字符串,并且在測(cè)試套件里加入特殊的處理邏輯來(lái)處理它們:char inputif(tokens2 = ) /特殊輸入 input = x000d;else input = char.parse(tokens2); 如果測(cè)試用例數(shù)據(jù)文件經(jīng)常有許多特殊字符,可以寫(xiě)一個(gè)叫作map()的輔助方法,map方法把從測(cè)試用例數(shù)據(jù)文件讀到輸入值轉(zhuǎn)換成合適的參數(shù)值,這樣測(cè)試套件代碼就更為簡(jiǎn)潔并且易于擴(kuò)展或裁減。例如,可以把map()寫(xiě)成這樣:private static char map(stri
45、ng token) if(token = ) return x000d; else if (token = ) return x000a; /etc else return char.parse(token)然后就可以在測(cè)試套件里這么使用它:char input = map(token2);1.13 編寫(xiě)程序,在測(cè)試用例失敗時(shí)發(fā)送警告郵件問(wèn)題: 如何編寫(xiě)程序讓測(cè)試套件在測(cè)試用例失敗的時(shí)候發(fā)送郵件信息設(shè)計(jì): 使用system.net.mail命名空間里的mailmessage類(lèi)創(chuàng)建一個(gè)mailmessage對(duì)象。然后為這個(gè)對(duì)象提供to和subject等屬性值,并且把測(cè)試用例失敗的詳細(xì)信息添加到它
46、的body屬性。方案:if (method = arithmeticmean) actual = mathlib.methods.arithmeticmean(input); if (actual.tostring(f4) = expected) console.writeline(pass); else console.writeline(*fail*. sending e-mail); try mailmessage m = new mailmessage(); m.from = test automation harness; m.to = igoone; m.subject = tes
47、t case failure; m.bodyencoding = system.text.encoding.ascii; m.bodyformat = mailformat.html; m.priority = mailpriority.high; m.body = test case + caseid + failed; smtpmail.smtpserver = ; smtpmail.send(m); catch(exception ex) console.writeline(fatal error sending mail: + ex.message); /測(cè)試用例失敗
48、注解: 因?yàn)樽詣?dòng)化測(cè)試程序經(jīng)常在無(wú)人看管的情況下運(yùn)行,我們可能想要在測(cè)試用例失敗的時(shí)候給自己或者團(tuán)隊(duì)的某人人發(fā)送電子郵件,這樣測(cè)試用例的失敗信息就不會(huì)只存在于日志文件里而有可能不被注意到。我們還可能想要發(fā)送一封匯總了測(cè)試用例運(yùn)行結(jié)果的電子郵件。在.net環(huán)境下,有好幾種方法都可以通過(guò)編程的方式來(lái)發(fā)送電子郵件,但是通過(guò)system.net.mail命名空間里的mailmessage類(lèi),通常是最簡(jiǎn)單的方法。上述方案中的代碼假定已經(jīng)添加了一個(gè)指向system.net命名空間的工程引用(默認(rèn)情況下,這個(gè)命名空間對(duì)于控制臺(tái)程序來(lái)說(shuō)是不可訪(fǎng)問(wèn)的),并且在測(cè)試套件代碼里添加了下面這條語(yǔ)句:using system.net.mail; 在初始化一個(gè)mailmessage對(duì)象之后,應(yīng)該為from,to,subject,bodyencoding,bodyformat和body等屬性提供屬性值。還可以把可選的priority屬性設(shè)為mailpriortiy.high。還要把bodyencoding的值設(shè)為system.text.encoding中的某一個(gè)。通常使用的是encoding.ascii,但是如果愿意,還可以用encoding.unicode或者encoding.utf8。bodyformat屬性可以被設(shè)為mailformat.html或者
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 做護(hù)坡承攬合同范本
- 2025海南省建筑安全員A證考試題庫(kù)
- 刑事辯護(hù)委托合同范本
- 養(yǎng)兔場(chǎng)招工合同范本
- 2025廣東省安全員《B證》考試題庫(kù)
- 協(xié)會(huì)聘用合同范本
- 醫(yī)藥公司之間合同范本
- 代加工醬料合同范本
- ps租房合同范本
- 價(jià)格透明合同范本
- 人教版四年級(jí)數(shù)學(xué)下冊(cè)《圖形的運(yùn)動(dòng)(二)》試題(含答案)
- 2024-2025學(xué)年五年級(jí)(下)信息科技教學(xué)計(jì)劃
- 《老年人權(quán)益保障法》
- 2025年交管12123駕駛證學(xué)法減分題庫(kù)與參考答案
- 2025下半年上海事業(yè)單位招考易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025-2030年中國(guó)pcb行業(yè)競(jìng)爭(zhēng)格局及未來(lái)投資趨勢(shì)分析報(bào)告新版
- 天津市和平區(qū)2024-2025學(xué)年高一(上)期末質(zhì)量調(diào)查物理試卷(含解析)
- 《呼吸》系列油畫(huà)創(chuàng)作中詩(shī)意建構(gòu)的研究與實(shí)踐
- 2025年年食堂工作總結(jié)和年工作計(jì)劃例文
- 客流統(tǒng)計(jì)系統(tǒng)施工方案
- 船舶制造設(shè)施安全生產(chǎn)培訓(xùn)
評(píng)論
0/150
提交評(píng)論