成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Python接口自動化淺析數(shù)據(jù)驅(qū)動原理

Python接口自動化淺析數(shù)據(jù)驅(qū)動原理

熱門標簽:ai電銷機器人源碼 外呼并發(fā)線路 宿遷星美防封電銷卡 西藏房產(chǎn)智能外呼系統(tǒng)要多少錢 百度地圖標注沒有了 長沙高頻外呼系統(tǒng)原理是什么 地圖標注審核表 ai電話機器人哪里好 湛江智能外呼系統(tǒng)廠家

在上一篇Python接口自動化測試系列文章:Python接口自動化淺析登錄接口測試實戰(zhàn),主要介紹接口概念、接口用例設(shè)計及登錄接口測試實戰(zhàn)。

以下主要介紹使用openpyxl模塊操作excel及結(jié)合ddt實現(xiàn)數(shù)據(jù)驅(qū)動。

在此之前,我們已經(jīng)實現(xiàn)了用unittest框架編寫測試用例,實現(xiàn)了請求接口的封裝,這樣雖然已經(jīng)可以完成接口的自動化測試,但是其復用性并不高。

我們看到每個方法(測試用例)的代碼幾乎是一模一樣的,試想一下,在我們的測試場景中,

一個登錄接口有可能會有十幾條到幾十條測試用例,如果每組數(shù)據(jù)都編寫一個方法,

這樣將會有更多的重復項代碼,不僅執(zhí)行效率不高,也不好維護。

接下來將會對框架進行優(yōu)化,采用數(shù)據(jù)驅(qū)動方式:

  • 把測試數(shù)據(jù)用excel表格管理起來,代碼做封裝;
  • 用ddt來驅(qū)動測試,兩部分相互獨立。

一、openpyxl模塊

openpyxl模塊介紹

openpyxl是python第三方模塊,運用openpyxl庫可以進行excel的讀和寫。

在了解openpyxl模塊之前,我們需要先熟悉excel的結(jié)構(gòu),才能更好理解openpyxl是如何操作excel。

從外到內(nèi),首先是一個excel文件(名),打開excel之后,會看到底部有一個或多個sheet(工作簿),每個sheet里有很多單元格,總體來說,主要分為三個層級。

在opnepyxl里面,一個Excel文件對應著一個Workbook對象, 一個Sheet對應著一個Worksheet對象,而一個單元格對應著一個Cell對象。了解這些之后,對openpyxl是如何操作excel就比較清楚了。

openpyxl安裝

pip install openpyxl

openpyxl簡單使用

import openpyxl
 
if __name__ == '__main__':
    path = 'F:/case/test_case.xlsx'
    # 讀取excel文件
    workbook = openpyxl.load_workbook(path)
    # 讀取所有sheet
    sheet = workbook.get_sheet_names()
    # 獲取某個sheet
    sheet = workbook[sheet[0]]
    # 獲取某個cell的值
    cell_val = sheet.cell(row=2, column=2).value
    print(cell_val)

以上僅介紹openpyxl常用的語法,有興趣了解更多內(nèi)容可自行百度擴展。

二、Excel用例管理

在項目下,新建一個文件夾:data,文件夾下新建一個cases.xlsx文件,用來存放測試用例。

以下,是一個簡單的登錄測試用例設(shè)計模板:

可以根據(jù)該表格生成實際結(jié)果,并將測試結(jié)果寫入(Pass、Fail)表格。

公眾號后臺回復:接口測試用例模板,可以獲取完整接口測試用例Excle模板。

既然有了用例模板,我們就開始從用openpyxl模塊對excel讀寫數(shù)據(jù)。

如下,在common文件夾下,新建excel_handle.py,用于封裝操作excel的類。

excel_handle.py

import openpyxl
class ExcelHandler:
    def __init__(self, file):
        self.file = file
    def open_excel(self, sheet_name):
        """打開Excel、獲取sheet"""
        wb = openpyxl.load_workbook(self.file)
        # 獲取sheet_name
        sheet = wb[sheet_name]
        return sheet
    def get_header(self, sheet_name):
        """獲取header(表頭)"""
        wb = self.open_excel(sheet_name)
        header = []
        # 遍歷第一行
        for i in wb[1]:
            # 將遍歷出來的表頭字段加入列表
            header.append(i.value)
        return header
    def read_excel(self, sheet_name):
        """讀取所有數(shù)據(jù)"""
        sheet = self.open_excel(sheet_name)
        rows = list(sheet.rows)
        data = []
        # 遍歷從第二行開始的每一行數(shù)據(jù)
        for row in rows[1:]:
            row_data = []
            # 遍歷每一行的每個單元格
            for cell in row:
                row_data.append(cell.value)
                # 通過zip函數(shù)將兩個列表合并成字典
                data_dict = dict(zip(self.get_header(sheet_name),row_data))
            data.append(data_dict)
        return data
    @staticmethod
    def write_excel(file, sheet_name, row, cloumn,data):
        """Excel寫入數(shù)據(jù)"""
        wb = openpyxl.load_workbook(file)
        sheet = wb[sheet_name]
        sheet.cell(row, cloumn).value = data
        wb.save(file)
        wb.close()
