1. 程式人生 > >自動化框架-數據驅動

自動化框架-數據驅動

trie 調用 文件的 tca img port rdquo 賬號密碼 pan

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單元測試框架實現參數化

自動化框架-數據驅動