版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
單元4單元測(cè)試軟件開發(fā)工程師小張開發(fā)了自動(dòng)售貨機(jī)系統(tǒng),他想測(cè)試一下代碼方法是否有問題,應(yīng)該如何來進(jìn)行?單元測(cè)試可以幫助他解決此問題。引例描述單元測(cè)試主要針對(duì)代碼中的方法或函數(shù)進(jìn)行測(cè)試,是代碼級(jí)最小單位的測(cè)試。通常單元測(cè)試在開發(fā)階段由開發(fā)人員完成,是程序開發(fā)過程中非常重要的一個(gè)環(huán)節(jié)。單元測(cè)試一般使用自動(dòng)化測(cè)試工具完成,JUnit是一個(gè)開源的Java編程語言的單元測(cè)試標(biāo)準(zhǔn)框架。引例描述開發(fā)工程師小張要完成單元測(cè)試任務(wù),需按照下面3步的單元測(cè)試學(xué)習(xí)計(jì)劃來完成學(xué)習(xí)。1.學(xué)習(xí)單元測(cè)試的入門知識(shí),編寫驅(qū)動(dòng)模塊和樁模塊程序?qū)Ρ粶y(cè)程序模塊進(jìn)行動(dòng)態(tài)測(cè)試;2.學(xué)習(xí)JUnit基礎(chǔ),對(duì)Java程序進(jìn)行單元測(cè)試;3.學(xué)習(xí)JUnit的核心架構(gòu),對(duì)自動(dòng)售貨機(jī)程序進(jìn)行單元測(cè)試。引例描述目錄動(dòng)態(tài)測(cè)試Java程序單元任務(wù)一使用JUnit測(cè)試Java程序任務(wù)二使用Junit測(cè)試程序任務(wù)三任務(wù)一動(dòng)態(tài)測(cè)試Java程序單元●本任務(wù)對(duì)已經(jīng)編寫的Java程序方法進(jìn)行測(cè)試。開發(fā)人員通過編寫被測(cè)單元的上層模塊(驅(qū)動(dòng)模塊),被測(cè)單元所調(diào)用的模塊(樁模塊),建立單元測(cè)試的完整環(huán)境,使被測(cè)單元能夠運(yùn)行起來,對(duì)Java程序方法進(jìn)行動(dòng)態(tài)測(cè)試,從而來驗(yàn)證被測(cè)單元的正確性。●在實(shí)際操作的過程中,學(xué)生應(yīng)獨(dú)立自主完成程序單元的分離,面對(duì)復(fù)雜的軟件系統(tǒng),能整體系統(tǒng)的考慮程序的執(zhí)行路徑,認(rèn)真對(duì)待每個(gè)單元模塊的細(xì)節(jié),細(xì)致、嚴(yán)謹(jǐn)、規(guī)范、全面、快速的設(shè)計(jì)被測(cè)程序的上層模塊和下層調(diào)用模塊。任務(wù)陳述
單元測(cè)試也成為模塊測(cè)試,是指對(duì)軟件中的最小可測(cè)試單元或基本組成單元進(jìn)行檢查和驗(yàn)證。對(duì)應(yīng)單元測(cè)試中單元的含義,一般要根據(jù)實(shí)際情況去判定其具體含義,對(duì)于軟件的代碼,單元就是一個(gè)函數(shù)、方法或者類,對(duì)于軟件的界面,單元就是一個(gè)窗口或菜單。通常而言,一個(gè)單元測(cè)試是用于判斷某個(gè)特定條件(或者場(chǎng)景)下某個(gè)特定函數(shù)的行為。如果將測(cè)試比做清洗臺(tái)機(jī)器,那么單元測(cè)試就是清洗各個(gè)零件的內(nèi)部?;顒?dòng)一認(rèn)識(shí)單元測(cè)試一、單元測(cè)試的定義單元測(cè)試是小段代碼,用于檢驗(yàn)被測(cè)代碼的一個(gè)很小的,很明確的功能是否正確。單元測(cè)試的作用是獲取應(yīng)用程序中可測(cè)軟件的最小片段,將其同其他代碼隔離開來,然后確定它的行為確實(shí)和開發(fā)者所期望的一致。顯然,只有保證了最小單位的代碼準(zhǔn)確,才能有效構(gòu)建基于它們之上的軟件模塊及系統(tǒng)。單元測(cè)試是由程序員自己來完成。程序員有確保自己編寫的軟件單元準(zhǔn)確的責(zé)任,通過對(duì)自己編寫的功能代碼進(jìn)行單元測(cè)試,大大提高了代碼和軟件質(zhì)量。單元測(cè)試不但會(huì)使工作完成得更輕松,而且會(huì)令設(shè)計(jì)變得更好,甚至大大減少花在調(diào)試上的時(shí)間?;顒?dòng)一認(rèn)識(shí)單元測(cè)試二、單元測(cè)試的目的單元測(cè)試中選取的單元應(yīng)具有明確的功能定義、性能定義以及連接其他部分的接口定義等,且應(yīng)可以清晰地與其他單元區(qū)分開來。從某種意義上而言,單元的概念已經(jīng)護(hù)展為組件。單元可以認(rèn)為是人為規(guī)定的最小的被測(cè)功能模塊。1.對(duì)于C語言這類面向過程的開發(fā)語言,單元常指一個(gè)函數(shù)或子過程。在特殊情況下,若存在幾個(gè)函數(shù)之間具有強(qiáng)耦合性,導(dǎo)致函數(shù)關(guān)系非常密切,則應(yīng)將這幾個(gè)函數(shù)共同作為一個(gè)單元來測(cè)試。2.對(duì)于C++、Java語言或C#等面向?qū)ο蟮拈_發(fā)語言,單元一般指一個(gè)類。然而,某些基礎(chǔ)類可能非常龐大,涉及大量屬性和方法,甚至需要幾個(gè)開發(fā)人員來編碼完成,則若將該類作為一個(gè)單元來測(cè)試并不合適,此時(shí)的測(cè)試將上升到集成測(cè)試的層面。3.圖形化軟件中,單元常指一個(gè)窗口或一個(gè)菜單。活動(dòng)一認(rèn)識(shí)單元測(cè)試三、單元選取原則1.單元功能測(cè)試;2.單元接口測(cè)試;3.單元內(nèi)部數(shù)據(jù)流測(cè)試;4.單元邏輯路徑測(cè)試;5.單元可預(yù)見異常或出錯(cuò)條件測(cè)試?;顒?dòng)一認(rèn)識(shí)單元測(cè)試四、單元測(cè)試的任務(wù)由于單元測(cè)試所測(cè)試的不僅僅是代碼,還要測(cè)試接口、局部數(shù)據(jù)結(jié)構(gòu)、獨(dú)立路徑、邊界條件等,因此單元測(cè)試的主要依據(jù)是軟件詳細(xì)設(shè)計(jì)說明書?;顒?dòng)一認(rèn)識(shí)單元測(cè)試五、單元測(cè)試的依據(jù)單元測(cè)試過程中應(yīng)綜合應(yīng)用各種黑盒測(cè)試和白盒測(cè)試方法。使用黑盒測(cè)試方法對(duì)被測(cè)單元進(jìn)行功能測(cè)試,使用白盒測(cè)試方法對(duì)被測(cè)單元進(jìn)行代碼測(cè)試?;顒?dòng)二單元測(cè)試策略一、單元測(cè)試方法1.靜態(tài)測(cè)試技術(shù)靜態(tài)測(cè)試技術(shù)是指不運(yùn)行被測(cè)程序本身。僅通過分析或檢查源程序的語法、結(jié)構(gòu)、接口等來檢查程序的正確性,對(duì)需求規(guī)格說明書、軟件設(shè)計(jì)說明書、源程序作結(jié)構(gòu)分析,流程圖分析、符號(hào)執(zhí)行來找錯(cuò)。靜態(tài)測(cè)試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等。它可以由人工進(jìn)行,充分發(fā)揮人的邏輯思維優(yōu)勢(shì),也可以借助軟件工具自動(dòng)進(jìn)行?;顒?dòng)二單元測(cè)試策略一、單元測(cè)試方法1.靜態(tài)測(cè)試技術(shù)靜態(tài)測(cè)試技術(shù)是指不運(yùn)行被測(cè)程序本身。僅通過分析或檢查源程序的語法、結(jié)構(gòu)、接口等來檢查程序的正確性,對(duì)需求規(guī)格說明書、軟件設(shè)計(jì)說明書、源程序作結(jié)構(gòu)分析,流程圖分析、符號(hào)執(zhí)行來找錯(cuò)。靜態(tài)測(cè)試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等。它可以由人工進(jìn)行,充分發(fā)揮人的邏輯思維優(yōu)勢(shì),也可以借助軟件工具自動(dòng)進(jìn)行?;顒?dòng)二單元測(cè)試策略一、單元測(cè)試方法2.動(dòng)態(tài)測(cè)試技術(shù)動(dòng)態(tài)測(cè)試技術(shù)是指通過運(yùn)行被測(cè)程序,檢查運(yùn)行結(jié)果與預(yù)期結(jié)果的差異,并分析運(yùn)行效率和健壯性等性能。這種技術(shù)山3部分組成:構(gòu)造測(cè)試實(shí)例、執(zhí)行程序、分析程序的輸出結(jié)果。且前,動(dòng)態(tài)測(cè)試也是測(cè)試工作的主要方式?;顒?dòng)二單元測(cè)試策略一、單元測(cè)試方法靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試應(yīng)配合使用。靜態(tài)測(cè)試的代碼分析結(jié)果適用于所有可能的運(yùn)行情況,而動(dòng)態(tài)測(cè)試由于總是針對(duì)特殊取值的測(cè)試,因此僅能測(cè)試到程序的特定屬性,即保證被測(cè)組件在其測(cè)試平臺(tái)上對(duì)于特定輸入是有效的。活動(dòng)二單元測(cè)試策略一、單元測(cè)試方法單元本身并不是一個(gè)獨(dú)立的程序,往往需要基于被測(cè)單元的接口開發(fā)相應(yīng)的驅(qū)動(dòng)模塊和樁模塊。因此,單元測(cè)試環(huán)境包括驅(qū)動(dòng)模塊和樁模塊。活動(dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境1.驅(qū)動(dòng)模塊和樁模塊定義(1)驅(qū)動(dòng)模塊是模擬被測(cè)單元的上級(jí)模塊,用于接收測(cè)試數(shù)據(jù)、啟動(dòng)被測(cè)模塊和輸出結(jié)果。(2)樁模塊是模擬被測(cè)單元所調(diào)用的模塊。有時(shí),需要使用子模塊的接口,才能做少量數(shù)據(jù)操作,并驗(yàn)證和打融入最的信息,然后返回。樁模塊不包含原模塊的所有細(xì)節(jié)?;顒?dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境2.驅(qū)動(dòng)模塊和樁模塊的使用條件設(shè)計(jì)驅(qū)動(dòng)模塊和樁模塊時(shí),一方面應(yīng)考思到測(cè)試結(jié)論的有效性決定于單元測(cè)試環(huán)境下模擬目標(biāo)環(huán)境(程序)執(zhí)行的精確度,即設(shè)計(jì)驅(qū)動(dòng)模塊和樁模塊時(shí)應(yīng)能慮到測(cè)試用例執(zhí)行應(yīng)滿足的所有環(huán)境因素。另方面,也應(yīng)充分考慮到測(cè)試過程的選代性,使得驅(qū)動(dòng)模塊和樁模塊在回歸測(cè)試中能夠不經(jīng)修改直接使用,提高重用性,進(jìn)而提高回歸測(cè)試效率?;顒?dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境3.構(gòu)建單元測(cè)試環(huán)境建立單元測(cè)試的環(huán)境,需完成以下工作:構(gòu)造最小運(yùn)行調(diào)度系統(tǒng),即構(gòu)造被測(cè)單元的驅(qū)動(dòng)模塊;模擬被測(cè)單元的接口,即構(gòu)造被測(cè)單元調(diào)用的樁模塊;模擬生成測(cè)試數(shù)據(jù)及狀態(tài),即測(cè)試驅(qū)動(dòng)程序,為被測(cè)單元運(yùn)行準(zhǔn)備動(dòng)態(tài)環(huán)境?;顒?dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境4.驅(qū)動(dòng)模塊的設(shè)計(jì)在多數(shù)的實(shí)際應(yīng)用中,驅(qū)動(dòng)模塊的設(shè)計(jì)可根據(jù)其定義得到,步驟如下。(1)接收測(cè)試的輸入數(shù)據(jù)。實(shí)現(xiàn)方式是將輸入數(shù)據(jù)寫在測(cè)試程序中,更好的策略是通過外部調(diào)用的方式從數(shù)據(jù)文件中依次讀入數(shù)據(jù)。(2)將數(shù)據(jù)傳遞給被測(cè)單元,從而啟動(dòng)被測(cè)單元實(shí)現(xiàn)方式是調(diào)用被測(cè)單元,同時(shí)利用參數(shù)傳遞將輸入數(shù)據(jù)傳給被測(cè)單元。(3)打印和輸出相關(guān)結(jié)果,判斷測(cè)試是通過還是失敗。利用結(jié)果的比較來判斷,在允許的誤差條件下,一致的結(jié)果表明測(cè)試通過,否則視為測(cè)試失敗。執(zhí)行結(jié)果可以直接輸出到屏幕?;顒?dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境5.樁模塊的設(shè)計(jì)(1)完成原單元的基本功能,即針對(duì)特定的輸入可以輸出正確的結(jié)果,注意:這里所謂的完成功能其實(shí)并非真正在模塊內(nèi)部去執(zhí)行某些復(fù)雜的邏輯判斷或計(jì)算過程,而是簡(jiǎn)單的批量打印而已,只是將固定的某些執(zhí)行結(jié)果簡(jiǎn)單輸出。(2)能夠被正確調(diào)用,即符合正確的輸入條件,包括個(gè)數(shù)、參數(shù)類型順序等與被模擬單元完全一致。(3)有返回值。若有返回值,則應(yīng)針對(duì)特定輸入返回與被模擬單元完全一致的結(jié)果。(4)不包含原單元的所有細(xì)節(jié)。原單元的輸入情況可能是無限多的,所謂模擬意味將僅挑選式中典型的輸入(如邊界),給出己知的輸出結(jié)果?;顒?dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境6.測(cè)試驅(qū)動(dòng)程序的設(shè)計(jì)測(cè)試驅(qū)動(dòng)程序是通過測(cè)試用例來驅(qū)動(dòng)被測(cè)單元,以便于觀察測(cè)試用例執(zhí)行結(jié)果,查找缺陷的代碼段。簡(jiǎn)單地說,測(cè)試驅(qū)動(dòng)是能夠執(zhí)行測(cè)試用例或測(cè)試套包的軟件程序或測(cè)試工具。測(cè)試驅(qū)動(dòng)程序的設(shè)計(jì)可從以下方面來考慮:(1)利用已有的測(cè)試用例,接收測(cè)試數(shù)據(jù)。(2)將測(cè)試數(shù)據(jù)傳遞給被測(cè)單元。(3)輸出測(cè)試用例的執(zhí)行結(jié)果?;顒?dòng)二單元測(cè)試策略二、單元測(cè)試環(huán)境1.單元代碼測(cè)試的方式實(shí)現(xiàn)對(duì)單元代碼測(cè)試的方式主要包括:(1)在開發(fā)源代碼中直接加入斷點(diǎn)(和調(diào)試比較相似);(2)通過調(diào)用被測(cè)函數(shù)輸入一些測(cè)試數(shù)據(jù),觀察實(shí)際執(zhí)行情況與預(yù)期情況之間的差異;(3)針對(duì)被測(cè)對(duì)象編寫專門的測(cè)試代碼,并專門對(duì)這些代碼進(jìn)行組織和管理?;顒?dòng)二單元測(cè)試策略三、單元測(cè)試的設(shè)計(jì)2.單元測(cè)試的原則編寫單元測(cè)試代碼是,應(yīng)遵循以下基本原則。(1)不要將測(cè)試用例的執(zhí)行結(jié)果輸出到屏幕;(2)將測(cè)試代碼與開發(fā)代碼分開;(3)所有測(cè)試方法以test開頭,測(cè)試代碼分組放置;(4)在一個(gè)獨(dú)立的測(cè)試中避免多重聲明;(5)測(cè)試正確的事情。活動(dòng)二單元測(cè)試策略三、單元測(cè)試的設(shè)計(jì)1.要測(cè)試以下程序段的正確性,需要構(gòu)造被測(cè)單元的驅(qū)動(dòng)模塊。 intmax(intx,inty){ intz; if(x>y) z=x; else z=y; returnz; }任務(wù)實(shí)施根據(jù)被測(cè)單元的情況,需要編寫驅(qū)動(dòng)模塊,通過給定實(shí)參5和8來調(diào)用被測(cè)單元。需要?jiǎng)?chuàng)建一個(gè)類(Test.java),并將被測(cè)單元封裝在獨(dú)立的類中(Max.java),在測(cè)試類中創(chuàng)建被測(cè)類的對(duì)象,以實(shí)現(xiàn)測(cè)試程序和被測(cè)程序的分離,通過調(diào)用被測(cè)類對(duì)象的方法進(jìn)行測(cè)試。任務(wù)實(shí)施被測(cè)單元封裝為一個(gè)類(Max.java)publicclassMax{ intmax(intx,inty){ intz; if(x>y) z=x; else z=y; returnz; }}任務(wù)實(shí)施驅(qū)動(dòng)模塊的類(Test.java)publicclassTest{ publicstaticvoidmain(String[]args){ intresult; Maxm=newMax(); result=m.max(5,8); System.out.println("5和8的最大值是:"+result); }}任務(wù)實(shí)施運(yùn)行結(jié)果如圖所示:任務(wù)實(shí)施2.對(duì)下面的程序進(jìn)行單元測(cè)試。publicstaticvoidmain(String[]args){ intyear,leap1; Scannerinput=newScanner(System.in); System.out.println("請(qǐng)輸入一個(gè)年份:"); year=input.nextInt(); leap1=leapyear(year); if(leap1==1) System.out.println(year+"isaleapyear."); else System.out.println(year+"isnotaleapyear."); }任務(wù)實(shí)施被測(cè)單元是一個(gè)主函數(shù),需要構(gòu)造被測(cè)單元的樁模塊,通過調(diào)用一個(gè)leapyear(intyear),使被測(cè)單元能順利調(diào)用,從而測(cè)試該單元的正確性。任務(wù)實(shí)施import
java.util.Scanner;public
classLeapYear{
static
intleapyear(intyear){
if(year%4==0&&year%100!=0||year%400==0)
return1;
else
return0; }
public
static
voidmain(String[]args){
intyear,leap1; Scannerinput=newScanner(System.in); System.out.println("請(qǐng)輸入一個(gè)年份:"); year=input.nextInt(); LeapYearm=newLeapYear(); leap1=m.leapyear(year);
if(leap1==1) System.out.println(year+"isaleapyear.");
else System.out.println(year+"isnotaleapyear."); }
}任務(wù)實(shí)施運(yùn)行結(jié)果如下圖任務(wù)實(shí)施任務(wù)二使用JUnit測(cè)試Java程序●本任務(wù)通過對(duì)一個(gè)簡(jiǎn)單計(jì)算器的加、減、乘、除功能的測(cè)試代碼的編寫,了解單元測(cè)試的基本概念和JUnit單元測(cè)試工具。掌握J(rèn)Unit的安裝,熟悉使用Eclipse和JUnit進(jìn)行簡(jiǎn)單測(cè)試用例編寫和運(yùn)行的過程,為后面的JUnit框架的理解和使用提供基礎(chǔ)。●JUnit是Java最主要的單元測(cè)試框架,對(duì)單元測(cè)試的基本概念的學(xué)習(xí)和理解,能幫助學(xué)生進(jìn)步理解JUnit的基本概念。在理解JUnit的基礎(chǔ)上,要求學(xué)生進(jìn)步掌握使用Eclipse進(jìn)行單元測(cè)試代碼的編寫流程。任務(wù)陳述活動(dòng)一認(rèn)識(shí)JUnit
在Java編程環(huán)境中,JUnit是一個(gè)已經(jīng)被多數(shù)Java程序員采用和實(shí)證的優(yōu)秀測(cè)試框架。開發(fā)人員只需要按照J(rèn)Unit的約定編寫測(cè)試代碼,就可以對(duì)被測(cè)試代碼進(jìn)行測(cè)試。JUnit是1997年由ErichGamma(GoF之一)和KentBeck(XP和refactor先驅(qū)者之一)創(chuàng)建的。1999年以來,JUnit已經(jīng)發(fā)展成業(yè)界標(biāo)準(zhǔn)的Java測(cè)試和設(shè)計(jì)工具。一、認(rèn)識(shí)JUnit活動(dòng)一認(rèn)識(shí)JUnit1.使用斷言方法判斷期望值和實(shí)際值差異,返回Boolean值;2.測(cè)試驅(qū)動(dòng)設(shè)備使用共同的初始化變量或者實(shí)例。3.測(cè)試包結(jié)構(gòu)便于組織和集成運(yùn)行。4.支持圖形交互模式和文本交互模式。二、JUnit特性活動(dòng)一認(rèn)識(shí)JUnit1.JUnit是開源工具;2.JUnit可以將測(cè)試代碼和產(chǎn)品代碼分開;3.JUnit的測(cè)試代碼非常容易編寫且功能強(qiáng)大;4.JUnit自動(dòng)檢測(cè)測(cè)試結(jié)果并且提供及時(shí)的反饋;5.易于集成;6.便于組織。四、JUnit優(yōu)點(diǎn)三、JUnit優(yōu)點(diǎn)活動(dòng)一認(rèn)識(shí)JUnit1.只需要到JUnit的官方網(wǎng)站下載JUnit最新版本的安裝程序。2.將下載得到的junit.jar加入CLASSPATH環(huán)境變量即可使用JUnit,如果使用Eclipse工具,則可以在項(xiàng)目屬性的BuildPath中單擊“Add
Library”選項(xiàng),選擇JUnit的jar包即可。四、JUnit下載和安裝活動(dòng)二
JUnit的基本應(yīng)用public
classCalculator{
public
intadd(inta,intb){
returna+b; }
public
intsubstrate(inta,intb){
returna-b; }
public
intmultiply(inta,intb){
returna*b; }
public
intdivide(inta,intb){
returna/b; }}一、編寫計(jì)算器程序的代碼活動(dòng)二JUnit的基本應(yīng)用packagejunit.demo;import
staticorg.junit.Assert.*;importorg.junit.Test;public
classCalculatorTest{ @Test
public
voidtestAdd(){ Calculatorcalculator=newCalculator();
intresult=calculator.add(3,2);
assertEquals(5,result); }}二、編寫計(jì)算器程序的測(cè)試代碼活動(dòng)二
JUnit的基本應(yīng)用第1行,定義測(cè)試類所在的包。第2、3行,引入JUnit測(cè)試類必需的jar包。第4行,定義一個(gè)測(cè)試類CalculatorTest.第5行,用JUnit的注解@Test,將下面的方法標(biāo)注為一個(gè)測(cè)試方法。第6行,定義一個(gè)測(cè)試方法,方法名可自定義,一般以test開頭。第7行,遵循對(duì)象測(cè)試的風(fēng)格,創(chuàng)建對(duì)象。第8行,
測(cè)試Calculator的add的方法。第9行,用斷言比較調(diào)用add方法之后的返回值和期望值是否致。二、編寫計(jì)算器程序的測(cè)試代碼活動(dòng)二
JUnit的基本應(yīng)用JUnit
4測(cè)試用例的基本結(jié)構(gòu):1.JUnit一個(gè)測(cè)試用例對(duì)應(yīng)一個(gè)測(cè)試方法,即一個(gè)函數(shù)。要?jiǎng)?chuàng)建測(cè)試,必須編寫對(duì)應(yīng)的測(cè)試方法。2.JUnit4的測(cè)試是基于注解的,每個(gè)測(cè)試方法前面都要加上@Test注解。3.每個(gè)測(cè)試方法要做一些斷言,
斷言主要用于比較實(shí)際結(jié)果與期望結(jié)果是否相符。上面的例子中,如果返回值不等于5,斷言失敗,整個(gè)測(cè)試用例運(yùn)行的結(jié)果就是失敗,否則表示這個(gè)測(cè)試用例通過。二、編寫計(jì)算器程序的測(cè)試代碼活動(dòng)二
JUnit的基本應(yīng)用JUnit4提供3種不同方式的運(yùn)行器執(zhí)行測(cè)試用例:文本方式;AWT方式;Swing方式。三、運(yùn)行測(cè)試用例活動(dòng)二
JUnit的基本應(yīng)用JUnit
4測(cè)試用例的基本結(jié)構(gòu):1.JUnit一個(gè)測(cè)試用例對(duì)應(yīng)一個(gè)測(cè)試方法,即一個(gè)函數(shù)。要?jiǎng)?chuàng)建測(cè)試,必須編寫對(duì)應(yīng)的測(cè)試方法。2.JUnit4的測(cè)試是基于注解的,每個(gè)測(cè)試方法前面都要加上@Test注解。3.每個(gè)測(cè)試方法要做一些斷言,
斷言主要用于比較實(shí)際結(jié)果與期望結(jié)果是否相符。上面的例子中,如果返回值不等于5,斷言失敗,整個(gè)測(cè)試用例運(yùn)行的結(jié)果就是失敗,否則表示這個(gè)測(cè)試用例通過。三、編寫計(jì)算器程序的測(cè)試代碼1.JUnit的下載與安裝JUnit工具的jar包可以從下載。JUnit是以jar文件的形式發(fā)布的,其中包括了所有必需的類。安裝JUnit,就是把jar文件放到編譯器能夠找到的地方,如果不使用IDE,而是從命令行直接調(diào)用JDK,則必須上CLASSPATH包含JUnit的jar包所在的路徑。簡(jiǎn)單來說,就是解壓下載的壓縮文件到指定文件夾,并將JUnit.jar包加入到CLASSPATH中即可完成安裝。任務(wù)實(shí)施2.對(duì)一個(gè)Java類進(jìn)行單元測(cè)試。該類為Caculator,實(shí)現(xiàn)簡(jiǎn)單的加、減、乘、除等功能,實(shí)現(xiàn)用Eclipse編寫JUnit單元測(cè)試。任務(wù)實(shí)施(1)在Eclipse中引入JUnit任務(wù)實(shí)施(1)在Eclipse中引入JUnit任務(wù)實(shí)施(2)在Java項(xiàng)目中編寫被測(cè)單元程序任務(wù)實(shí)施(3)JUnit測(cè)試用例編寫任務(wù)實(shí)施(3)JUnit測(cè)試用例編寫任務(wù)實(shí)施(4)JUnit測(cè)試用例編寫任務(wù)實(shí)施任務(wù)三使用Junit測(cè)試自動(dòng)售貨機(jī)程序●本任務(wù)將利用經(jīng)典的自動(dòng)售貨機(jī)案例,完成Junit4的測(cè)試用例的編寫,掌握J(rèn)Unit的測(cè)試框架和核心類:TestCase、TestSuite、TestRunner和Assert,以及它們?nèi)绾喂餐ぷ鳎瓿蓽y(cè)試用例的編寫和運(yùn)行。JUnit4是一個(gè)全新的框架,它充分利用了Java5的注解,使測(cè)試更為簡(jiǎn)單快捷。通過對(duì)本任務(wù)的學(xué)習(xí),充分理解JUnit4的注解的應(yīng)用。任務(wù)陳述活動(dòng)一Junit核心類1.TestCase
(測(cè)試用例)——擴(kuò)展
了JUnit的TestCase
類的類。它以testXxxx方法的形式包含一個(gè)或多個(gè)測(cè)試。一個(gè)測(cè)試用例把具有公共行為的測(cè)試歸入一組。2.TestSuite
(測(cè)試集合)——一組測(cè)試。
一個(gè)測(cè)試集
合是把多個(gè)相關(guān)測(cè)試歸入一組的便捷方式。3.TestRuner(測(cè)試運(yùn)行器)執(zhí)行testsuite的程序。JUnit提供了幾個(gè)測(cè)試運(yùn)行器,可以用它們來執(zhí)行你的測(cè)試。一、JUnit核心類與接口活動(dòng)一Junit核心類一、JUnit核心類與接口類/借口功能Assert當(dāng)條件成立時(shí),asset方法保持沉默,但若條件不成立就拋出異常TestResult包含了測(cè)試中發(fā)生的所有錯(cuò)誤或者失敗Test可以運(yùn)行Test并把結(jié)果傳遞給TestResultTestListener測(cè)試中若產(chǎn)生事件(開始、結(jié)束、錯(cuò)誤、失敗)會(huì)通知TestListenerTestCaseTestCase定義了可以用于運(yùn)行多項(xiàng)測(cè)試的環(huán)境(或者說固定設(shè)備)TestSuiteTestSuite運(yùn)行組TestCase
(它們可能包含其他TestSuite),它是Test的組合BaseTestRunnerestRunner是用來啟動(dòng)測(cè)試的用戶界面,Base
TestRunner是所有TestRunner的超類活動(dòng)一Junit核心類1.Teat接口Test接口是TestCase、TestSuite的共同接口,用于運(yùn)行測(cè)試和收集測(cè)試結(jié)果。它的run(TestResultresult)萬法用來運(yùn)行Test,并且將結(jié)果保存到TestResult.2.TestResult(測(cè)試結(jié)果)TestResult類收集TestCase的執(zhí)行結(jié)果,并報(bào)告測(cè)試結(jié)果。若測(cè)試成功,那么TestResult代碼是正確的,進(jìn)度條就是綠色顯示,否則TestResult就會(huì)報(bào)告失敗,并輸出失敗測(cè)試的數(shù)目和它的堆棧軌跡。3.TestListener接口JUnit框架提供了TestListener接口,以幫助對(duì)象訪問TestResult并創(chuàng)建有用的報(bào)告。TestRunner實(shí)現(xiàn)了TestListener,很多特定的JUnit擴(kuò)展也實(shí)現(xiàn)了TestListener.可以有任意數(shù)量的TestListener向JUnit框架注冊(cè),這些TestListener可以根據(jù)TestResult提供的信息做它們需要做的任何事情。二、Junit其他接口活動(dòng)一Junit核心類1.用fixture管理資源fixture是運(yùn)行一個(gè)或多個(gè)測(cè)試所需的公用資源或數(shù)據(jù)集合。TestCase通過setUp和tearDown方法來自動(dòng)創(chuàng)建和銷毀fixture。TestCase會(huì)在運(yùn)行每個(gè)測(cè)試之前調(diào)用setUp,并且在每個(gè)測(cè)試完成之后調(diào)用tearDown。把不止一個(gè)測(cè)試方法放進(jìn)同一個(gè)TestCase的一個(gè)重要理由就是可以共享fixture代碼。三、TestCase活動(dòng)一Junit核心類2.TestCase成員三、TestCase方法描述countTestCase計(jì)算run()所執(zhí)行的TestCase的數(shù)目createResult創(chuàng)建默認(rèn)的TestResult對(duì)象getName獲得TestCase的名字run運(yùn)行TestCase并收集TestRrsult中的結(jié)果runBare運(yùn)行測(cè)試序列(比如自動(dòng)發(fā)現(xiàn)test方法)runTest重載以運(yùn)行測(cè)試并斷言其狀態(tài)setName設(shè)置TestCase的名字setup初始化資源配置tearDown清除資產(chǎn)配置toString返回TextCase的字符串表示活動(dòng)一Junit核心類Assert是JUnit框架的一個(gè)靜態(tài)類,包含一組靜態(tài)的測(cè)試方法,用于期望值和實(shí)際值比較是否正確。如果測(cè)試失敗,Assert類就會(huì)拋出一個(gè)AssertionFailedError異常。四、Junit斷言方法描述assertTrue斷言條件為真。若不滿足,方法拋出帶有相應(yīng)的信息(如果有)的AssertionFailedError異常assertFalse斷言條件為假。若不滿足,方法拋出帶有相應(yīng)的信息(若果有)的AssertionFailedError異常assertEquals斷言兩個(gè)對(duì)象相等。若不滿足,方法拋出帶有相應(yīng)的信息(如果有)的AssertionFailedError異常assertNotNull斷言對(duì)象不為null。若不滿足,方法拋出帶有相應(yīng)的信息(如果有)的AssertionFailedError異常assertNull斷言對(duì)象為null。若不滿足,方法拋出帶有相應(yīng)的信息(如果有)的AssertionFailedError異常assertSame斷言兩個(gè)引用指向同一個(gè)對(duì)象。若不滿足,方法拋出帶有相應(yīng)的信息(如果有)的AssertionFailedError異常assertNotSame斷言兩個(gè)指向不同對(duì)象。若不滿足,方法拋出帶有相應(yīng)的信息(如果有)的AssertionFailedError異常fail強(qiáng)制測(cè)試失敗,并給出指定信息活動(dòng)二
JUnit測(cè)試套件默認(rèn)的TestSuite會(huì)掃描測(cè)試類,找出所有以test開頭的方法。默認(rèn)的TestSuite在內(nèi)部為每個(gè)testXxxx方法都創(chuàng)建一個(gè)TestCase的實(shí)例,要調(diào)用的方法的名稱會(huì)傳遞給TestCase的構(gòu)造函數(shù),這樣每個(gè)實(shí)例就有個(gè)獨(dú)一無二的標(biāo)識(shí)。一、運(yùn)行自動(dòng)的Suite活動(dòng)二
JUnit測(cè)試套件PublicstaticTestsuite()
{ReturnnewTestSuite(CalculatorTest.class);}這就相當(dāng)于:
PublicstaticTestsuite()
{TestSuitesuite=newTestSuite();Suite.addTest(newCalculatorTest("testAdd"));return
suite;}一、運(yùn)行自動(dòng)的Suite活動(dòng)二
JUnit測(cè)試套件publicclassAllTestsextendsTestCase{publicstaticTestsuite()(TestSuitesuite=newTestSuite(AllTests.class.getName());Suite.addTestSuite(CalculatorTest.class);returnsuite;}}二、編寫自己的TestSuite活動(dòng)二
JUnit測(cè)試套件1.測(cè)試用例必須是公有類(public);2.測(cè)試用例必須繼承于TestCase類;3.測(cè)試用例的測(cè)試方法必須是公有的(public);4.測(cè)試用例的測(cè)試方法必須被聲明為void;5.測(cè)試用例的測(cè)試方法的前置名詞必須是test;6.測(cè)試用例的測(cè)試方法無任何傳遞參數(shù)。二、編寫自己的TestSuite活動(dòng)三探究JUnit4Java注解(Annotation)的使用方法是@注解名,能通過簡(jiǎn)單的詞語來實(shí)現(xiàn)一些功能。一、認(rèn)識(shí)JUnit4注解活動(dòng)三探究JUnit4在JUnit中常用的注解有@Test、@Ignore、@BeforeClass、@AfterClass、@Before、@After、@Runwith、@Parameters。二、常用注釋活動(dòng)三探究JUnit41.@TestTesl表明這是一個(gè)測(cè)試方法可以隨意取,在Junit中將會(huì)自動(dòng)被執(zhí)行。對(duì)于方法的聲明有如下要求:名字可以隨意取,但返回值必須為void類型,而且不能有任何參數(shù)。如果違反這些規(guī)定,會(huì)在運(yùn)行時(shí)拋出一個(gè)異常。例如:@Test publicvoidtestAdd(){ Calculatorcalculator=newCalculator(); intresult=calculator.add(3,4); assertEquals(9,result); }二、常用注釋活動(dòng)三探究JUnit42.@Before初始化方法,在任何一個(gè)測(cè)試執(zhí)行之前必須執(zhí)行的代碼,跟3.X中的setUp()方法具有相同功能。格式:@Beforepublicvoidmethod(),例如:@Before publicvoidsetUp()throwsException{ Calculatorcalculator=newCalculator(); }二、常用注釋活動(dòng)三探究JUnit43.@After釋放資源,在任何測(cè)試執(zhí)行之后需要進(jìn)行的收尾工作。跟3.X中的tearDown()方法具有相同的功能。格式:@Afterpublicvoidmethod(),例如:@After publicvoidtearDown()throwsException{ calculator=null; }二、常用注釋活動(dòng)三探究JUnit44.@BeforeClass針對(duì)所有測(cè)試,在所有測(cè)試方法執(zhí)行前執(zhí)行一次,且必須為publicstaticvoid,此注解為4.X新增功能。格式:@BeoreClasspublicvoidmethod(),例如:@BeforeClass publicstaticvoidsetUpBeforeClass()throwsException{ System.out.println("@BeforeClassiscalled!"); }二、常用注釋活動(dòng)三探究JUnit45.@AfterClass針對(duì)所有測(cè)試,在所有測(cè)試方法執(zhí)行結(jié)束執(zhí)行一次,且必須為publicstaticvoid,此注解為4.X新增功能。格式:@AfterClasspublicvoidmethod(),例如:@AfterClass publicstaticvoidtearDownAfterClass()throwsException{ System.out.println("@AfterClassiscalled!"); }二、常用注釋活動(dòng)三探究JUnit46.@lgnore忽略的測(cè)試方法,標(biāo)注的含義就是“某些方法尚未完成,暫不參與此次測(cè)試”;這樣測(cè)試結(jié)果就會(huì)提示用戶有幾個(gè)測(cè)試被忽略,而不是失敗。一旦完成了相應(yīng)函數(shù),只需要把@Ignore標(biāo)注刪去,就可以進(jìn)行正常的測(cè)試。例如:@Ignore @Test publicvoidtestAdd(){ intresult=calculator.add(1,1); assertEquals(2,result); }二、常用注釋活動(dòng)三探究JUnit4二、常用注釋注解含義@Before初始化方法,在任何一個(gè)測(cè)試執(zhí)行之前必須執(zhí)行@After釋放資源,在任何測(cè)試執(zhí)行之后需要進(jìn)行的收尾工作@Test表明這是一個(gè)測(cè)試方法@BeforeClass針對(duì)所有測(cè)試,在所有測(cè)試方法執(zhí)行前執(zhí)行一次@AfterClass針對(duì)所有測(cè)試,在所有測(cè)試方法執(zhí)行后執(zhí)行一次@RunWith指定使用測(cè)試的運(yùn)行器@SuiteClass制定運(yùn)行哪些測(cè)試類@Ignore忽略的測(cè)試方法@Parameter為單元測(cè)試提供參數(shù)值活動(dòng)三探究JUnit4根據(jù)以上說明,Junit4的單元測(cè)試用例執(zhí)行順序?yàn)椋篅BeforeClass->@Before->@Test->@After->@AfterClass;每一個(gè)測(cè)試方法的調(diào)用順序?yàn)椋篅Before->@Test->@After二、常用注釋活動(dòng)三探究JUnit41.認(rèn)識(shí)測(cè)試套件Junit4中最顯著的特性是沒有套件(套件機(jī)制用于將測(cè)試從邏輯上的分組并將這些測(cè)試作為一個(gè)單元測(cè)試來運(yùn)行)。為了替代老版本的套件測(cè)試,套件被兩個(gè)新注解代替:@RunWith、@SuiteClasses。通過@RunWith制定一個(gè)特殊的運(yùn)行器::Suieclas套件運(yùn)行器,并通過@uitliases注解,將需要進(jìn)行測(cè)試的類列表作為參數(shù)傳入。三、測(cè)試套件活動(dòng)三探究JUnit42.測(cè)試套件編寫流程(1)創(chuàng)建個(gè)空類作為測(cè)試套件的入口;(2)將@RunWith、@suiteClasses注解修飾這個(gè)空類:(3)把Suite.classs作為參數(shù)傳入@RunWih注解,以提示JUnit將此類指定為運(yùn)行器;(4)將需要測(cè)試的類組成數(shù)組作為@SuiteClases的參數(shù)。如下例所示:@RunWith(value=Suite.class)@SuiteClasses(value={CalculatorTest.class,ExceptionTest.class})publicclassTestAll{}三、測(cè)試套件1.“計(jì)算每月多少天”程序的JUnit測(cè)試用例編寫(1)“計(jì)算每月多少天”程序功能介紹根據(jù)所提供的年份和月份(為函數(shù)的兩個(gè)參數(shù)),返回該月的天數(shù)(為函數(shù)返回值);(2)編碼實(shí)現(xiàn);(3)“計(jì)算每月多少天”的測(cè)試用例分析;(4)測(cè)試代碼;(5)測(cè)試結(jié)果;任務(wù)實(shí)施單元5自動(dòng)化測(cè)試目錄自動(dòng)化測(cè)試基礎(chǔ)任務(wù)一SeleniumWebDriver的基本應(yīng)用任務(wù)二SeleniumWebDriver的高級(jí)應(yīng)用任務(wù)三任務(wù)一自動(dòng)化測(cè)試基礎(chǔ)活動(dòng)一認(rèn)識(shí)自動(dòng)化測(cè)試
自動(dòng)化測(cè)試是把以人為驅(qū)動(dòng)的測(cè)試行為轉(zhuǎn)化為機(jī)器執(zhí)行的一種過程,即模擬手工測(cè)試步驟通過執(zhí)行程序語言編制的測(cè)試腳本自動(dòng)地測(cè)試軟件。
自動(dòng)化測(cè)試可以把我們需要花費(fèi)大量時(shí)間去重復(fù)執(zhí)行的測(cè)試操作用腳本實(shí)現(xiàn),把測(cè)試人員從枯燥單調(diào)的重復(fù)性勞動(dòng)中解放出來,進(jìn)而節(jié)省人力、時(shí)間和資源,提高測(cè)試效率。一般滿足以下三個(gè)條件就可以對(duì)項(xiàng)目實(shí)施自動(dòng)化測(cè)試:項(xiàng)目需求變動(dòng)不頻繁項(xiàng)目周期較長(zhǎng)自動(dòng)化測(cè)試腳本可重復(fù)使用活動(dòng)一認(rèn)識(shí)自動(dòng)化測(cè)試常見的自動(dòng)化測(cè)試工具LoadRunner適用于性能測(cè)試,通過模擬大量用戶實(shí)施并發(fā)負(fù)載及實(shí)時(shí)性能監(jiān)測(cè)的方式來確認(rèn)和查找問題。LoadRunner可適用于各種體系架構(gòu)的自動(dòng)負(fù)載測(cè)試,能預(yù)測(cè)系統(tǒng)行為并評(píng)估系統(tǒng)性能。QuickTestProfessional適用于Web自動(dòng)化測(cè)試,提供符合所有主要應(yīng)用軟件環(huán)境的功能測(cè)試和回歸測(cè)試的自動(dòng)化。采用關(guān)鍵字驅(qū)動(dòng)的理念以簡(jiǎn)化測(cè)試用例的創(chuàng)建和維護(hù)。它讓用戶可以直接錄制屏幕上的操作流程,自動(dòng)生成功能測(cè)試或者回歸測(cè)試用例。Postman適用于接口測(cè)試,提供功能強(qiáng)大的WebAPI和HTTP請(qǐng)求的調(diào)試,它能夠發(fā)送任何類型的HTTP請(qǐng)求,并且能附帶任何數(shù)量的參數(shù)和Headers,還提供測(cè)試數(shù)據(jù)和環(huán)境配置數(shù)據(jù)的導(dǎo)入導(dǎo)出。JMeter適用于接口測(cè)試,性能測(cè)試,100%的用java實(shí)現(xiàn)。用于模擬在服務(wù)器、網(wǎng)絡(luò)或者其他對(duì)象上附加高負(fù)載以測(cè)試他們提供服務(wù)的受壓能力,或者分析他們提供的服務(wù)在不同負(fù)載條件下的總性能情況。Selenium適用于Web自動(dòng)化測(cè)試,利用Selenium編寫的自動(dòng)化測(cè)試腳本可以模擬用戶在瀏覽器中的各種操作,支持的瀏覽器包括IE、Firefox、Chrome等,還支持多平臺(tái)和多語言。Appium適用于App自動(dòng)化測(cè)試,支持iOS和Android平臺(tái),支持Python、Java等語言。當(dāng)收到客戶端的連接后,就會(huì)監(jiān)聽到命令,然后在移動(dòng)設(shè)備上執(zhí)行這些命令,最后將執(zhí)行結(jié)果放在HTTP響應(yīng)中返還給客戶端。AppiumSeleniumJMeterPostmanQTPLoadRunner活動(dòng)一認(rèn)識(shí)自動(dòng)化測(cè)試自動(dòng)化測(cè)試的流程活動(dòng)一認(rèn)識(shí)自動(dòng)化測(cè)試活動(dòng)二搭建自動(dòng)化測(cè)試環(huán)境四款軟件:PythonPython語言開發(fā)環(huán)境基于Web的自動(dòng)化測(cè)試工具SeleniumPyCharmPythonIDE谷歌瀏覽器Chrome一、安裝Python開發(fā)環(huán)境
從Python官網(wǎng)下載安裝程序,雙擊Python,根據(jù)提示一步步操作。1、雙擊安裝文件(如python-3.11.5-amd64.exe)進(jìn)行安裝,如下圖所示。按照圈中區(qū)域進(jìn)行設(shè)置,切記要勾選打鉤的框,如果不進(jìn)行勾選,需要自己配置環(huán)境變量,勾選后會(huì)自動(dòng)配置環(huán)境變量。然后再點(diǎn)擊“Customizeinstallation(自定義安裝)”進(jìn)入到下一步?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境2、點(diǎn)擊自定義安裝后彈出如下圖所示的安裝界面,將所有的復(fù)選框進(jìn)行勾選,點(diǎn)擊Next?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境3、彈出新的安裝界面,如下圖所示。
界面中只勾選圖中選中的復(fù)選框即可。然后選擇安裝路徑。我們可以通過點(diǎn)擊Browse按鈕自行選擇安裝路徑,也可以直接點(diǎn)擊Install在默認(rèn)路徑進(jìn)行安裝,點(diǎn)擊Install后等待安裝完成?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境4、安裝完成后為了檢查我們的Python是否安裝成功,可以使用win+R打開cmd命令窗口,在窗口中輸入python命令進(jìn)行查詢,出現(xiàn)如下圖所示的提示信息則表示成功了。活動(dòng)二搭建自動(dòng)化測(cè)試環(huán)境二、安裝Selenium打開cmd命令窗口在線安裝Selenium。命令:pipinstallselenium說明:通過“pipinstallselenium”命令安裝Selenium時(shí),系統(tǒng)將默認(rèn)安裝當(dāng)前最新的版本。如果想要安裝指定的Selenium版本,可以使用“pipinstallselenium==版本號(hào)”命令?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境安裝完成后可以用
pipshowselenium命令檢查是否安裝成功。如下圖所示。活動(dòng)二搭建自動(dòng)化測(cè)試環(huán)境三、安裝PyCharm
PyCharm安裝包需要從網(wǎng)上自行下載。安裝步驟如下:1、雙擊PyCharm安裝包,彈出如下圖所示對(duì)話框,之后點(diǎn)擊Next?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境2、選擇安裝路徑(也可以使用默認(rèn)路徑),選擇完成后,點(diǎn)擊Next,如下圖所示?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境3、選擇相對(duì)應(yīng)的系統(tǒng)和文件后綴名,之后點(diǎn)擊Next,如圖所示?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境4、在開始安裝界面點(diǎn)擊Install,進(jìn)行安裝,如圖所示?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境5、安裝成功之后勾選復(fù)選框,點(diǎn)擊Finish,表示安裝完成并運(yùn)行PyCharm。如圖所示?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境四、安裝Chrome瀏覽器以及驅(qū)動(dòng)1、安裝Chrome瀏覽器
訪問GoogleChrome官方網(wǎng)站下載Chrome瀏覽器安裝程序,下載地址:/chrome/,然后根據(jù)提示一步步完成安裝。2、安裝Chrome瀏覽器驅(qū)動(dòng)
要想通過自動(dòng)化腳本打開瀏覽器,還需要安裝瀏覽器驅(qū)動(dòng)。除了Firefox瀏覽器的驅(qū)動(dòng)已經(jīng)默認(rèn)包含在SeleniumWedDriver包里了,可以直接調(diào)用。如果要使用其他瀏覽器,比如IE瀏覽器或者谷歌瀏覽器,都需要安裝相應(yīng)的瀏覽器驅(qū)動(dòng)。活動(dòng)二搭建自動(dòng)化測(cè)試環(huán)境
注意下載與谷歌瀏覽器版本對(duì)應(yīng)的驅(qū)動(dòng)。然后將谷歌瀏覽器驅(qū)動(dòng)文件chromedriver.exe放置在python安裝文件的根目錄“...\Python\Python35”下,如下圖所示?;顒?dòng)二搭建自動(dòng)化測(cè)試環(huán)境任務(wù)二SeleniumWebDriver的基本應(yīng)用一、引入webdriver模塊
要在Pycharm中使用WebDriver編寫自動(dòng)化測(cè)試腳本,首先需要引入WebDriver模塊。代碼如下:
fromseleniumimportwebdriver活動(dòng)一熟悉WebDriver基礎(chǔ)二、瀏覽器的打開、關(guān)閉方法說明webdriver.瀏覽器名稱()打開測(cè)試使用的瀏覽器get(url)打開頁面quit()退出當(dāng)前瀏覽器close()關(guān)閉瀏覽器的當(dāng)前窗口表5-5打開、關(guān)閉瀏覽器的方法活動(dòng)一熟悉WebDriver基礎(chǔ)示例:調(diào)用谷歌瀏覽器訪問百度首頁,然后關(guān)閉窗口。fromseleniumimportwebdriver
#打開Chrome瀏覽器使用Chrome()方法driver=webdriver.Chrome()
driver.get("")
driver.close()活動(dòng)一熟悉WebDriver基礎(chǔ)三、瀏覽器的前進(jìn)、后退和刷新表5-6瀏覽器的前進(jìn)、后退和刷新方法方法說明forward()瀏覽器前進(jìn)back()瀏覽器后退refresh()瀏覽器刷新活動(dòng)一熟悉WebDriver基礎(chǔ)示例:實(shí)現(xiàn)百度首頁和百度新聞頁面之間的切換。fromseleniumimportwebdriver
driver=webdriver.Chrome()
driver.get("")
driver.get("")
driver.back()#后退到“百度首頁”
driver.forward()#前進(jìn)到“百度新聞頁面”driver.refresh()#刷新頁面活動(dòng)一熟悉WebDriver基礎(chǔ)四、瀏覽器窗口的設(shè)置表5-7設(shè)置瀏覽器窗口的大小和位置的方法方法說明maximize_window()將瀏覽器窗口最大化minimize_window()將瀏覽器窗口最小化set_window_position(x,y)將瀏覽器窗口移動(dòng)到指定位置set_window_size(width,height)將瀏覽器窗口設(shè)置為指定大小set_window_rect(x,y,width,height)將瀏覽器窗口移動(dòng)到指定位置并設(shè)置為指定大小活動(dòng)一熟悉WebDriver基礎(chǔ)示例:設(shè)置瀏覽器窗口的大小和位置。fromseleniumimportwebdriver
driver=webdriver.Chrome()
driver.get("")#將瀏覽器窗口最小化driver.minimize_window()#將瀏覽器窗口最大化driver.maximize_window()#設(shè)置瀏覽器窗口大小為寬500像素、高600像素driver.set_window_size(500,600)#將瀏覽器窗口移動(dòng)到橫坐標(biāo)200像素、縱坐標(biāo)100像素的位置driver.set_window_position(200,100)#將瀏覽器窗口移動(dòng)到橫坐標(biāo)200像素、縱坐標(biāo)200像素的位置并設(shè)置窗口大小為寬400像素、高400像素driver.set_window_rect(200,200,400,400)活動(dòng)一熟悉WebDriver基礎(chǔ)自動(dòng)化要做的就是模擬鼠標(biāo)和鍵盤來操作頁面上的元素,或單擊,或輸入,或鼠標(biāo)懸停等。
操作這些元素的前提是需要找到它們,自動(dòng)化工具無法像測(cè)試人員一樣可以通過肉眼來分辨頁面上的元素,并且知道它們是做什么用的,那么如何找到它們呢?活動(dòng)二定位元素通過前端工具,可以看到頁面上的元素都是由一行行的代碼組成的,它們之間有層級(jí)地組織起來,每個(gè)元素有不同的標(biāo)簽名和屬性值。WebDriver就是通過這些信息來找到不同的元素的。活動(dòng)二定位元素一、單個(gè)元素的定位
WebDriver提供了八種對(duì)單個(gè)元素進(jìn)行定位的方法,在Python語言中,所對(duì)應(yīng)的方法如下:find_element_by_id()find_element_by_name()find_element_by_class_name()find_element_by_tag_name()find_element_by_link_text()find_element_by_partial_link_text()find_element_by_xpath()find_element_by_css_selector()活動(dòng)二定位元素格式:find_element_by_id()1、id定位id定位是通過元素的id屬性值來定位元素。由于在頁面中id屬性值一般不會(huì)重復(fù),所以如果元素有id屬性,可以優(yōu)先考慮使用id定位方法定位元素。
以百度頁面的輸入框?yàn)槔?。先打開百度頁面,右擊輸入框,在彈出菜單中選“檢查”,出現(xiàn)的界面如右圖所示。定位輸入框的腳本:find_element_by_id(“kw”)活動(dòng)二定位元素格式:find_element_by_name()2、name定位在編寫自動(dòng)化腳本的時(shí)候,如果頁面中某個(gè)元素沒有id屬性,那我們就沒有辦法通過id屬性去定位頁面元素,但是如果這個(gè)元素的name屬性值是獨(dú)一無二的,我們就可以使用name屬性來定位。
以百度頁面的輸入框?yàn)槔?,如右圖所示。定位輸入框的腳本:find_element_by_name(“wd”)活動(dòng)二定位元素格式:find_element_by_class_name()3、class_name定位
如果某個(gè)頁面元素,既沒有id屬性,也沒有name屬性,但是我們可以在定位的頁面中找到class屬性,那么我們就可以使用class屬性來定位。
以百度頁面的輸入框?yàn)槔缬覉D所示。定位輸入框的腳本:find_element_by_class_name(“s_ipt”)活動(dòng)二定位元素格式:
find_element_by_tag_name()4、tag_name定位
HTML的本質(zhì)就是通過tag來定義實(shí)現(xiàn)不同的功能,每一個(gè)元素本質(zhì)上也是一個(gè)tag。因?yàn)橐粋€(gè)tag往往用來定義一類功能,所以通過tag識(shí)別某個(gè)元素的概率很低。打開任意一個(gè)頁面,都會(huì)發(fā)現(xiàn)存在大量的<div>、<input>、<a>等tag。所以很難通過tagname去區(qū)分不同的元素。以百度頁面為例,如右圖所示。腳本find_element_by_tag_name(“input”)不能定位到文本框?;顒?dòng)二定位元素格式:
find_element_by_link_text()5、link_text定位link_text定位專門用來定位文本鏈接,使用超鏈接的文本做參數(shù)來進(jìn)行定位。
右擊百度頁面左上角的“地圖”,選“檢查”,如右圖所示。通過元素屬性可以看出,標(biāo)簽名為a,且href
=“http://map.baidu.com”,說明它是個(gè)超鏈接,對(duì)于這種元素,可以用link定位。定位“地圖”鏈接的腳本:find_element_by_link_text(“地圖”)活動(dòng)二定位元素格式:find_element_by_partial_link_text()6、partial_link_text定位link_text定位方法是使用超鏈接文本的全部字符串進(jìn)行定位。有時(shí)候一個(gè)超鏈接文本的字符串可能比較長(zhǎng),如果輸入全稱的話,會(huì)顯示很長(zhǎng),既占地方而且也易出錯(cuò),這時(shí)候可以用partial_link_text定位。這是一種模糊匹配方式,只要截取超鏈接文本中一部分字符串就可以。
如右圖所示的新浪網(wǎng)站。定位“跟著習(xí)近平學(xué)黨史—增強(qiáng)理論自信”鏈接的腳本:find_element_by_partial_link_text(“學(xué)黨史”)活動(dòng)二定位元素格式:find_element_by_xpath()7、XPath定位
XPath即為XML路徑語言,是一種用來確定XML文檔中某部分位置的語言。XPath基于XML的樹狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹中找尋節(jié)點(diǎn)的能力。因?yàn)镠TML可以看做XML的一種實(shí)現(xiàn),所以selenium用戶可以使用這種強(qiáng)大的語言在web應(yīng)用中定位元素。
如果熟悉XPath語法可手工編寫XPath路徑。更簡(jiǎn)單的做法是直接從網(wǎng)站頁面復(fù)制XPath路徑。以百度網(wǎng)站為例,如右圖所示。XPath定位輸入框的腳本:find_element_by_xpath(‘//*[@id="kw"]’)活動(dòng)二定位元素格式:find_element_by_css_selector()8、css_selector定位
css_selector定位是另外一種通過路徑導(dǎo)航實(shí)現(xiàn)某個(gè)元素的定位方法,但是此方法比XPath更為簡(jiǎn)潔,運(yùn)行速度更快。我們可以通過定位到某個(gè)頁面元素后,直接右擊選擇“Copy–Copyselector”復(fù)制出CSS路徑,然后放到css_selector定位方法中做參數(shù)進(jìn)行元素定位。以百度網(wǎng)站為例,如右圖所示。CSS定位輸入框的腳本:find_element_by_css_selector(“#kw”)活動(dòng)二定位元素
當(dāng)測(cè)試頁面上有多個(gè)元素需要進(jìn)行操作時(shí),逐一進(jìn)行定位就會(huì)比較麻煩。例如需要同時(shí)選擇頁面上的所有復(fù)選框,這時(shí)候可以通過一組元素的定位方法進(jìn)行定位。方法說明find_elements_by_id()通過元素的id屬性值定位一組元素find_elements_by_name()通過元素的name屬性值定位一組元素find_elements_by_class_name()通過元素的class屬性值定位一組元素find_elements_by_tag_name()通過元素的標(biāo)簽名定位一組元素find_elements_by_link_text()通過超鏈接全部文本內(nèi)容定位一組元素find_elements_by_partial_link_text()通過超鏈接部分或全部文本內(nèi)容定位一組元素find_elements_by_xpath()通過元素路徑定位一組元素find_elements_by_css_selector()通過css選擇器定位一組元素表5-8定位一組元素的方法活動(dòng)二定位元素一、Keys類
用selenium做自動(dòng)化測(cè)試,有時(shí)候會(huì)遇到需要用到模擬鍵盤操作的情況,而selenium給我們提供了一個(gè)類來處理這類事件——Keys類。Keys類提供了對(duì)鍵盤上幾乎所有按鍵的操作。這個(gè)類能夠滿足我們對(duì)鍵盤基本操作的需求。注意:模擬鍵盤的操作需要先導(dǎo)入鍵盤模塊,腳本為:frommon.keysimportKeys活動(dòng)三模擬鍵盤操作Keys常用按鍵列表回車鍵
Keys.ENTER刪除鍵
Keys.BACK_SPACE空格鍵
Keys.SPACETAB鍵
Keys.TABShift鍵
Keys.SHIFTESC鍵
Keys.ESCAPE上鍵
Keys.ARROW_UP下鍵
Keys.ARROW_DOWN左鍵
Keys.ARROW_LEFT右鍵
Keys.ARROW_RIGHT“+”鍵Keys.
ADD“-”鍵Keys.
SUBTRACT“*”鍵Keys.MULTIPLY“/”鍵Keys.DIVIDE“=”鍵
Keys.EQUALS全選(Ctrl+A)Keys.CONTROL,'a'復(fù)制(Ctrl+C)Keys.CONTROL,'c'剪切(Ctrl+X)Keys.CONTROL,'x'粘貼(Ctrl+V)Keys.CONTROL,'v'數(shù)字0Keys.NUMPAD0數(shù)字1Keys.NUMPAD1…….數(shù)字9Keys.NUMPAD9鍵盤F1 Keys.F1…….鍵盤F12
Keys.F12活動(dòng)三模擬鍵盤操作三、send_keys方法
send_keys()方法可以用來模擬鍵盤輸入,將按鍵發(fā)送到當(dāng)前活動(dòng)對(duì)象,就好像它們是從鍵盤輸入的一樣。send_keys()方法的參數(shù)可以是字符串常量或變量,也可以是Keys類中的按鍵。例如:driver.find_element_by_id(“kw”).send_keys(“軟件測(cè)試”)driver.find_element_by_id(“kw”).send_keys(Keys.TAB)活動(dòng)三模擬鍵盤操作在百度首頁的輸入框中做模擬鍵盤操作的練習(xí)。fromseleniumimportwebdriver#引入Keys模塊frommon.keysimportKeys
importtime
driver=webdriver.Chrome()
driver.get(“”)
#輸入框輸入文字“selenium書”
driver.find_element_by_id(“kw”).send_keys(“selenium書")#刪除最后一個(gè)字符“書”driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)活動(dòng)三模擬鍵盤操作#輸入空格鍵+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("教程")#ctrl+a全選輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")#ctrl+x剪切輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
#ctrl+v粘貼內(nèi)容到輸入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"v")#定位到“百度一下”按鈕,按下回車鍵driver.find_element_by_id("su").send_keys(Keys.ENTER)活動(dòng)三模擬鍵盤操作一、鼠標(biāo)單擊操作
WebDriver提供了click()
方法用來模擬鼠標(biāo)單擊操作。
click()
方法可以用來單擊一個(gè)元素,前提是這個(gè)元素是可以被單擊的對(duì)象。
所以,click()方法可用于單擊一個(gè)按鈕,還能單擊文本鏈接、圖片鏈接、復(fù)選框、單選框、下拉框等任何可以單擊的元素。例如:
driver.find_element_by_id("su").click()活動(dòng)四模擬鼠標(biāo)操作二、ActionChains類
除了鼠標(biāo)單擊操作,其余的鼠標(biāo)操作方法都是由ActionChains類來提供。
引入ActionChains類的腳本:frommon.action_chainsimportActionChainsActionChains執(zhí)行原理:
調(diào)用ActionChains中的方法時(shí),不會(huì)立即執(zhí)行,而是會(huì)將所有的操作按順序存放在一個(gè)隊(duì)列里,當(dāng)你調(diào)用perform()方法時(shí),會(huì)按照隊(duì)列里面的順序進(jìn)行執(zhí)行。其中調(diào)用的perform()方法必須放在ActionChains方法的最后?;顒?dòng)四模擬鼠標(biāo)操作三、鼠標(biāo)右擊操作
ActionChains類中用來模擬鼠標(biāo)右擊操作的方法是context_click()。例:實(shí)現(xiàn)百度輸入框的右擊操作。fromseleniumimportwebdriver
#引入ActionChains類
frommon.action_chainsimportActionChains
driver=webdriver.Chrome()
driver.get("")
#定位到要右擊的元素
right=driver.find_element_by_id("kw")
#對(duì)定位到的元素執(zhí)行鼠標(biāo)右鍵操作
ActionChains(driver).context_click(right).perform()活動(dòng)四模擬鼠標(biāo)操作四、鼠標(biāo)雙擊操作ActionChains類中用來模擬鼠標(biāo)雙擊操作的方法是double_click()。例:…….
#定位到要雙擊的元素double=driver.find_element_by_id("su")#對(duì)定位到的元素執(zhí)行雙擊操作ActionChains(driver).double_click(double).perform()…….活動(dòng)四模擬鼠標(biāo)操作五、鼠標(biāo)懸停操作ActionChains類中用來模擬鼠標(biāo)懸停操作的方法是move_to_element()。例:將鼠標(biāo)懸停在百度首頁的文本鏈接“更多”上,效果如圖所示。fromseleniumimportwebdriver
#引入ActionChains類
frommon.action_chainsimportActionChains
driver=webdriver.Chrome()
driver.get("")
#定位到要懸停的元素
above=driver.find_element_by_link_text("更多")
#對(duì)定位到的元素執(zhí)行懸停操作
ActionChains(driver).move_to_element(above).perform()活動(dòng)四模擬鼠標(biāo)操作六、鼠標(biāo)拖放操作ActionChains類中用來模擬鼠標(biāo)拖放操作的方法是drag_and_drop(source,target)。各參數(shù)含義:source:鼠標(biāo)拖動(dòng)的源元素target:鼠標(biāo)釋放的目標(biāo)元素方法作用:實(shí)現(xiàn)在源元素上按住鼠標(biāo)左鍵,然后移動(dòng)到目標(biāo)元素上釋放。例:#定位源元素s=driver.find_element_by_id(“xx")#定位目標(biāo)元素
t=driver.find_element_by_id(“xx")#執(zhí)行鼠標(biāo)的拖放操作ActionChains(driver).drag_and_drop(s,t).perform()活動(dòng)四模擬鼠標(biāo)操作click(on_element=None)——單擊鼠標(biāo)左鍵click_and_hold(on_element=None)——點(diǎn)擊鼠標(biāo)左鍵,不松開context_click(on_element=None)——點(diǎn)擊鼠標(biāo)右鍵double_click(on_element=None)——雙擊鼠標(biāo)左鍵drag_and_drop(source,target)——拖拽到某個(gè)元素然后松開drag_and_drop_by_offset(source,xoffset,yoffset)——拖拽到某個(gè)坐標(biāo)然后松開key_down(value,element=None)——按下某個(gè)鍵盤上的鍵key_up(value,element=None)——松開某個(gè)鍵move_by_offset(xoffset,yoffset)——鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)move_to_element(to_element)——鼠標(biāo)移動(dòng)到某個(gè)元素move_to_element_with_offset(to_element,xoffset,yo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手車協(xié)議樣本
- 軀體感覺障礙病因介紹
- 苔蘚樣念珠狀疹病因介紹
- 藥物性腎損害病因介紹
- 內(nèi)蒙古通遼市(2024年-2025年小學(xué)六年級(jí)語文)部編版質(zhì)量測(cè)試(下學(xué)期)試卷及答案
- 中考地理總復(fù)習(xí)八上第三章中國(guó)的自然資源教材知識(shí)梳理
- 畜禽糞便+尾菜膜覆蓋好氧堆肥技術(shù)規(guī)范
- (參考)塑料壺項(xiàng)目立項(xiàng)報(bào)告
- 2024-2025學(xué)年江蘇省南京市六年級(jí)語文上學(xué)期期末考試真題重組卷(統(tǒng)編版)-A4
- 2023年天津市十二區(qū)縣重點(diǎn)學(xué)校高考語文模擬試卷(一)
- 四川省南充市2023-2024學(xué)年高一上學(xué)期期末考試 政治 含解析
- 【MOOC】土木工程制圖-同濟(jì)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2024秋期國(guó)家開放大學(xué)本科《中國(guó)法律史》一平臺(tái)在線形考(第一至三次平時(shí)作業(yè))試題及答案
- 人教版5年級(jí)上冊(cè)音樂測(cè)試(含答案)
- 《經(jīng)絡(luò)及任督二脈》課件
- Excel表格運(yùn)用培訓(xùn)學(xué)習(xí)教案
- 普天同慶主降生ppt課件
- 溶劑萃取分離稀土元素PPT課件
- 基于windows操作平臺(tái)的數(shù)據(jù)恢復(fù)技術(shù)
- 賽前心理輔導(dǎo).ppt
- 【課件】高一英語作文: 讀后續(xù)寫課件(共24張)
評(píng)論
0/150
提交評(píng)論