我曾經寫過一篇博客《自動化測試---被玩壞的數據驅動》討論過數據驅動測試,當時主要是吐槽那些教大家讀取txt、csv/excel、xml文件文章。“我教大家如何做數據驅動測試,來!我們先學習如何讀取excel文件。。。”,然后,網上也有大量的文章來介紹如何用excel來管理測試數據的,甚至是測試報告展示的。
讀各種數據文件就是驅動測試?這樣真的方便做測試么?
#### 什么是數據驅動測試?
從它的定義來看,就是數據的改變從而驅動自動化測試的執行,最終引起測試結果的改變。說的直白些,就是參數化的應用。
#### “他們”認為數據驅動什么樣子?
這里以csv文件為例,大多文章也是選用的csv/excel文件。

參數、斷言、結果都有了,大概就這樣子吧?
接下來需要將數據讀取出來。
# coding=utf-8
import csv
import codecs
from itertools import islice
# 讀取本地 CSV 文件
data = csv.reader(codecs.open('user_info.csv', 'r', 'utf_8_sig'))
# 用戶存放用戶數據
users = []
# 循環輸出每一行信息
for line in islice(data, 1, None):
users.append(line)
# 打印
print(users)
得到結果:
[['', '123', '請輸入帳號', ''],
['user', '', '請輸入密碼', ''],
['error', 'error', '帳號或密碼錯誤',''],
['admin', 'admin123', 'admin你好', ''],
['guest', 'guest123', 'guest你好', '']]
這里得到一個測試數據的二維數組。
那么接下來要用這些數據做自動化測試了?被測試功能如下:

測試代碼如下:
# 測試登陸功能
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
for user in users:
driver.get("http://127.0.0.1:8000/")
driver.find_element_by_id("inputUsername").send_keys(user[0])
driver.find_element_by_id("inputPassword").send_keys(user[1])
driver.find_element_by_id("Login").click()
sleep(2)
tips = driver.find_element_by_id("tips").text
print(tips)
print(user[2])
try:
assert tips == user[2]
except AssertionError as msg:
print(msg)
user[3] = "Faile"
else:
user[3] = "Pass"
driver.quit()
# 打印結果
print(users)
運行之后的測試結果:
[['', '123', '請輸入帳號', 'Pass'],
['user', '', '請輸入密碼', 'Pass'],
['error', 'error', '帳號或密碼錯誤','Pass'],
['admin', 'admin123', 'admin你好', 'Faile'],
['guest', 'guest123', 'guest你好', 'Faile']]
看,結果已經寫到最后一列了。
最后,我們還需要將測試結果寫回到csv文件中。
# 讀取本地 CSV 文件
csv_file = csv.writer(codecs.open('user_info.csv', 'w','utf_8_sig'),
dialect="excel")
# 寫入標題
csv_file.writerow(['用戶名','密碼','斷言','結果'])
# 循環寫入數據
for user in users:
csv_file.writerow(user)
# 打印
print(users)
打開CSV文件,結果如下:

看結果一列,是不是已經有了結果。
#### 那么,下來思考幾個問題。
1、測試結果是否太過簡單了,只有“Pass”和“Faile”,沒有任何失敗的日志,是否需要另起一列記錄失敗日志?
2、如何統計出總失敗的用例數和成功的用例數?
3、如果想單獨驗證失敗的兩條用例應該怎么做?例如上圖中的最后兩條失敗的用例。
4、上面的測試代碼中,有多少是真正用在測試操作的,至少一半都在讀寫csv文件,是否需要做封裝,想想怎么封裝更簡單?
5、在獲取具體讀取數據的時候,我們使用的是user[0]、user[1]、user[2],你真的容易分辨這些數據么?如果又加了一列數據呢?不改代碼是不是就對不上號了。
6、這只是一組登錄數據。我們知道不同的功能,所需要的數據是不一樣的,比如搜索,只需要“搜索關鍵字”, 例如注冊,需要“郵箱”、“密碼”、“重復密碼”、“昵稱”等。我們一個系統有N多功能的好吧!
7、如第6條,這些測試數據要怎么放,放在一個csv文件還是多個文件?怎么統計測試結果?
所以,知道讀取數據文件有多坑了吧!?誰說的方便維護?你一定沒用這種方式寫過真正的項目吧!一直處在跟着別人寫demo階段。如果你有更“高大上”的處理方式歡迎請告訴我,謝謝!
下一篇,我將介紹基於單元測試框架的數據驅動。
