測(cè)試腳本和數(shù)據(jù)的解耦

文章內(nèi)容來(lái)源于《軟件測(cè)試52講》

如果在測(cè)試腳本中硬編碼(hardcode)測(cè)試數(shù)據(jù)的話锋勺,測(cè)試腳本靈活性會(huì)非常低乍丈。而且衙解,對(duì)于那些具有相同頁(yè)面操作,而只是測(cè)試輸入數(shù)據(jù)不同的用例來(lái)說(shuō)埃脏,就會(huì)存在大量重復(fù)的代碼搪锣。

依舊以百度搜索為例,上一篇文章中實(shí)現(xiàn)的百度搜索的測(cè)試用例彩掐,當(dāng)時(shí)用例中搜索的關(guān)鍵詞是“python”构舟,假設(shè)我們還需要測(cè)試搜索關(guān)鍵詞是“Java”和“go”的場(chǎng)景,如果不做任何處理堵幽,那我們就可能需要將之前的代碼復(fù)制 3 份狗超,每份代碼的主體完全一致,只是其中的搜索關(guān)鍵詞和斷言(Assert)的預(yù)期結(jié)果不同朴下。

更糟糕的是努咐,界面有任何的變更需要修改自動(dòng)化腳本時(shí),之前復(fù)制出來(lái)的三個(gè)腳本都需要做相應(yīng)的修改殴胧。一旦頁(yè)面元素名字發(fā)生了變化斩郎,就需要修改所有腳本中 findElement 方法的 by.name 屬性氏涩。如果有 100個(gè)或者更多的腳本呢郑口,就會(huì)發(fā)現(xiàn)腳本的維護(hù)成本實(shí)在是太高了枫虏。

測(cè)試數(shù)據(jù)和測(cè)試腳本分離

也就是說(shuō)測(cè)試腳本只有一份,其中需要輸入數(shù)據(jù)的地方會(huì)用變量來(lái)代替灸姊,然后把測(cè)試輸入數(shù)據(jù)單獨(dú)放在一個(gè)文件中拱燃。這個(gè)存放測(cè)試輸入數(shù)據(jù)的文件,通常是表格的形式力惯,也就是最常見(jiàn)的 CSV 文件碗誉。
然后,在測(cè)試腳本中通過(guò) data provider 去 CSV 文件中讀取一行數(shù)據(jù)父晶,賦值給相應(yīng)的變量哮缺,執(zhí)行測(cè)試用例。接著再去 CSV 文件中讀取下一行數(shù)據(jù)甲喝,讀取完所有的數(shù)據(jù)后蝴蜓,測(cè)試結(jié)束。CSV 文件中有幾行數(shù)據(jù)俺猿,測(cè)試用例就會(huì)被執(zhí)行幾次。

優(yōu)點(diǎn)
1格仲、數(shù)據(jù)驅(qū)動(dòng)很好地解決了大量重復(fù)腳本的問(wèn)題押袍,實(shí)現(xiàn)了“測(cè)試腳本和數(shù)據(jù)的解耦”。

2凯肋、數(shù)據(jù)驅(qū)動(dòng)測(cè)試的數(shù)據(jù)文件中不僅可以包含測(cè)試輸入數(shù)據(jù)谊惭,還可以包含測(cè)試驗(yàn)證結(jié)果數(shù)據(jù),甚至可以包含測(cè)試邏輯分支的控制變量。

3圈盔、數(shù)據(jù)驅(qū)動(dòng)測(cè)試的思想不僅適用于 GUI 測(cè)試豹芯,還可以用于 API 測(cè)試、接口測(cè)試驱敲、單元測(cè)試等铁蹈。

頁(yè)面對(duì)象(Page Object)模型

利用模塊化思想,把一些通用的操作集合打包成一個(gè)個(gè)名字有意義的函數(shù)众眨,然后 GUI 自動(dòng)化腳本直接去調(diào)用這些操作函數(shù)來(lái)構(gòu)成整個(gè)測(cè)試用例握牧,這樣 GUI 自動(dòng)化測(cè)試腳本就從原本的“流水賬”過(guò)渡到了“可重用腳本片段”。

優(yōu)點(diǎn)
1娩梨、解決了腳本可讀性差的問(wèn)題沿腰,腳本的邏輯層次也更清晰了;
2狈定、解決了通用步驟會(huì)在大量測(cè)試腳本中重復(fù)出現(xiàn)的問(wèn)題
操作函數(shù)可以被多個(gè)測(cè)試用例共享颂龙,當(dāng)某個(gè)步驟的操作或者界面控件發(fā)生變化時(shí),只要一次性修改相關(guān)的操作函數(shù)就可以了纽什,而不需要去每個(gè)測(cè)試用例中逐個(gè)修改措嵌。

頁(yè)面對(duì)象模型的核心理念是,以頁(yè)面為單位來(lái)封裝頁(yè)面上的控件以及控件的部分操作稿湿。而測(cè)試用例使用頁(yè)面對(duì)象來(lái)完成具體的界面操作铅匹。



如何把控操作函數(shù)的粒度?

一個(gè)操作函數(shù)到底應(yīng)該包含多少操作步驟才是最合適的饺藤,在很大程度上取決于項(xiàng)目的實(shí)際情況包斑,以及測(cè)試用例步驟的設(shè)計(jì),并沒(méi)有一個(gè)放之四海而皆準(zhǔn)的絕對(duì)標(biāo)準(zhǔn)涕俗。

1罗丰、如果粒度太大,就會(huì)降低操作函數(shù)的可重用性再姑。
極端的例子:百度搜索的案例萌抵,把“登錄”“搜索”“登出”的操作作為一個(gè)操作函數(shù)。
2元镀、如果粒度太小绍填,也就失去了操作函數(shù)封裝的意義。
極端的例子:把每一個(gè)步驟都作為一個(gè)操作函數(shù)栖疑。
3讨永、更糟糕的是,在企業(yè)實(shí)際自動(dòng)化測(cè)試開(kāi)發(fā)中遇革,每個(gè)測(cè)試工程師對(duì)操作函數(shù)的粒度理解也不完全相同卿闹,很有可能出現(xiàn)同一個(gè)項(xiàng)目中腳本粒度差異過(guò)大揭糕,以及某些操作函數(shù)的可重用性低的問(wèn)題。

但是锻霎,腳本粒度的控制還是有設(shè)計(jì)依據(jù)可以遵循的著角,即往往以完成一個(gè)業(yè)務(wù)流程(business flow)為主線,抽象出其中的“高內(nèi)聚低耦合”的操作步驟集合旋恼,操作函數(shù)就由這些操作步驟集合構(gòu)成吏口。

比如,對(duì)于“用戶注冊(cè)”這個(gè)業(yè)務(wù)流程蚌铜,其中的“信用卡綁定”操作就會(huì)涉及多個(gè)操作步驟锨侯,而這些操作在邏輯上又是相對(duì)獨(dú)立的,所以就可以包裝成一個(gè)操作函數(shù)冬殃。也就是說(shuō)囚痴,業(yè)務(wù)流程會(huì)依次調(diào)用各個(gè)操作函數(shù),來(lái)完成具體的業(yè)務(wù)操作审葬。

如何銜接兩個(gè)操作函數(shù)之間的頁(yè)面深滚?

完成一個(gè)業(yè)務(wù)流程操作,往往會(huì)需要依次調(diào)用多個(gè)操作函數(shù)涣觉,但是操作函數(shù)和操作函數(shù)之間會(huì)有頁(yè)面銜接的問(wèn)題痴荐,即前序操作函數(shù)完成后的最后一個(gè)頁(yè)面,必須是后續(xù)操作函數(shù)的第一個(gè)頁(yè)面官册。

如果連續(xù)的兩個(gè)操作函數(shù)之間無(wú)法用頁(yè)面銜接生兆,那就需要在兩個(gè)操作函數(shù)之間加入額外的頁(yè)面跳轉(zhuǎn)代碼,或者是在操作函數(shù)內(nèi)部加入特定的頁(yè)面跳轉(zhuǎn)代碼膝宁。

業(yè)務(wù)流程(Business Flow)抽象