if __name__ == "__main__":
    # 以下為測試代碼
    excel = ExcelHandler('../data/cases.xlsx')
    data = excel.read_excel('login')

接下來結(jié)合ddt實現(xiàn)數(shù)據(jù)驅(qū)動,先簡單來介紹下ddt。

三、ddt介紹及使用

ddt介紹

  • 名稱:Data-Driven Tests,數(shù)據(jù)驅(qū)動測試
  • 作用:由外部數(shù)據(jù)集合來驅(qū)動測試用例的執(zhí)行
  • 核心的思想:數(shù)據(jù)和測試代碼分離
  • 應用場景:一組外部數(shù)據(jù)來執(zhí)行相同的操作
  • 優(yōu)點:當測試數(shù)據(jù)發(fā)生大量變化的情況下,測試代碼可以保持不變
  • 實際項目:excel存儲測試數(shù)據(jù),ddt讀取測試數(shù)據(jù)到單元測試框架(測試用例中)

補充:

所謂數(shù)據(jù)驅(qū)動,就是數(shù)據(jù)的改變從而驅(qū)動自動化測試的執(zhí)行,最終引起測試結(jié)果的改變。說的直白些,就是參數(shù)化的應用。

ddt安裝

pip install ddt

ddt使用

要想知道ddt到底怎么使用,我們從ddt模塊源碼中提取出三個重要的函數(shù)ddt、unpack、data。

def ddt(cls):
    """
    Class decorator for subclasses of ``unittest.TestCase``.
    Apply this decorator to the test case class, and then
    decorate test methods with ``@data``.
    For each method decorated with ``@data``, this will effectively create as
    many methods as data items are passed as parameters to ``@data``.
    The names of the test methods follow the pattern
    ``original_test_name_{ordinal}_{data}``. ``ordinal`` is the position of the
    data argument, starting with 1.
    For data we use a string representation of the data value converted into a
    valid python identifier.  If ``data.__name__`` exists, we use that instead.
    For each method decorated with ``@file_data('test_data.json')``, the
    decorator will try to load the test_data.json file located relative
    to the python file containing the method that is decorated. It will,
    for each ``test_name`` key create as many methods in the list of values
    from the ``data`` key.
    """
    for name, func in list(cls.__dict__.items()):
        if hasattr(func, DATA_ATTR):
            for i, v in enumerate(getattr(func, DATA_ATTR)):
                test_name = mk_test_name(name, getattr(v, "__name__", v), i)
                test_data_docstring = _get_test_data_docstring(func, v)
                if hasattr(func, UNPACK_ATTR):
                    if isinstance(v, tuple) or isinstance(v, list):
                        add_test(
                            cls,
                            test_name,
                            test_data_docstring,
                            func,
                            *v
                        )
                    else:
                        # unpack dictionary
                        add_test(
                            cls,
                            test_name,
                            test_data_docstring,
                            func,
                            **v
                        )
                else:
                    add_test(cls, test_name, test_data_docstring, func, v)
            delattr(cls, name)
        elif hasattr(func, FILE_ATTR):
            file_attr = getattr(func, FILE_ATTR)
            process_file_data(cls, name, func, file_attr)
            delattr(cls, name)
    return cls
def unpack(func):
    """
    Method decorator to add unpack feature.
    """
    setattr(func, UNPACK_ATTR, True)
    return func
def data(*values):
    """
    Method decorator to add to your test methods.
    Should be added to methods of instances of ``unittest.TestCase``.
    """
    global index_len
    index_len = len(str(len(values)))
    return idata(values)

ddt:

裝飾類,也就是繼承自TestCase的類。

data:

裝飾測試方法。參數(shù)是一系列的值。

unpack:

傳遞的是復雜的數(shù)據(jù)結(jié)構(gòu)時使用。比如使用元組或者列表,添加unpack之后,ddt會自動把元組或者列表對應到多個參數(shù)上,字典也可以這樣處理;當沒有加unpack時,方法的參數(shù)只能填一個。

