一、目錄
數據驅動概述
環境准備
使用unittest和ddt驅動
使用數據文件驅動
使用Excel驅動
使用XML驅動
使用MySQL驅動
二、數據驅動概述
數據驅動的定義:
- 相同的測試腳本使用不同的測試數據來執行
- 測試數據和測試行為完全分離
- 是一種測試腳本設計模式
實施數據驅動測試步驟:
- 編寫測試腳本,腳本需要支持從程序對象、文件或數據庫讀入測試數據。
- 將測試腳本使用測試數據存入程序對象、文件或數據庫等外部介質中。
- 運行腳本過程中,循環調用存儲在外部介質中的測試數據。
- 驗證所有的測試結果是否符合預期結果。
安裝:
在線安裝

離線安裝
下載安裝包:https://pypi.python.org/pypi/ddt
在CMD中切換至解壓后目錄,執行python setup.py install
數據驅動使用說明:
- 頭部導入ddt模塊(import ddt)
- 在測試類前聲明使用ddt(@ddt.ddt)
- 在測試方法前使用@ddt.data()添加測試數據
- 多組測試數據以逗號隔開如@ddt.data(1,2,3)
- 每組數據中的數據與測試方法中定義的形參個數及順序一一對應
- 使用@ddt.unpack進行修飾
- 測試過程中將測試數據傳給測試方法中的形參。
實例:
import ddt import unittest @ddt.ddt class DoubanTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass @ddt.data([1,2,3,6],[2,3,4,9],[3,4,5,12]) # @ddt.data([1,2,3,6]) @ddt.unpack def test_add(self,testdata1,testdata2,testdate3,exceptdata): sum=0 sum=testdata1+testdata2+testdate3 self.assertEqual(sum,exceptdata) if __name__ =='__main__': unittest.main()
二、數據文件驅動
語法:@ddt.file_data('data.json') 走data.json文件中獲取數據
實例:
data.json
‘“data.json”’ [ "QQ||QQ_百度搜索", "微信||微信_百度搜索", "釘釘||釘釘_百度搜索" ]
run_test.py
import ddt,time import unittest from selenium import webdriver @ddt.ddt class Douban(unittest.TestCase): @classmethod def setUpClass(self): self.driver = webdriver.Chrome() @classmethod def tearDownClass(self): self.driver.quit() def setUp(self): self.driver.get('http://www.baidu.com') def tearDown(self): pass @ddt.file_data('data.json') @ddt.unpack def test_baidu(self,value): can,yu = value.split('||') print(can,yu) time.sleep(2) self.driver.find_element_by_id('kw').send_keys(can) time.sleep(2) self.driver.find_element_by_id('su').click() time.sleep(2) self.assertEqual(self.driver.title,yu) if __name__ == '__main__': unittest.main()
三、Excel驅動
安裝:pip install openpyxl
思路:
- 先獲取excle文件的路徑和文件名
- 獲取表名
- 根據表的列和行讀取數據
測試Excel文件


Excel_test.py
from openpyxl import load_workbook class ParseExcel(): def __init__(self, excelPath, sheetName): self.wb = load_workbook(excelPath) self.sheet = self.wb.get_sheet_by_name(sheetName) self.maxRowNum = self.sheet.max_row def getDatasFromSheet(self): dataList = [] for line in self.sheet.rows[1:]: tmpList=[] tmpList.append(line[0].value) tmpList.append(line[1].value) dataList.append(tmpList) # print(line) return dataList if __name__ == '__main__': excelPath='E:/data/測試數據.xlsx' sheetName = '數據' pe = ParseExcel(excelPath,sheetName) for i in pe.getDatasFromSheet(): print(i[0]) print(i[1])
DataDiver.py
from selenium import webdriver from Excal_data.Excal_text import ParseExcel import unittest,time,logging,traceback,ddt #初始化日志對象 logging.basicConfig( #此處省略 ) excelPath = 'E:/data/測試數據.xlsx' sheetName = '數據' excel = ParseExcel(excelPath,sheetName) @ddt.ddt class TestDemo(unittest.TestCase): # def setUp(self): # self.driver = webdriver.Firefox() # # def tearDown(self): # self.driver.quit() @ddt.data( * excel.getDatasFromSheet()) def test_dataDrivenByFile(self,data): testData,expectData = tuple(data) print(testData,expectData) # 打印獲取的兩個數據 # 根據上面的獲得數據建立下面邏輯
四、XML驅動
安裝:Python自帶不用安裝
TestData.XML
<?xml version='1.0' encoding='utf-8'?> <bookList type='technology'> <book> <name>釘釘</name> <author>阿里</author> </book> <book> <name>微信</name> <author>騰訊</author> </book> </bookList>
XmlUtil.py
from xml.etree import ElementTree class ParseXML(): def __init__(self, xmlPath): self.xmlPath = xmlPath def getRoot(self): tree = ElementTree.parse(self.xmlPath) return tree.getroot() def findNodeByName(self, parentNode, nodeName): nodes = parentNode.findall(nodeName) return nodes def getNodeOfChildText(self, node): childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]} # childrenTextDict={} # for i in list(node.iter())[1:]: # childrenTextDict[i.tag] = i.text return childrenTextDict def getDataFromXml(self): root = self.getRoot() books = self.findNodeByName(root, "book") dataList = [] for book in books: childrenText = self.getNodeOfChildText(book) dataList.append(childrenText) return dataList if __name__ == '__main__': xml = ParseXML("./TestData.xml") datas = xml.getDataFromXml() for i in datas: print(i["name"])
XmlDriver.py
from selenium import webdriver from XML_data.XmlUtil import ParseXML from selenium.common.exceptions import NoSuchElementException import unittest,time,os,logging,traceback,ddt #初始化日志對象 logging.basicConfig( #此處省略 ) currentPath = os.path.dirname(os.path.abspath(__file__)) dataFilePath = os.path.join(currentPath,"TestData.xml") xml = ParseXML(dataFilePath) @ddt.ddt class TestDemo(unittest.TestCase): # def setUp(self): # self.driver = webdriver.Firefox() # # def tearDown(self): # self.driver.quit() @ddt.data( * xml.getDataFromXml()) def test_dataDrivenByXML(self,data): testData,expectData = data["name"],data["author"] print(testData,expectData) # self.driver.get("http://www.baidu.com/") # time.sleep(3) # # 根據上面的獲得數據建立下面邏輯
五、MySQL驅動
思路:連接數據庫 - 根據數據庫的表獲取數據 - unittest框架ddt獲取數據 - 處理數據格式
准備:數據庫相關准備和操作
環境准備
- 下載mysql安裝包
- 設置用戶名密碼(user:root passwd:1234)
- 安裝mysql for python插件
-
- 將下載好文件放在pip下
- 在cmd下切換至pip所在目錄下
- 執行pip install mysql***.whl
- 安裝完成后進入python,輸入import MySQLdb
- 不報錯即為安裝成功
數據庫操作


更改數據庫host

數據庫創建和表數據插入

操作數據庫

初始數據庫變量,並啟動對應方法

關聯對應數據表




建立unittest框架驅動數據並處理




獲取數據處理