業(yè)務(wù)流程抽象是鸦难,基于操作函數(shù)的更接近于實(shí)際業(yè)務(wù)的更高層次的抽象方式。
基于業(yè)務(wù)流程抽象實(shí)現(xiàn)的測(cè)試用例往往靈活性會(huì)非常好员淫,可以很方便地組裝出各種測(cè)試用例合蔽。

案例:已注冊(cè)的用戶登錄電商平臺(tái)購(gòu)買指定的書(shū)籍
業(yè)務(wù)流程: 依次是完成用戶登錄、完成書(shū)籍查詢介返、完成書(shū)籍購(gòu)買拴事、完成用戶登出

這 4 個(gè)業(yè)務(wù)流程都可以作為獨(dú)立的類進(jìn)行封裝,可以被很方便的重用并靈活組合圣蝎,類的內(nèi)部實(shí)現(xiàn)通常是調(diào)用操作函數(shù)刃宵。而操作函數(shù)內(nèi)部,則是基于頁(yè)面對(duì)象模型完成具體的頁(yè)面控件操作徘公。

對(duì)于每一個(gè)業(yè)務(wù)流程類组去,都會(huì)有相應(yīng)的業(yè)務(wù)流程輸入?yún)?shù)類與之一一對(duì)應(yīng)。
具體的步驟通常有這么幾步:
1步淹、初始化一個(gè)業(yè)務(wù)流程輸入?yún)?shù)類的實(shí)例从隆;
2、給這個(gè)實(shí)例賦值缭裆;
3键闺、用這個(gè)輸入?yún)?shù)實(shí)例來(lái)初始化業(yè)務(wù)流程類的實(shí)例;
4澈驼、執(zhí)行這個(gè)業(yè)務(wù)流程實(shí)例辛燥。

執(zhí)行業(yè)務(wù)流程實(shí)例的過(guò)程,其實(shí)就是調(diào)用操作函數(shù)來(lái)完成具體的頁(yè)面對(duì)象操作的過(guò)程缝其。

優(yōu)點(diǎn)
1挎塌、業(yè)務(wù)流程的封裝更接近實(shí)際業(yè)務(wù);
2内边、基于業(yè)務(wù)流程的測(cè)試用例非常標(biāo)準(zhǔn)化榴都,遵循“參數(shù)準(zhǔn)備”、“實(shí)例化 Flow”和“執(zhí)行 Flow”這三個(gè)大步驟漠其,非常適用于測(cè)試代碼的自動(dòng)生成嘴高;
3、由于更接近實(shí)際業(yè)務(wù)和屎,所以可以很方便地和 BDD 結(jié)合拴驮。
BDD 就是 Behavior Driven Development,即行為驅(qū)動(dòng)開(kāi)發(fā)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柴信,一起剝皮案震驚了整個(gè)濱河市套啤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌随常,老刑警劉巖潜沦,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異线罕,居然都是意外死亡止潮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)钞楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喇闸,“玉大人,你說(shuō)我怎么就攤上這事询件∪颊В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵宛琅,是天一觀的道長(zhǎng)刻蟹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嘿辟,這世上最難降的妖魔是什么舆瘪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任片效,我火速辦了婚禮,結(jié)果婚禮上英古,老公的妹妹穿的比我還像新娘淀衣。我一直安慰自己,他們只是感情好召调,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布膨桥。 她就那樣靜靜地躺著,像睡著了一般唠叛。 火紅的嫁衣襯著肌膚如雪只嚣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天艺沼,我揣著相機(jī)與錄音册舞,去河邊找鬼。 笑死澳厢,一個(gè)胖子當(dāng)著我的面吹牛环础,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剩拢,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼线得,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了徐伐?” 一聲冷哼從身側(cè)響起贯钩,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎办素,沒(méi)想到半個(gè)月后角雷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡性穿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年勺三,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片需曾。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吗坚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呆万,到底是詐尸還是另有隱情商源,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布谋减,位于F島的核電站牡彻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏出爹。R本人自食惡果不足惜庄吼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一缎除、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧总寻,春花似錦伴找、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抖誉。三九已至殊轴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袒炉,已是汗流浹背旁理。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留我磁,地道東北人孽文。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像夺艰,于是被迫代替她去往敵國(guó)和親芋哭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容