知道了具體應用后,簡單來個小例子加深理解。

test_ddt.py

import unittest
import ddt
# 裝飾類
@ddt.ddt
class DdtDemo(unittest.TestCase):
    def setUp(self):
        pass
    def tearDown(self):
        pass
    
    # 裝飾方法
    @ddt.data(("15312344578", "12345678"), ("15387654321", "12345678"))
    @ddt.unpack
    def test_ddt(self, username,password):
        print(username,password)
if __name__ == '__main__':
    unittest.main(verbosity=2)

運行結(jié)果為:

Ran 2 tests in 0.001s
OK
15312344578 12345678
15387654321 12345678

上面的例子是為了加深理解,接下來介紹excel結(jié)合ddt實現(xiàn)數(shù)據(jù)驅(qū)動,優(yōu)化之前的test_login.py模塊。

test_login.py

import unittest
from common.requests_handler import RequestsHandler
from common.excel_handler import ExcelHandler
import ddt
import json
@ddt.ddt
class TestLogin(unittest.TestCase):
    # 讀取excel中的數(shù)據(jù)
    excel = ExcelHandler('../data/cases.xlsx')
    case_data = excel.read_excel('login')
    print(case_data)
    def setUp(self):
        # 請求類實例化
        self.req = RequestsHandler()
    def tearDown(self):
        # 關(guān)閉session管理器
        self.req.close_session()
    @ddt.data(*case_data)
    def test_login_success(self,items):
        # 請求接口
        res = self.req.visit(method=items['method'],url=items['url'],json=json.loads(items['payload']),
                             headers=json.loads(items['headers']))
        try:
            # 斷言:預期結(jié)果與實際結(jié)果對比
            self.assertEqual(res['code'], items['expected_result'])
            result = 'Pass'
        except AssertionError as e:
            result = 'Fail'
            raise e
        finally:
            # 將響應的狀態(tài)碼,寫到excel的第9列,即寫入返回的狀態(tài)碼
            TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 9, res['code'])
            # 如果斷言成功,則在第10行(測試結(jié)果)寫入Pass,否則,寫入Fail
            TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 10, result)
if __name__ == '__main__':
    unittest.main()

整體流程如下圖:

到此這篇關(guān)于Python接口自動化淺析數(shù)據(jù)驅(qū)動原理的文章就介紹到這了,更多相關(guān)Python接口自動化數(shù)據(jù)驅(qū)動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python接口自動化淺析登錄接口測試實戰(zhàn)
  • Python接口自動化淺析unittest單元測試原理
  • python使用pytest接口自動化測試的使用
  • python+requests+pytest接口自動化的實現(xiàn)示例
  • python接口自動化測試數(shù)據(jù)和代碼分離解析

標簽:普洱 盤錦 林芝 海南 漯河 南平 大同 寧夏

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Python接口自動化淺析數(shù)據(jù)驅(qū)動原理》,本文關(guān)鍵詞  Python,接口,自動化,淺析,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python接口自動化淺析數(shù)據(jù)驅(qū)動原理》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python接口自動化淺析數(shù)據(jù)驅(qū)動原理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    久久亚洲国产成人精品性色| 一区二区av| 7777精品伊人久久久大香线蕉最新版| 偷拍精品福利视频导航| 免费一区视频| 你懂的国产精品永久在线| 国产三区二区一区久久| 精品国产一二三四区| 三区视频在线观看| 国产一区啦啦啦在线观看| 国产精品一码二码三码在线| 户外露出一区二区三区| 日韩av最新在线| 蜜臀av一区二区| 东方伊人免费在线观看| 国产三级做爰在线观看| 国产一区三区三区| 成人av电影天堂| 婷婷在线精品视频| 国产女主播一区| 奇米影视亚洲狠狠色| 欧美xxxxx性| 丰满人妻一区二区三区免费视频棣| 国产一区二区三区在线观看视频| 欧美性受xxxx黑人猛交| 美女呻吟一区| 在线日韩第一页| 欧美丰满熟妇bbb久久久| 福利91精品一区二区三区| 日韩中文影院| 免费av网站在线观看| 男人操女人免费网站| 艳妇荡乳欲伦69影片| 亚洲一区二区三区在线视频| 高潮精品一区videoshd| 视频在线这里都是精品| 精品无码久久久久久久| 日本成人在线电影网| 美脚丝袜一区二区三区在线观看| 国产微拍精品一区| 一区二区在线视频| 亚洲免费观看在线| 999视频精品| 懂色aⅴ精品一区二区三区| 丁香六月激情综合| 一区二区成人在线观看| 欧美精品乱人伦久久久久久| 国产欧美精品一区aⅴ影院| 亚洲人成啪啪网站| 久久综合五月| 91中文字幕在线播放| 国产精品视频区1| 国产在线观看中文字幕| 360天大佬第二季在线观看| 日本一道本久久| 91久久久久久国产精品| 午夜不卡影院| 精品成人无码久久久久久| 色婷婷激情综合| 毛片毛片毛片毛片| 久久精品国产屋| 最近2018年中文字幕在线| 日韩不卡视频在线观看| 日本爱爱小视频| 国产精品的网站| 国产精品美女久久久久| 久九九久频精品短视频| 亚洲码国产岛国毛片在线| 成人免费网站入口| 一区三区三区不卡| 清纯唯美亚洲色图| 翔田千里一区二在线观看| 国产露脸91国语对白| 久久久久亚洲av无码麻豆| 99亚洲一区二区| 国产高清久久久久| 成人精品视频一区| www.欧美视频| 色婷婷综合五月| 欧美电影完整版在线观看| 欧美在线制服丝袜| 美女视频第一区二区三区免费观看网站| 亚洲一区二区| 亚洲伦理一区二区三区| 91视频网入口| 可以免费看av的网址| 久久影院午夜片一区| 97色伦图片97综合影院| 成人丝袜视频网| 亚洲无线一线二线三线区别av| 91超碰碰碰碰久久久久久综合| 369你懂的电影天堂| 亚洲伊人伊色伊影伊综合网| 手机在线观看av| 欧美这里只有精品| 日本一区二区免费视频| 亚洲天堂视频在线观看免费| 亚洲国产精品综合久久久| 日本免费新一区视频| 欧美少妇另类| 亚洲在线欧美| 成人精品视频在线播放| 99视频在线看| 91女人视频在线观看| 国产清纯在线一区二区www| 欧美亚洲另类激情另类| 欧美老少做受xxxx高潮| 国产精品一级在线观看| 亚洲xxxx2d动漫1| 国产精品成人一区二区不卡| aa免费在线观看| 欧美激情第一区| 中文字幕日韩精品在线观看| 久久久久久久久亚洲| 日韩精品无码一区二区三区| 特级黄国产片一级视频播放| 亚洲美免无码中文字幕在线| 在线国产1区| 菠萝蜜影院一区二区免费| 国产精品4hu.www| 一本色道久久综合亚洲精品酒店| 在线视频一区二区三区在线播放| 小明成人免费视频一区| 五月天色婷婷综合| 91亚洲精品久久久| 一区二区三区成人| 国产一区二区在线观| 人妻互换免费中文字幕| 日韩欧美不卡在线观看视频| 久久韩剧网电视剧| 爱啪视频在线观看视频免费| 高清精品xnxxcom| 影音先锋5566资源站| 亚洲国产美女搞黄色| 91精品久久久久久久久久久| 欧洲中文在线| 91久久久免费一区二区| 天天干天天草天天| 国产毛片欧美毛片久久久| 国产成人综合亚洲| 91超碰在线播放| 少妇高潮一区二区三区69| 亚洲日本电影| 国产一区二区三区免费播放| 国产精品6699| 国产综合色区在线观看| 免费视频一区二区三区在线观看| 日本免费中文字幕在线| 国产又黄又爽又色| 国产精品精品软件男同| 日本精品一区二区三区四区| 色94色欧美sute亚洲线路二| 一区二区黄色片| 黄视频网站在线观看| 国产麻豆日韩欧美久久| 亚洲图片欧洲图片av| 亚洲精品乱码久久久久久不卡| 人人超在线公开视频| 中文一区一区三区高中清不卡| 国产天堂视频| 老司机免费在线视频| 久久久久久久久久久久久久久久久| 日本高清免费观看| 国产精品麻豆一区二区三区| 久久av秘一区二区三区| 精品亚洲porn| 中文字幕在线观看1| 一级特级黄色片| 西野翔中文久久精品国产| 污视频网站在线免费观看| 91久久精品一区二区三区| 成人在线小视频| 国产精品-区区久久久狼| 成人妇女淫片aaaa视频| 26uuu久久天堂性欧美| 2019年中文字幕| 久久久精品午夜少妇| 欧美最近摘花xxxx摘花| 亚洲美女偷拍久久| 波多野结衣av一区二区全免费观看| 成人av三级| 午夜亚洲福利| 久久久久久成人| 亚洲永久精品视频| 香蕉视频免费网站| 狠狠久久亚洲欧美| 日韩一区中文字幕| 欧美人动与zoxxxx乱| 亚洲一区二区三区四区在线| 欧美一级理论性理论a| 九九热播视频在线精品6| 激情亚洲色图| 欧美一级免费片| 婷婷综合激情| 嫩草国产精品入口| 欧美一区二区三区粗大| 三级在线观看视频| 九色蝌蚪在线观看| 3d成人动漫在线| 欧美色老头old∨ideo| 97精品视频在线观看| 欧美日韩国产一中文字不卡| 国产一级淫片免费| 国产美女精品视频免费播放软件| 毛茸茸free性熟hd| mm1313亚洲国产精品无码试看| 久久精品视频在线观看榴莲视频| 50一60岁老妇女毛片| 91久久精品一区二区别| 精品一区二区三区中文字幕老牛| av手机天堂| 亚洲第一免费看片| 亚洲高潮女人毛茸茸| 国产中文av在线| 亚洲欧美日韩在线不卡| 999精品嫩草久久久久久99| 日韩在线第七页| 最近免费中文字幕在线第一页| jizzjizzjizz美国| 91freevideo| 成人av集中营| 99精品欧美一区二区三区小说| 国产大学生av| www.爱色av.com| 欧美在线综合视频| 国产欧美日韩精品一区| 91精品国产66| 亚洲aⅴ优女av综合久久久| 天堂中文网在线| 精品无人区卡一卡二卡三乱码免费卡| 中文字幕精品综合| 操人视频91| 成人国产精品免费观看视频| 综合久久精品| 欧美www在线观看| 中文字幕av一区 二区| 国产精品一区在线看| 久久久久久久久久看片| 日韩在线观看一区二区三区| 欧美富婆性猛交| 美女啪啪无遮挡| 欧美日韩国产黄| 蜜臀久久精品久久久久| 国产福利91精品一区二区三区| 日本女人性视频| 蜜芽一区二区三区| 国产免费播放一区二区| 风间由美一区二区三区在线观看| 精品免费在线观看| www高清在线视频日韩欧美| 欧美日韩在线视频首页| 91视频免费观看| 亚洲最新色图| 青青草原成人| 欧美天天综合网| 蜜臀91精品国产高清在线观看| 亚洲图片另类小说| japanese在线观看| 久久久久久毛片| 精品久久久噜噜噜噜久久图片| 国产片乱18免费| 九九久久免费视频| 一区二区不卡视频| 看全色黄大色黄大片免责看的| 最好看的2019的中文字幕视频| 亚洲欧洲日本国产| 欧美成人专区| caoporm免费视频在线| 中文字幕一区二区三区四区视频| 国产精品成人aaaa在线| 色av综合在线| 中文字幕av影院| 91精品国产网站| 香蕉成人伊视频在线观看| 蜜臀av一区二区三区有限公司| 欧美孕妇性xxxⅹ精品hd| 国产精品网站免费| 视频一区在线免费观看| 九九视频在线观看| 欧美乱妇40p| 免费91麻豆精品国产自产在线观看| 伊人成综合网yiren22| 手机在线观看你懂的| 欧美a大片欧美片| 无码人妻精品一区二区三区99v| 亚洲精品理论电影| 欧美三级成人观看| 午夜久久久久久久久久一区二区| 日韩一区二区av| 精品一区二区三区蜜桃| 狠狠躁夜夜躁人人爽天天天天97| 欧美男人天堂网| 天堂成人娱乐在线视频免费播放网站| 老色鬼在线视频| 台湾色综合娱乐中文网| 久久综合亚洲色hezyo国产| 国产精品色呦呦| 中文字幕在线永久在线视频2020| 噜噜噜在线观看播放视频| a在线观看视频| 国产精品视频一区二区高潮| 激情综合一区二区三区| 岛国毛片av在线| 欧美大香线蕉线伊人久久国产精品| 玖玖精品在线视频| 国产一级片子| 欧美在线观看黄| 欧美日韩免费区域视频在线观看| 精品一区二区三孕妇视频| 经典三级在线| 国产精品白丝av嫩草影院| 亚洲一区二区三区国产| 精品国产91久久久久久老师| 毛片网站免费| 日韩影院一区二区| 福利电影在线| 四虎成人免费视频| 激情五月亚洲色图| 亚洲麻豆国产自偷在线| 中文成人av在线| 999久久久久| 欧美日韩精品中文字幕一区二区| 91在线视频官网| 国产欧美成人xxx视频| 午夜精品视频在线观看一区二区| 日韩xxxx视频| 视频在线观看免费影院欧美meiju| 国产成人亚洲综合无码|