




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、武 漢 輕 工 大 學軟件測試實驗報告實驗一 單元測試工具JUNIT姓 名: 李婭婭 學 號: 1505110015 班 級: 軟工1503 指導老師: 丁月華 1. 實驗目的了解自動化測試工具JUnit的架構(gòu)、功能,學習如何下載、安裝JUnit,掌握使用JUnit對Java程序進行單元測試的方法。2. 實驗步驟2.1 導入jar包右擊項目名,單擊Build Path中的Add Libraries.選擇User Libariry。新建一個存放Junit的包的庫將導入Jar包導入完成。2.2 編寫第一個Junit測試類 Calculator類編寫被測試類Calculator:(拷貝) priva
2、te static int result; / 靜態(tài)變量,用于存儲運行結(jié)果 public void add(int n) result = result + n; public void substract(int n) result = result - 1; /Bug: 正確的應(yīng)該是 result =result-n public void multiply(int n) / 此方法尚未寫好 public void divide(int n) result = result / n; public void square(int n) result = n * n; public void
3、 squareRoot(int n) for (; ;) ; /Bug : 死循環(huán) public void clear() / 將結(jié)果清零 result = 0; public int getResult() return result; CalculatorTest類編寫CalculatorTest類,用于測試Calculator類:(拷貝)public class CalculatorTest private static Calculator calculator = new Calculator(); Before public void setUp() throws Exceptio
4、n calculator.clear(); Test public void testAdd() calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult(); Test public void testSubstract() calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult(); Ignore("Multiply() Not yet implemented") Test
5、 public void testMultiply() Test public void testDivide() calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult(); 運行測試在類名上右擊,選擇Run As à Junit Test 得到Junit面板,并顯示了哪些測試是成功的,哪些是失敗的以及哪些是未執(zhí)行(直接跳過了):2.3 使用JUnit對Money類進行單元測試 Money類(拷貝)public class Money private int fAmount; /貨幣
6、余額private String fCurrency; /貨幣類型public Money(int amount, String currency)fAmount=amount;fCurrency=currency;public int amount()return fAmount;public String currency() return fCurrency; public Money add(Money m)/add方法把兩個Money對象相加,合成一個Money對象return new Money(amount()+m.amount(),currency();public boole
7、an equals(Object anObject)/equals方法判斷兩個Money對象是否相等if(anObject instanceof Money)Money aMoney=(Money)anObject;return aMoney.currency().equals(currency()&&amount()=aMoney.amount();return false; 現(xiàn)在要對Money類的add方法進行測試,步驟如下: MoneyTest類(1) 創(chuàng)建對象定義幾個Money類的對象Money result;Money m12CHF=new Money(12,&quo
8、t;CHF");Money m14CHF=new Money(14,"CHF");Money expected=new Money(26,"CHF"); /預期的運行結(jié)果(2) addTest()在MoneyTest類中編寫testAdd方法,對Money類中的add()方法進行測試:Testpublic void testAdd()result=m12CHF.add(m14CHF);assertTrue(expected.equals(result);/判斷運行結(jié)果是否與預期值相同(3) testEquals()Testpublic void
9、 testEquals() assertTrue(!m12CHF.equals(null); assertTrue(!m12CHF.equals(m14CHF); assertEquals(m12CHF,m12CHF); assertEquals(m12CHF,new Money(12,"CHF"); 2.3.3 運行測試測試通過2.4 Fixture和幾個標簽Fixture的含義就是“在某些階段必然被調(diào)用的代碼”。比如我們上面的測試,由于只聲明了一個Calculator對象,他的初始值是0,但是測試完加法操作后,他的值就不是0了;接下來測試減法操作,就必然要考慮上次加法操
10、作的結(jié)果。這絕對是一個很糟糕的設(shè)計!我們非常希望每一個測試都是獨立的,相互之間沒有任何耦合度。因此,我們就很有必要在執(zhí)行每一個測試之前,對Calculator對象進行一個“復原”操作,以消除其他測試造成的影響。因此,“在任何一個測試執(zhí)行之前必須執(zhí)行的代碼”就是一個Fixture,我們用Before來標注它,如前面例子中的setUp()方法所示:這里不在需要Test標注,因為這不是一個test,而是一個Fixture。同理,如果“在任何測試執(zhí)行之后需要進行的收尾工作”也是一個Fixture,使用After來標注。2.4.1 代碼測試public class TTest BeforeClass p
11、ublic static void beforeClass() System.out.println("beforeClass"); AfterClasspublic static void afterClass() System.out.println("afterClass"); Beforepublic void before() System.out.println("before"); Testpublic void testAdd() int z = new T().add(5, 3); assertThat(z, is(
12、8); assertThat(z, allOf(greaterThan(5), lessThan(10); Test(expected = java.lang.ArithmeticException.class, timeout = 100)public void tDivide() int z = new T().divide(8, 0); Afterpublic void after() System.out.println("after");2.4.2 運行結(jié)果在控制臺中得到運行結(jié)果:在Junit選型卡中得到:(1) 結(jié)果分析在Junit選項卡中由于代碼找不到T類,而
13、使方法運行錯誤。在控制臺中輸出兩次before和兩次after,是因為在類中test了兩個方法,每運行一個方法,before和after下的方法就是默認執(zhí)行。2.4.3 標簽學習(1) Test測試方法(2) Before使用了該元數(shù)據(jù)的方法在每個測試方法執(zhí)行之前都要執(zhí)行一次,一般做初始化方法。 (3) After使用了該元數(shù)據(jù)的方法在每個測試方法執(zhí)行之后要執(zhí)行一次,一般用于釋放資源。(4) ignore該元數(shù)據(jù)標記的測試方法在測試中會被忽略。你可以為該標簽傳遞一個String的參數(shù),來表明為什么會忽略這個測試方法。比如:lgnore(“該方法還沒有實現(xiàn)”),在執(zhí)行的時候,僅會報告該方法沒有實
14、現(xiàn),而不會運行測試方法。 (5) BeforeClass所有測試開始之前運行,一個測試類只能有一個,并且必須聲明為public static。該方法在內(nèi)存中只存在一份實例,比較適合加載配置文件。(6) AfterClass:所有測試結(jié)束之后運行 ,一個測試類只能有一個,并且必須聲明為public static。 通常用來對資源進行清理,比如關(guān)閉數(shù)據(jù)庫的連接。(備注:為什么需要BeforeClass 和 AfterClass ,我們來看看他們是否適合完成如下功能:有一個類是負責對大文件(超過 500 兆)進行讀寫,他的每一個方法都是對文件進行操作。換句話說,在調(diào)用每一個方法之
15、前,我們都要打開一個大文件并讀入文件內(nèi)容,這絕對是一個非常耗費時間的操作。如果我們使用 Before 和 After ,那么每次測試都要讀取一次文件,效率及其低下。這里我們所希望的是在所有測試一開始讀一次文件,所有測試結(jié)束之后釋放文件,而不是每次測試都讀文件。 JUnit 的作者顯然也考慮到了這個問題,它給出了 BeforeClass 和 AfterClass 兩個 Fixture 來幫我們實現(xiàn)這個功能。從名字上就可以看出,用這兩個 Fixture 標注的函數(shù),只在測試用例初始化時執(zhí)行 BeforeClass 方法,當所有測試執(zhí)行完畢之后,執(zhí)行 AfterClass 進行收尾工作。)JUnit
16、4的單元測試用例執(zhí)行順序為: BeforeClass -> Before -> Test -> After -> AfterClass。每一個測試方法的調(diào)用順序為: Before -> Test -> After??梢愿鶕?jù)以上給定的標記來構(gòu)造測試類中的測試方法,一般說來遵守以下約定:類放在test包中類名用XXXTest結(jié)尾方法用testMethod命名2.5 限時測試Test(timeout=value) ,例如Test(timeout=1000)2.5.1 被測源代碼2.5.2 測試代碼 Test(timeout = 1000) public void
17、testSquareRoot() calculator.squareRoot(4); assertEquals(2, calculator.getResult();2.5.3 運行測試在測試代碼中Timeout 參數(shù)表明了設(shè)定的時間,單位為毫秒,因此 1000 就代表 1 秒,測試的方法超過了設(shè)定的時間表示失敗。2.6 異常測試對除法運算中的“除0異常”進行測試2.7 綜合練習2.7.1 測試代碼public class CalculatorTest private static Calculator calculator = new Calculator();BeforeClass publ
18、ic static void beforeClass() System.out.println("beforeClass"); AfterClasspublic static void afterClass() System.out.println("afterClass"); Beforepublic void before() System.out.println("before"); Afterpublic void after() System.out.println("after"); Before pu
19、blic void setUp() throws Exception calculator.clear(); Test public void testAdd() calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult(); Test public void testSubstract() calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult(); Ignore("Multiply(
20、) Not yet implemented") Test public void testMultiply() Test public void testDivide() calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult(); Test(timeout = 1000) public void testSquareRoot() calculator.squareRoot(4); assertEquals(2, calculator.getResult(); Test(expecte
21、d = ArithmeticException. class ) public void divideByZero() calculator.divide( 0 ); 2.7.2 運行測試(1) 控制臺分析:在代碼中定義了BeforeClass和AfterClass標簽,因此,在輸出的首尾有這標簽下定義的輸出信息。代碼中編寫了6個測試方法,因此對Before,After標簽下的輸出信息打印了5遍(其中方法testMultiply使用了Ignore標簽)。(2) Junit選項卡測試結(jié)果為三個通過,一個忽略,一個失敗,一個錯誤。2.8 運行器RunWith當把測試代碼提交給JUnit框架后,框架
22、就會通過Runner來運行代碼。在JUnit中有很多個Runner,他們負責調(diào)用測試代碼,每一個Runner都有各自的特殊功能,你要根據(jù)需要選擇不同的Runner來運行你的測試代碼。JUnit中有一個默認Runner,如果你沒有指定,那么系統(tǒng)自動使用默認Runner來運行你的代碼。也就是說,下面兩段代碼含義是完全一樣的:public class CalculatorTest. /該方式就是使用了默認的Runner等價于RunWith(JUnit4ClassRunner.class)public class CalculatorTest. /聲明了Runner從上述例子可以看出,要想指定一個Ru
23、nner,需要使用RunWith標注,并且把你所指定的Runner作為參數(shù)傳遞給它。另外一個要注意的是,RunWith是用來修飾類的,而不是用來修飾函數(shù)的。只要對一個類指定了Runner,那么這個類中的所有函數(shù)都被這個Runner來調(diào)用。是對其他Runner的學習:2.8.1 參數(shù)化測試RunWith(Parameterized. class )把一組組的測試數(shù)據(jù)集中放在一個集合中,這個集合作為測試類的參數(shù),進行集中測試,避免為每一組測試數(shù)據(jù)寫一個測試方法。你可能遇到過這樣的函數(shù),它的參數(shù)有許多特殊值,或者說他的參數(shù)分為很多個區(qū)域。比如,一個對考試分數(shù)進行評價的函數(shù),返回值分別為“優(yōu)秀,良好,
24、一般,及格,不及格”,因此你在編寫測試的時候,至少要寫 5 個測試,把這 5 中情況都包含了,這確實是一件很麻煩的事情。我們還使用我們先前的例子,測試一下“計算一個數(shù)的平方”這個函數(shù),暫且分三類:正數(shù)、 0 、負數(shù)。(1) 測試代碼按照之前的方法,要測試三類就需要編寫三個測試方法:public class AdvancedTest private static Calculator calculator = new Calculator(); Before public void clearCalculator() calculator.clear(); Testpublic void squ
25、are1() calculator.square( 2 ); assertEquals( 4 , calculator.getResult(); Testpublic void square2() calculator.square( 0 ); assertEquals( 0 , calculator.getResult(); Testpublic void square3() calculator.square( - 3 );assertEquals( 9 , calculator.getResult(); 運行結(jié)果:為了簡化類似的測試, JUnit4 提出了“參數(shù)化測試”的概念,只寫一個測
26、試函數(shù),把這若干種情況作為參數(shù)傳遞進去,一次性的完成測試。代碼如下:RunWith(Parameterized. class )/更改默認的測試運行器為Parameterized.classpublic class SquareTest private static Calculator calculator = new Calculator(); private int param;/聲明變量存放輸入?yún)?shù)(用來計算實際結(jié)果) private int result;/聲明變量存放預期值 /聲明一個返回值為Collection的公共靜態(tài)方法,并用Parameters修飾Parameterspub
27、lic static Collection data() return Arrays.asList( new Object 2,4 , 0,0 , -3 ,9 ); /為測試類聲明一個帶有參數(shù)的公共構(gòu)造方法,并為聲明變量賦值 public SquareTest( int param, int result) this .param = param; this .result = result; Test public void square() calculator.square(param); assertEquals(result, calculator.getResult(); 分析:首
28、先,要為這種測試專門生成一個新的類,而不能與其他測試共用同一個類,此例中我們定義了一個SquareTest類。然后,你要為這個類指定一個Runner,而不能使用默認的Runner了,因為特殊的功能要用特殊的Runner。RunWith(Parameterized.class)這條語句就是為這個類指定了一個ParameterizedRunner。第二步,定義一個待測試的類,并且定義兩個變量,一個用于存放參數(shù),一個用于存放期待的結(jié)果。接下來,定義測試數(shù)據(jù)的集合,也就是上述的data()方法,該方法可以任意命名,但是必須使用Parameters標注進行修飾。之后是構(gòu)造函數(shù),其功能就是對先前定義的兩個參數(shù)進行初始化。(2) 測試結(jié)果2.8.2 測試套件RunWith(Suite.class)通過前面的案例學習到,在一個項目中,只寫一個測
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肝與腎中醫(yī)課件
- 肛腸健康講座課件
- 關(guān)于對稱的數(shù)學試卷
- 福建省教招小學數(shù)學試卷
- 肌內(nèi)效貼布技術(shù)課件
- 2025年05月浙江麗水市縉云縣衛(wèi)生健康系統(tǒng)招聘工作人員自愿放棄復審人員及人員筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 2025至2030船舶卸貨系統(tǒng)行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 2025至2030寵物衣服行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 廈門市政投資有限公司招聘考試真題2024
- 2024年商洛山陽縣信毅學校招聘筆試真題
- 莆田市2024-2025學年四年級數(shù)學第二學期期末學業(yè)質(zhì)量監(jiān)測試題含解析
- 氫能加氣站建設(shè)與設(shè)備租賃合作協(xié)議
- 遙感測繪項目的質(zhì)量管理與保障措施
- GB/T 12008.7-2025塑料聚氨酯生產(chǎn)用聚醚多元醇第7部分:堿性物質(zhì)含量的測定
- 2025年四川省考選調(diào)公務(wù)員錄用考試行測真題試題試卷答案解析
- 重癥肌無力小講課
- Unit 3 Family ties Understanding ideas (1)教學設(shè)計 -2024-2025學年外研版(2024)七年級英語上冊
- 建筑企業(yè)財務(wù)管理的風險控制與應(yīng)對策略
- 基礎(chǔ)會計試題及答案
- 《臨床檢驗尿液分析》課件
- 基于法律法規(guī)的網(wǎng)絡(luò)輿情風險評估模型-全面剖析
評論
0/150
提交評論