版本更新
v2.2 2018/01/20
- 更新說明文件和democase
v2.1 2018/01/09
- 更新最新chromewebdriver解決比較新的chrome打不開的情況
V2.0 2017/3/12
- 第一個版本
介紹
wtd自動化測試框架支持以下功能:
- 接口自動化測試,只需簡單的一個接口的xml文件即可
- 網(wǎng)頁UI自動化測試,編寫一個簡單的java文件放在wtd框架中即可執(zhí)行
- 測試結(jié)果報(bào)告保存,測試結(jié)果和錯誤原因及網(wǎng)頁截圖文件會保存在本地
- 測試結(jié)果匯總并自動以郵件形式發(fā)送給相關(guān)測試人員
- 定時(shí)自動執(zhí)行選定的測試case
wtd是基于selenium開發(fā)的,框架提供了很多通用的方法和接口弥雹,當(dāng)然,開發(fā)的網(wǎng)頁自動化case也可以直接使用webdriver的所有方法。接口測試case非常簡單,只需要新建一個xml文件彤守,里面替換掉接口地址,參數(shù)哭靖,期望返回結(jié)果等就可以了具垫。對于需要登錄的接口case也是支持的。
快速開始
1. 環(huán)境準(zhǔn)備并運(yùn)行demo
- 下載wtd測試框架: git clone https://github.com/peintune/wtd.git 或者直接download
- 本地安裝好JDK
- 本地安裝IDEA開發(fā)環(huán)境试幽。
- 打開IDEA筝蚕,導(dǎo)入wtd整個項(xiàng)目
- 在IDEA開發(fā)環(huán)境中,直接運(yùn)行 RunCaseTest類
1.2 運(yùn)行自己開發(fā)好的case
- 開發(fā)環(huán)境中運(yùn)行:在IDEA開發(fā)環(huán)境中,更改caselist.cfg.xml文件起宽,直接運(yùn)行 RunCaseTest類
- 正式部署環(huán)境中運(yùn)行洲胖,直接復(fù)制開發(fā)好的接口case(TC_xxx.xml)或者UI自動化case(TC_xxx.java)到正式測試環(huán)境中的對應(yīng)目錄中。更改caselist.cfg.xml文件坯沪,然后雙擊wtd.bat腳本啟動绿映。
- 正式部署環(huán)境定時(shí)循環(huán)任務(wù):打開window終端運(yùn)行 ./wtd.bat 2 5 3600,(2代表開始小時(shí)時(shí)間為2點(diǎn),5代表循環(huán)執(zhí)行5次屏箍,3600代表每次循環(huán)間隔為3600s)
以上,所有開發(fā)環(huán)境準(zhǔn)備完成橘忱,可以開始寫case了赴魁。
1. WTD 測試框架免費(fèi)下載:wtd
2. 框架目錄結(jié)構(gòu)
3. 程序運(yùn)行界面
4.生成的log文件及截圖
5.自動生成的郵件報(bào)告
6. 文檔目錄
- Case需存放的目錄:
- Case的形式:
- Case的命名規(guī)范:
- Case的具體實(shí)現(xiàn)步驟:
- Case可使用的變量及方法:
- 如何調(diào)試運(yùn)行case:
- 如何部署環(huán)境:
- 一個Case實(shí)例:
7. Case需存放的目錄:
- 在WTD項(xiàng)目中,將新功能性case新建在wtdwebuicases包中钝诚,并且此包要確定是一個sources root目錄颖御,默認(rèn)導(dǎo)入的框架中的此目錄已經(jīng)是sources root目錄。
- 將接口性case放入wtdapicases目錄中凝颇。
8. Case的形式:
- 功能性Case的實(shí)體是一個java文件潘拱。
- 接口性Case的實(shí)體是一個xml文件。
9. Case的命名規(guī)范:
- Case開頭已Tc_開頭拧略,如:Tc_LogIn芦岂。Tc是TestCase的縮寫。
10. Case的具體實(shí)現(xiàn)步驟:
- ui 自動化 Case:
- 在wtdwebuicases包中建立子package比如member,然后建立對應(yīng)的case比如TC_BaiDuSearch.java垫蛆。
- 新建case類必須繼承BaseCase類:public class TC_BaiDuSearch extends BaseCase{}
- Case必須實(shí)現(xiàn)無參方法execute()禽最;在這個方法里做具體的事情。
- 具體參考TC_BaiDuSearch case模板袱饭。
- 接口測試 Case:
- 在wtdapicases中新建TC_XiaomuwuAbout.xml文件川无,支持post,get,jsonrpc類型。
- 寫上接口case的測試地址虑乖。
- 有需要可以設(shè)置全局變量為以后的case用懦趋。如:
<setGlobalVarible name="guid" value="$Cookie.guid"/>
或者<setGlobalVarible name="sToken" value="$Response.sToken" />
- 設(shè)置測試點(diǎn)(可以多個),其中包括期望返回值(可正則表達(dá)式)疹味,執(zhí)行測試點(diǎn)之前可執(zhí)行其他公共接口仅叫。改測試點(diǎn)的各個參數(shù)。如:
<test name="the correct values" expectContansString='iStatus":1' preExcution="loginByApp"> <parameter name="userId" value="1800012315" /> </test> <test name="the wrong values" expectContansString='iStatus":0'"> <parameter name="userId" value="1800012111" /> </test>
- 接口Case可以自定義全局變量糙捺,也可以用系統(tǒng)的中變量惑芭。系統(tǒng)中的變量包括:
$Cookie,$Response,$PreResponse
11. UI 自動化測試case可使用的變量及方法:
- SessionData 類:
變量名 | 描述 |
---|---|
webDriver | Webdriver 的一個實(shí)例,用于case進(jìn)行頁面各種操作的一個對象继找,可以直接在case中調(diào)用如遂跟,webDriver.get(); |
hostName | 當(dāng)前測試的主要的host name, 可以直接在case中調(diào)用 |
caseName | 當(dāng)前測試的case 名字, 可以直接在case中調(diào)用 |
logFolder | 當(dāng)前case生成log和result文件的目錄, 可以直接在case中調(diào)用 |
logger | 可以用來記錄log到log文件, 可以直接在case中調(diào)用 |
isOnlineTest | 判斷當(dāng)前環(huán)境是否為線上測試環(huán)境 |
screenCapture()方法:返回類型:String
調(diào)用此方法會截一張當(dāng)前的圖片保存到當(dāng)前case 的log文件夾里。setDescription(String)方法: 返回類型:void
調(diào)用此方法會為當(dāng)前case設(shè)置描述信息。setErrorInfo(String)方法:返回類型:void
調(diào)用此方法會為當(dāng)前case設(shè)置一些錯誤的log信息幻锁,便于在log文件中查看錯誤原因凯亮。setPointResult(String name,String description,String result,String errorInfo)方法:返回類型:void
調(diào)用此方法會將每個測試點(diǎn)的結(jié)果寫進(jìn)result.xml和log文件中。注意:測試點(diǎn)是包含在每個case中的哄尔,每個case至少包含一個測試點(diǎn)假消,也就是說每個case至少調(diào)用此方法一次。clickBy (By by)方法:返回類型:boolean
調(diào)用此方法會點(diǎn)擊頁面一個控件岭接,并返回是否執(zhí)行成功富拗。clickById(String id)方法:返回類型:boolean
調(diào)用此方法會點(diǎn)擊頁面一個控件,并返回是否執(zhí)行成功鸣戴。clickByLinkText(String link)方法:返回類型:boolean
調(diào)用此方法會點(diǎn)擊頁面一個控件啃沪,并返回是否執(zhí)行成功。sendKeys(By by, String value)方法:返回類型:boolean
調(diào)用此方法會向一個控件輸入信息窄锅,并返回是否執(zhí)行成功创千。sendKeysById(String id, String value)方法:返回類型:boolean
調(diào)用此方法會向一個控件輸入信息,并返回是否執(zhí)行成功入偷。isExist(By by)方法:返回類型:boolean
調(diào)用此方法會判斷某個元素是否存在追驴,并返回判斷結(jié)果,true是找到該元素疏之。isTextExist(String content)方法:返回類型:boolean
調(diào)用此方法會判斷是否存在某個值的元素殿雪,并返回判斷結(jié)果,true是找到該元素锋爪。比如判斷當(dāng)前頁面是否有“注冊”字段冠摄。isCurrentURL(String url)方法:返回類型:boolean
調(diào)用此方法會判斷當(dāng)前URL是否和傳入的URL一樣,并返回判斷結(jié)果几缭,true是表示一樣的河泳。
更多方法可以參考com.pub.wtd.common.BaseCase 類和webdiver對象中的方法∧晁ǎ或者登陸 小木屋
12. 如何調(diào)試運(yùn)行case:
- 調(diào)試運(yùn)行case:
- 在Intellij IDEA 中打開整個WTD項(xiàng)目拆挥。
- 編寫接口測試case和ui 自動化測試case,具體可以參考項(xiàng)目中的demo某抓。
- 更改config/conf/wtd.cfg.xml中測試的hostname纸兔,測試瀏覽器,測試人員郵箱的信息否副。
- 在conig/caselist.cfg.xml中添加要調(diào)試運(yùn)行的case汉矿。
- 運(yùn)行或者調(diào)試運(yùn)行runcasestest 包中的RunCaseTest類。
13. 如何部署環(huán)境:
- 更改config/conf/wtd.cfg.xml中測試的hostname备禀,測試瀏覽器洲拇,測試人員郵箱的信息奈揍。
- 在conig/caselist.cfg.xml中添加要測試的case。
- 雙擊運(yùn)行wtd.bat或者通過任意windows shell環(huán)境運(yùn)行wtd.bat(推薦)赋续。
14. 一個接口 Case實(shí)例:
<?xml version="1.0" encoding="utf-8" ?>
<case description="change the userlogin passwd" type="post">
<testApi api="http://xxx.xxx.qa.ipo.com/api/internal/user/changepwd.html" />
<setGlobalVarible name="guid" value="$Cookie.guid"/>
<setGlobalVarible name="token" value="$Response.token"/>
<test name="the correct values" expectContansString='iStatus":1' preExcution="logintoManage">
<parameter name="iUserID" value="$PreResponse.istatus" />
<parameter name="sOldPassword" value="a592ee46b591ba0c8bcce6a27c109f65" />
<parameter name="sNewPassword" value="4e1cea91bcd58ab5982ab1b50c2a782b" />
</test>
<test name="the correct values" expectContansString='iStatus":1'>
<parameter name="iUserID" value="45671" />
<parameter name="sOldPassword" value="4e1cea91bcd58ab5982ab1b50c2a782b" />
<parameter name="sNewPassword" value="a592ee46b591ba0c8bcce6a27c109f65" />
</test>
</case>
15. 一個UI自動化 Case實(shí)例:
public class TC_BaiDuSearch extends BaseCase {
/**
* 每一個ui自動化case都必須實(shí)現(xiàn)execute()方法男翰,此方法是此case的入口。
* 編寫case時(shí)可以參考以下步驟:
* 1纽乱,打開首頁或者一個鏈接或者自己定義的一個頁面:webDriver.get(String),new HomePage(sessionData).goToPage(),
* 2蛾绎,設(shè)置這個case的描述信息:setDescription(String)
* 3,執(zhí)行某些操作鸦列。
* 4租冠,檢查預(yù)期值或者頁面元素并設(shè)置這個測試點(diǎn)測試通過或者測試失敗:setPointResult("", "", "pass", "NULL");
* 5,有必要時(shí)可以截取當(dāng)前頁面的截屏:screenCapture()
*
* 對于第三步薯嗤,目前支持以下操作顽爹。
* 1,查找頁面元素:findElement(By),findElementById(String),findElements(By).
* 2应民,查找元素的值(也就是元素的value),findElvalue(By)
* 3话原,點(diǎn)擊頁面元素:clickBy(By),clickById(String),clickByLinkText(String)
* 4夕吻,判斷頁面元素是否存在:isExist(By)
* 5诲锹,判斷文本是否存在:isTextExist(String)
* 6,向諸如文本框之類的控件輸入值:sendKeysBy(By,String),sendKeysById(By,String)
* 7涉馅,所有webdriver支持的操作归园。
*
* 更多更新信息請到 snappydata.top
*/
public void execute() {
//new HomePage(sessionData).goToPage();// 自定義一個頁面,所有case都可以共享這個頁面,直接在case中打開這個頁面稚矿。
webDriver.get("http://www.baidu.com");//利用webdriver執(zhí)行打開頁面
setDescription("測試百度搜索功能");// 設(shè)置case的描述信息
if (isCurrentURL(hostName+"/")|| isCurrentURL(hostName )) {// 判斷當(dāng)前頁面是否是百度主頁
setPointResult("GoToHome", "回到首頁", "pass", "NULL");//設(shè)置此測試點(diǎn)通過
} else {
setPointResult("GoToHome", "回到首頁", "fail","can not go to home page");//設(shè)置此測試點(diǎn)失敗
}
String path = screenCapture();// 截取當(dāng)前頁面截屏
testSearch();//測試搜索功能
}
public void testSearch(){
sendKeysById("kw","snappydata.top");
clickById("su");
if(isTextExist("snappydata")){
setPointResult("測試搜索","測試搜索功能","pass","NULL");
}else{
setPointResult("測試搜索","測試搜索功能","fail","百度搜索測試失敗");
screenCapture();// 截取當(dāng)前頁面截屏
}
}
}