自動化框架-數據驅動
https://www.cnblogs.com/fnng/p/6111516.html
最近在整理接口測試相關的資料,所以,看到有關資料就會多看兩眼。偶看到別人發的微信公眾號。
Python接口測試框第一篇 --- python如何讀取txt文件。
Python接口測試框第三篇 --- python如何讀取XML文件。
Python接口測試框第四篇 --- python如何讀取CSV文件。
曾幾何時,也許某大牛說,搞自動化必須要把測試數據放文件裏,然後通過程序讀取文件。於是,大家紛紛效仿。
什麽?你做自動化測試居然不讀取測試數據文件,一看就是新手,沒逼格。
小王啊!我們這個自動化框架一定得做數據與代碼分離,得讀取文件啊!
在這個全民微信的年代,各位大牛開了公從號,傳授大家自動化測試技術,教點啥呢?那我們就從讀取數據文件開始起吧!
什麽是數據驅動?
從它的本意來解釋,就是數據的改變從而驅動自動化測試的執行,最終引起測試結果的改變。說人話,其實就是參數化。
數據驅動有什麽用?
對開發來說說,數據驅動無處不在,寫好了一個模塊,傳個參數調用一下,看結果是不是等於預期。
def add(a,b): return a + b if __name__ == ‘__main__‘: result = add(3, 5) assert result == 8
對測試有來說就可厲害了,你知道早期的自動化測試(工具)都是流水式,第一步打開瀏覽器,第二步輸入“abc”,第三步點擊按鈕。假如我有一個登錄,登錄的步驟完全一樣,就是每次登錄時用的賬號密碼不一樣。用數據驅動啊!
# 偽代碼 def login(username, password): driver.find_element_by_id("idInput").send_keys(username) driver.find_element_by_id("pwdInput").send_keys(password) driver.find_element_by_id("loginBtn").click() if __name__ == ‘__main__‘: login("zhangsan","123") #... login("lisi","456")
看!是不是很厲害了我的數據驅動。我傳zhangsan,程序就會用zhangsan登錄,我傳lisi,就會用lisi登錄。
數據驅動的本質就是“測試數據”與“執行代碼”做分離。至於,“測試數據”放哪兒都可以,
定義成變量:
username = "zhangsan"
password = "123"
或放到數組裏
users =["zhangsan","123"]
或放到字典:
users = {"zhangsan":"123"}
或放到txt文件裏,XML文件裏,CSV文件裏,再讀取過出來,調用登錄方法時使用,這其實都是可以的。
但是,我們要做的是自動化測試,要分用例的,一種情況一條用例。
--------------------------------------------------------------------
用例1,用戶名密碼為空。
用例2,用戶名為空。
用例3,密碼為空。
用例4,用戶名密碼正確。
----------------------------------------------------------
相信身為軟件測試人員的你,對這個用例沒有意見吧?
這裏以你們喜聞樂見的讀取csv文件為例。
讀取數據文件,並得到相應的數據,把這些數據用到具體的某個用例當中。
from selenium import webdriver import unittest import csv # 讀取本地 CSV 文件 data = csv.reader(open(‘login_test.csv‘, ‘r‘)) # 讀取整個文件的數據放到users數組 users = [] for i in data: user = [] for j in i: user.append(j) users.append(user) class loginTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get("http://xxx.login.page") # 封裝用戶登錄 def user_login(self, username, password): self.driver.find_element_by_id("idInput").send_keys(username) self.driver.find_element_by_id("pwdInput").send_keys(password) self.driver.find_element_by_id("loginBtn").click() def test_login1(self): ‘‘‘用戶名、密碼為空登錄‘‘‘ i = 0 for user in users: print(user[0]) if user[0] == ‘user_pawd_null‘: print(i) username = users[i][1] password = users[i][2]
break; else: i +=1 self.user_login(username, password) def test_login2(self): ‘‘‘用戶名正確,密碼為空‘‘‘ username = users[1][1] password = users[1][2] self.user_login(username, password) def test_login3(self): ‘‘‘用戶名為空,密碼正確‘‘‘ username = users[2][1] password = users[2][2] self.user_login(username, password) def test_login4(self): ‘‘‘用戶名密碼正確 ‘‘‘ username = users[3][1] password = users[3][2] self.user_login(username, password) if __name__ == ‘__main__‘: unittest.main()
來看看你都幹了什麽高大上的事兒。
1、創建了一CSV文件,然後把登錄用的測試數據寫到了文件了。 --->創建了一個專門存放數據的文件,這多有逼格,自我感覺良好。
2、讀取CSV文件,並且通過for循環,把所有數據組裝成一個二維數組,並放users數組中。--->這沒什麽呀,只是多寫了個for循環而已,繼續自我感覺良好。
3、test_login1用例,為用戶名密碼都為空的用例,判斷users數組中某一行的第一列是否為“user_pawd_null”,是的話,說明這一行就是我想要的。取這一行的第二、第三列的測試數據,進行登錄測試。 --->這個取數據的方式有點。。。有點麻煩!
4、沒關系!沒關系!麻煩的話,我們看test_login2 ,用users[1][1]和users[1][2]也能取到CSV表第二行的數據。 ---->這不就不那麽麻煩了!嗯,是不那麽麻煩了,不過,有點傻逼。你確定你清楚的知道users[1][1]和users[1][2] 代表的啥?別急!別急!我打開CSV文件看看第2行對應是什麽數據。
這就是你玩的高大上的“數據驅動”,再下實在是佩服佩服!什麽你還有更高大上,簡潔的玩法?真心請賜教。。。。
為什麽不按照下面的方式寫用例?
from selenium import webdriver import unittest class loginTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get("http://xxx.login.page") # 封裝用戶登錄 def user_login(self, username, password): self.driver.find_element_by_id("idInput").send_keys(username) self.driver.find_element_by_id("pwdInput").send_keys(password) self.driver.find_element_by_id("loginBtn").click() def test_login1(self): ‘‘‘用戶名、密碼為空登錄‘‘‘ self.user_login("", "") def test_login2(self): ‘‘‘用戶名正確,密碼為空‘‘‘ self.user_login("", "123") def test_login3(self): ‘‘‘用戶名為空,密碼正確‘‘‘ self.user_login("zhangsan", "") def test_login4(self): ‘‘‘用戶名密碼正確 ‘‘‘ self.user_login("zhangsan", "123") if __name__ == ‘__main__‘: unittest.main()
我相信,正常人一定看出來了這比上面讀CSV文件簡單多了。可是,用讀取數據文件的話,不懂代碼也能寫用例!你是在自我YY這種需求吧??不懂自動化測試的同學差點就信了!
“都已經開始寫代碼做自動化的你告訴我,不想懂開發,你確定這不是任性?”
我在CSV文件中改測試數和在代碼中改測試數據有什麽區別? 在代碼中改測試數據,我是知道對應哪個用例的,在CSV文件中改你確定一下子就知道對應的哪個用例?
那什麽情況下才要用到讀取測試數據文件呢?
關於自動化測試的誤區(二)
已經說明了自己的觀點。這裏就不再重復,總之,用到要讀取文件的情況並不多。不管是UI自動化測試,還是接口自動化測試。
我們還可以借助單元測試框架的功能進行參數化:
unittest單元測試框架實現參數化
自動化框架-數據驅動