上篇文章利用關鍵字驅動配合POM演示了一個登錄案例,這篇我們把利用數據驅動制作的測試框架改寫成用關鍵字驅動制作的。首先,請結合以前的講解把數據驅動版測試框架搞清楚。不要怕麻煩,搞清楚后下邊理解起來就方便多了。
和數據驅動版一樣,關鍵字驅動版也涵蓋登錄(EmpLogin)、員工信息(Employee)、工時表(Timesheet)以及網上商城(OnlineStore)這四個模塊。出于篇幅限制,我們只改寫登錄的部分,先回顧一下登錄成功的測試用例:
1. 打開http://cslm-test.com/hrsystem/index.php;
2. 輸入用戶名"1001";
3. 輸入密碼"123";
3. 點擊登錄按鈕(斷言點:home按鈕出現在home.php頁);
4. 退出(斷言點:登錄按鈕出現在index.php頁)。
和數據驅動版一樣,定位項目結構時也需要四個包(部分) - com.testalliance.hrsystem.managers(測試中樞層),com.testalliance.hrsystem.objrepository(object聲明層),com.testalliance.hrsystem.pageobj(業務邏輯層),com.testalliance.hrsystem.test(功能/應用層)。出于一些細節上的變化,負責測試用例的com.testalliance.hrsystem.tests可以不需要,一會兒就明白了。
com.testalliance.hrsystem.objrepository包里需要包含employeePage.properties和loginPage.properties兩個object文件,這點和數據驅動版的一樣,不用修改:
com.testalliance.hrsystem.pageobj有一些變化。原先數據驅動版里是loginPage.java,負責登錄模塊的各種操作,但現在因為系統代碼變化,我們可以直接寫成Page.java,原因一會兒討論:
com.testalliance.hrsystem.managers包里也一樣,還是包含相同的三個java文件 - DriverManager.java,負責driver的聲明;EnvManager.java,負責設置測試環境;TestRunner.java,負責測試框架入口:
com.testalliance.hrsystem.test也需要包含Test.java和Utility.java兩個文件,負責功能/應用處理:
先來改Page.java。不管是哪個模塊,需要的都是那幾個操作,比如輸入、點擊、切換、刷新等等,所以我們直接把這些關鍵字都寫到一起:
從第76行開始就是關鍵字操作。當然,我這里寫得不全,其實操作還有很多,如果大家想到別的可以添在這里。
下一步是設計測試文件。關鍵字驅動與數據驅動的一個顯著不同點就在于測試文件,關鍵字驅動是以操作為主體,并且步驟順序必須與用例一致。那么對于第一個測試用例 - 登錄成功,我們設計的文件應當是這樣的:
創建文件之前再想一下,如果登錄成功是這樣的,那第二個用例 - 員工代號或密碼錯誤導致登錄失敗應該怎么寫?是不是這樣:
你會發現這兩個test case前5步都是一樣的,是一個完整的登錄操作,而且要知道,登錄操作這5步在大多數的測試用例中都會出現,很多功能都要依靠登錄作為第一步,如果每個用例的測試文件都重復前5步顯然太麻煩了,干脆咱們就把這5步都提取出來,單獨放在一個文件里。新建文件夾testdata.functions -> login.xlsx:
把sheet的名稱定位login。我把測試網頁的網址也寫在了文件里,與代碼完全分離開。與輸入、點擊、切換、刷新這種簡單的操作不同,登錄操作屬于系統的功能操作,所以業內又管這些功能操作叫做generic functions,這也是我為什么給這個文件夾起名為testdata.functions。
同樣,退出也是generic function,也經常會在測試用例中重復,所以我們也把它單獨提取出來放到另一個sheet里,:
雖然就1步,但因為重復性高,也單獨放。接下來把sheet的名字寫到測試文件中,替換掉原來的步驟。對于登錄成功用例:
我還加了一個叫Module的新列,先不用管它。對于失敗用例:
而且你還發現有一個叫LoginDetails的sheet,專門可以放多種測試數據。比如登錄失敗有可能是員工代號錯誤,也有可能是密碼錯誤,我們需要準備兩組測試數據:
測試文件到此準備完畢,下篇我們修改測試步驟的執行過程。再強調一遍,如果是個generic function,而且重復的可能性高,你可以給它單獨放到一個文件里,會省去很多麻煩。