介面測試數據引發的介面測試程式碼改進(之一)
- 2019 年 12 月 12 日
- 筆記
顧翔老師開發的bugreport2script開源了,希望大家多提建議。文件在https://github.com/xianggu625/bug2testscript,
主文件是:zentao.py 。bugreport是禪道,script是python3+selenium 3,按照規則在禪道上書寫的bugreport可由zentao.py程式生成py測試腳本。
第一階段:原始階段
介面測試在DevOps推廣之中的地位得到了顯著的提高,對於介面測試相對於GUI自動化測試、基於單元測試的自動化測試脫穎而出,以前測試金字塔模型(圖一)逐漸被紡錘模型所取代。

圖一 金字塔模型

圖二 紡錘模型
當然JMeter、Postman也可以進行介面測試,但是它由於程式碼不可復用,越來越被類似於基於requests類Python程式碼取代了。基於requests類Python程式碼使介面測試變得非常的簡單,我們只要組合get或者post參數,通過requests類的post或者get方法調用返回數據就可以實現,下面的程式碼展示了一個網站的登錄功能的最原始介面測試程式碼。

在這裡分別驗證了錯誤用戶名,正確密碼、正確用戶名,錯誤密碼、錯誤用戶名,錯誤密碼、正確用戶名,正確密碼四種情況。
第二階段:CSRF Token防護階段
為了防止CSRF的攻擊,現在幾乎所有的網站在POST請求的時候都加上了csrftoken,系統通過post參數中的一個hidden元素獲取一個隨機的由100個字元組成的串,在發送的時候與某個cookie值進行比較,如果二者相同,則進入下面的操作,否則這給出403異常頁面。為了對這類產品進行介面測試,可以閱讀源程式碼獲得hidden元素名,通過抓包獲得cookie名,然後通過post的cookie選項將hidden元素名對應的值和cookie名對應的值保持一致,即可實現。

在這裡,僅展示輸入正確的用戶名和正確的密碼用例。通過語句payload={"username":self.correctusername,"password":self.correctpassword,"csrfmiddlewaretoken":self.token}設置hidden參數的值為self.token,通過data = requests.post(self.url,data=payload,cookies=self.cookie)(其中self.cookie在setUp中設置為self.cookie = {"csrftoken":self.token})也設置為self.token值。
第三階段:利用Excel封裝數據,基於數據驅動的自動化測試。
數據驅動是自動化測試的主流,在剛才的程式碼中測試數據是與測試程式碼在一起的,在這裡我們通過excel表來維護數據,從而得到測試數據與測試程式碼的分離。建立一個excel表,內容如圖三所示。

圖三 用Excel管理的數據
在這裡cindy/123456是資料庫中存在的,而jerry/654321是資料庫中不存在的。建立Util.py文件把對Excel表的操作封裝在裡面。程式碼如下。

測試程式碼變為。

調用get_user_data()方法以此得到測試數據,下面的測試實現同第二階段。
第四階段:通過測試數據優化測試程式碼。
(這部分是本文的關鍵),先來看一下圖四。

圖四 關於登錄操作測試腳本的測試數據問題
- 這裡講的是介面測試,其實在GUI測試下同樣適用。來看一下用戶登錄操作測試腳本失敗,可能由兩個以下原因:
- 產品程式碼有問題:直接報bug;
測試數據的問題:比如測試錯誤用戶名,錯誤密碼的時候,比如做ET的時候通過手工的方式已經有了這個用戶名和錯誤密碼的用戶,再比如正確錯誤用戶名,正確密碼的時候,比如做ET的時候通過手工的方式已經將這條記錄刪除。
我們現在考慮測試數據的問題,首先會考慮是否可以講註冊與登錄一起測試,即先測試註冊介面,然後用註冊的資訊進行登錄,註冊完畢直接刪除資料庫。這又產生兩個問題:
- 測試腳本是否有許可權操作資料庫?(在目前企業在測試環境下是允許的。)
- 在微服務情況下,註冊與登錄分別作為單獨一個services下如何實現。
然後還可以考慮一種方法,在登錄的時候進行檢查,測試一個正常測試登錄的測試數據,在登錄之前先到資料庫中檢查,如果這個用戶數據不存在,通過測試腳本把這條數據寫入資料庫中(寫入之後給出日誌資訊,便於後續數據維護),然後在進行測試驗證;測試一個異常登錄的測試數據,在登錄之前也先到資料庫中檢查,如果這個用戶數據存在,則將資料庫中數據刪除(同樣刪除之後也要給出日誌資訊)(後續介紹的方法就是這種方法的實現)。也有一些大型企業通過數據管理服務來實現,如果獲取的數據不符合測試業務,認為這是一條臟數據,從測試數據文件中刪除然後取下一條。當然這種情況不會用Excel,XML文件來維護數據,而是通過測試數據資料庫來為維護。另外會啟動一個Jenkins Job。定時從測試資料庫中獲取數據個數,當數量小於某個閾值的時候自動生成批量的測試數據。現在來看下如何實現前一種方法。
在Util類中建立check_user_existence(self,username,password,tag)方法,用來檢查當前產品資料庫中是否存在這個用戶,然後通過tag(tag=0表示測試一個異常登錄,tag=1表示測試一個正常測試登錄)做相應的措施。

為了便於後續的維護,封裝了資料庫操作和md5加密。


測試程式碼最後為。

星雲測試
http://www.teststars.cc
奇林軟體
http://www.kylinpet.com
聯合通測
http://www.quicktesting.net