寫(xiě)完前兩步測(cè)試步驟桨踪,現(xiàn)在就該寫(xiě)驗(yàn)證查詢的核心代碼了。我們先整理整理思路,思考下面兩個(gè)問(wèn)題:
1. 數(shù)據(jù)是否全面?首先打開(kāi)數(shù)據(jù)集文件TCTIMES-1.xls惕蹄,這是我們提前準(zhǔn)備好的泪蔫,其實(shí)到了這步再做第二個(gè)sheet里的數(shù)據(jù)集也可以逛拱。文件里面有4個(gè)員工,其中3個(gè)有工時(shí)表讲婚,Tester Four沒(méi)有竹捉。之所以這樣設(shè)計(jì)數(shù)據(jù)集文件就是要把沒(méi)有返回結(jié)果的情況也考慮進(jìn)去憨闰;
2. 這里的查詢需要有幾個(gè)檢查點(diǎn)呢泽示?我覺(jué)得應(yīng)該是兩個(gè)郎汪。第一個(gè)是有沒(méi)有返回結(jié)果;第二個(gè)是如果有返回結(jié)果弟断,結(jié)果是否正確叔汁。
這兩個(gè)問(wèn)題都得到答案后边篮,開(kāi)始動(dòng)手腾么。還是老方法悍汛,先寫(xiě)查詢的函數(shù)凑懂,然后把函數(shù)放到test case里調(diào)用。打開(kāi)RIDE,右擊Pages -> Timesheet.html -> New UserKeyword新建函數(shù)例驹,起名Search Timesheet By Employee Name圆丹,接受員工姓,員工名璃诀,以及期望結(jié)果總共三個(gè)參數(shù) - ${first},${last},和${expectedTimesheetNum}犀变。先別管${expectedTimesheetNum}懦傍,看前兩個(gè)參數(shù)娱俺。TCTIMES-1.xls文件里員工姓和名是分開(kāi)的。但是披诗,我搜索的時(shí)候是姓和名一起敲進(jìn)框框里的,后面的驗(yàn)證中也是驗(yàn)證整個(gè)名字存不存在立磁,不會(huì)把姓和名單獨(dú)考慮呈队。所以當(dāng)它們分別傳入到函數(shù)中時(shí),我先要把倆字符串合成一個(gè):
連接兩個(gè)字符串的關(guān)鍵字是Catenate唱歧,它屬于RF自帶的類(lèi)庫(kù)宪摧,有以下幾種使用方法:
默認(rèn)情況下接受兩個(gè)參數(shù),得到的是“${first} ${last}”迈喉,也就是中間會(huì)有一個(gè)空格绍刮。如果加一個(gè)參數(shù)SEPERATOR就可以自定義中間分隔符。很顯然我們這里用的是默認(rèn)方法挨摸,不過(guò)一會(huì)兒我們就會(huì)用到另外的方法。姓和名組成一個(gè)字符串后被賦給一個(gè)叫${searchkeyword}的變量岁歉,我把它定義成了局部變量得运,沒(méi)聲明在ObjRepository -> timesheet.html里,因?yàn)槌诉@個(gè)函數(shù)再?zèng)]有別的地方會(huì)用到它了:
有了名字就好辦了锅移,接下來(lái)在按下圖把輸入名字的操作寫(xiě)在第二行熔掺,把點(diǎn)擊查詢按鈕的操作寫(xiě)在第三行:
可以看到,現(xiàn)在輸入到搜索框的內(nèi)容已經(jīng)是姓名的整個(gè)字符串非剃。注意置逻,在第四行要有一個(gè)等待過(guò)程,為網(wǎng)頁(yè)搜索留出時(shí)間备绽。有時(shí)候網(wǎng)速太慢或內(nèi)容太多導(dǎo)致搜索時(shí)間很長(zhǎng)券坞,如果搜索還沒(méi)完成就開(kāi)始驗(yàn)證勢(shì)必會(huì)影響結(jié)果鬓催。
做完這步之后我們開(kāi)始驗(yàn)證第一個(gè)檢查點(diǎn)–看有沒(méi)有返回結(jié)果。輸入字符串以后如果有匹配的話就應(yīng)該返回結(jié)果了恨锚,比如Tester One宇驾。我們?cè)诨鸷鼮g覽器里打開(kāi)Firebug來(lái)看看工時(shí)表的xpath有什么變化:
只有關(guān)于員工Tester One的兩條工時(shí)記錄代碼段還顯示出來(lái),別的都不存在了猴伶。這樣題目就容易了课舍,在輸入姓名后,我們讓程序檢查員工工時(shí)代碼段的數(shù)目和預(yù)期結(jié)果是不是一樣不就得了么他挎?換句話說(shuō)筝尾,就是比較含有該姓名的xpath數(shù)量和預(yù)期的值是否一樣。我們之前已經(jīng)把預(yù)期結(jié)果寫(xiě)到了TCTIMES-1.xls的employee sheet里办桨,現(xiàn)在可以用到了忿等。對(duì)于Tester One來(lái)說(shuō),有2條就證明和預(yù)期結(jié)果一樣崔挖,測(cè)試通過(guò)贸街。代碼如下第4步到第8步:
第4步?jīng)]什么可說(shuō)的,一個(gè)小注釋?zhuān)瑳](méi)必要顯示在最后報(bào)告里狸相,因?yàn)槲抑幌敫嬖V自己現(xiàn)在開(kāi)始執(zhí)行第一個(gè)檢查點(diǎn)看看有沒(méi)有返回結(jié)果薛匪,僅此而已。
第5步和第6步里出現(xiàn)了三次${locTSTable_Records_EmployeeName}脓鹃,它代表員工工時(shí)的xpath逸尖。我們先在ObjRepository -> Timesheet.html里創(chuàng)建出來(lái),值是//table/tbody/tr/td[contains(text(),'||EMPLOYEE NAME||')]:
這個(gè)變量看起來(lái)有點(diǎn)特殊瘸右,||EMPLOYEE NAME||不是個(gè)定值劳坑,是個(gè)可替換的字符串,大家可以像理解函數(shù)一樣理解這個(gè)變量呛哟,||EMPLOYEE NAME||就相當(dāng)于變量中的參數(shù)癣诱。這么寫(xiě)的原因是我們的測(cè)試數(shù)據(jù)里有4位員工,每個(gè)員工的工時(shí)xpath都不一樣龄章,而不一樣的地方就是姓名吃谣。比如Tester One的xpath是//table/tbody/tr/td[contains(text(),'Tester One')],Tester Two的xpath是//table/tbody/tr/td[contains(text(),'Tester Two')]做裙,以此類(lèi)推岗憋。所以我們不能把這個(gè)變量寫(xiě)死,要讓程序每次執(zhí)行時(shí)都臨時(shí)把||EMPLOYEE NAME||替換成我們?cè)谒阉骺蛑休斎氲膯T工姓名锚贱。第5步就是在執(zhí)行替換過(guò)程仔戈,用到的關(guān)鍵字是Replace String。它接受三個(gè)參數(shù) – 要被替換的元素位置,被替換的是什么监徘,以及替換成什么晋修。
替換完了我們就可以數(shù)一數(shù)總共有多少個(gè)了,第6步里使用Get Matching Xpath Count耐量,這是個(gè)非常重要的語(yǔ)句飞蚓,就不說(shuō)三遍了。它在很多驗(yàn)證的步驟里都出現(xiàn)過(guò)廊蜒,得到的就是在當(dāng)前頁(yè)面中有多少個(gè)可見(jiàn)的xpath趴拧,再賦給另一個(gè)局部變量${timesheetCount}。這個(gè)關(guān)鍵字接受一個(gè)參數(shù)山叮,就是某個(gè)xpath著榴,直截了當(dāng)。
寫(xiě)到這里我們應(yīng)該意識(shí)到屁倔,在我們的例子中脑又,對(duì)于Tester One來(lái)說(shuō)${timesheetCount}應(yīng)該等于2,而對(duì)于Tester Four來(lái)說(shuō)${timesheetCount}應(yīng)該是0锐借,也就是沒(méi)有返回任何工時(shí)記錄问麸。第7步就是執(zhí)行比較的過(guò)程,用到的語(yǔ)句是Should be Equal as Strings钞翔。它默認(rèn)讓兩個(gè)字符串參數(shù)進(jìn)行比較严卖,${timesheetCount}雖然代表一個(gè)數(shù)量,但其數(shù)據(jù)類(lèi)型是字符串布轿。參數(shù)${expectedTimesheetsNum}也是個(gè)字符串哮笆,這就解釋了為什么之前我要在數(shù)據(jù)集中把期望結(jié)果那列轉(zhuǎn)換成字符串格式,就是方便在此進(jìn)行比較汰扭。如果你之前寫(xiě)成了numbers的格式那對(duì)不起了稠肘,您還得在這兒轉(zhuǎn)成字符串格式,否則字符串和numbers強(qiáng)行比較肯定會(huì)失敗萝毛。Should be Equal as Strings返回的是一個(gè)true或false的布爾值项阴,如果true就代表測(cè)試通過(guò)。
測(cè)試通過(guò)后珊泳,第8步在報(bào)告里寫(xiě)一個(gè)log鲁冯,告知測(cè)試完畢,如果測(cè)試通過(guò)了這條log會(huì)顯示出來(lái)色查。這樣,第一個(gè)檢查點(diǎn)的函數(shù)我們就寫(xiě)完了撞芍。
這篇文章的源代碼在[Test9](https://github.com/cslm/cslm.robotframework/tree/master/Test9)中秧了。