unittest框架數據驅動


一、目錄

  數據驅動概述
  環境准備
  使用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

思路:

  1. 先獲取excle文件的路徑和文件名
  2. 獲取表名
  3. 根據表的列和行讀取數據

測試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獲取數據 - 處理數據格式

准備:數據庫相關准備和操作

環境准備

  1. 下載mysql安裝包
  2. 設置用戶名密碼(user:root  passwd:1234)
  3. 安裝mysql for python插件
    •   將下載好文件放在pip下
    •   在cmd下切換至pip所在目錄下
    •   執行pip install mysql***.whl
    •   安裝完成后進入python,輸入import MySQLdb
    •   不報錯即為安裝成功

數據庫操作

 

                更改數據庫host

                          數據庫創建和表數據插入

                            操作數據庫

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

                            關聯對應數據表

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

                                                        獲取數據處理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM