国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

接口自動化測試系列-yml管理測試用例

這篇具有很好參考價值的文章主要介紹了接口自動化測試系列-yml管理測試用例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

項(xiàng)目源碼

目錄結(jié)構(gòu)及項(xiàng)目介紹

整體目錄結(jié)構(gòu),目錄說明參考
接口自動化測試系列-yml管理測試用例,接口自動化測試系列,測試用例,yaml,python
測試用例結(jié)構(gòu)類似httprunner寫法,可參考demo

接口自動化測試系列-yml管理測試用例,接口自動化測試系列,測試用例,yaml,python
主要核心函數(shù)
用例讀取轉(zhuǎn)換json

import yaml
import main
import os
def yaml_r():
	curpath = f'{main.BASE_DIR}/quality_management_logic/ops_new/TestCaseCenter'
	yamlpath = os.path.join(curpath, "ops.yaml")
	f = open(yamlpath, 'r', encoding='utf-8')
	cfg = f.read()
	d = yaml.load(cfg,Loader=yaml.FullLoader)  # 用load方法轉(zhuǎn)字典
	return d

測試用例格式處理函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-704184.html

import ast
import yaml
import os
import datetime
import time
now_time = datetime.datetime.now()
now = datetime.datetime.strftime(now_time, '%Y-%m-%d %H:%M:%S')
logger = getlog(targetName='Case_Get_Data')
import openpyxl
def GetPreposition(mydict,pattern,res):
    '''
    獲取value中的sql
    :param str:
    :param pattern:
    :param env:
    :return:
    '''
    #字典類型的
    # pattern1=f'${pattern}:$'
    # res={'code': '', 'data': {}, 'flag': 'S', 'msg': ''}
    if isinstance(mydict, dict):  # 使用isinstance檢測數(shù)據(jù)類型,如果是字典
        # if key in mydict.keys():  # 替換字典第一層中所有key與傳參一致的key
        # if value in mydict.values():
        for key in mydict.keys():
            if isinstance(mydict[key],int) or mydict[key]==None:
                continue
            if str(pattern) in (mydict[key]):
                mydict[key] = eval((mydict[key]).split(pattern)[1])
            # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
            chdict = mydict[key]
            GetPreposition(chdict,pattern,res)
            if str(pattern) in str(mydict[key]):
                mydict[key] = eval(list(mydict[key])[0].split(pattern)[1])
    elif isinstance(mydict, list):  # 如是list
        for element in mydict:  # 遍歷list元素,以下重復(fù)上面的操作
            if isinstance(element, dict):
                # if value in element.values():
                for key in element.keys():
                    if str(pattern) in str(element[key]):
                        element[key] =eval(list(element[key])[0].split(pattern)[1])
                    # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
                    chdict = element[key]
                    GetPreposition(chdict,pattern,res)
                    if str(pattern) in str(element[key]):
                        element[key] = eval(list(element[key])[0].split(pattern)[1])
def GetSql(dic,pattern='sql-',env='stg2'):
    '''
    獲取用例中的sql
    :param dic:
    :param pattern:
    :param env:
    :return:
    '''
    if isinstance(dic,dict):
        if re.match(pattern,str(list(dic.keys())[0]),re.I):
            logger.debug('有查數(shù)據(jù)庫的變量,開始獲取sql')
            try:
                sql=list(dic.values())[0]
                dbname=list(dic.keys())[0].split('-')[1]
                return list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]
            except Exception as e:
                logger.error(e)
                return ''
    else:
        return False
def Issql(sql):
    if isinstance(sql,dict) :
        return True
    else:
        return False
def GetSqll(dic,pattern='sql-',env='stg1'):
    '''
    獲取value中的sql
    :param str:
    :param pattern:
    :param env:
    :return:
    '''
    #字典類型的
    if isinstance(dic, dict):  # 使用isinstance檢測數(shù)據(jù)類型,如果是字典
        for key in dic.keys():
            if isinstance(dic[key],int) or dic[key]==None:
                continue
            if pattern in (dic[key]):
                try:
                    sql = (dic[key]).split(":")[1]
                    dbname = (dic[key]).split(":")[0].split('-')[1]
                    dic[key] = list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]
                except Exception as e:
                    logger.error(e)
            # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
            chdict = dic[key]
            GetSqll(chdict, pattern, env)
    elif isinstance(dic, list):  # 如是list
        for element in dic:  # 遍歷list元素,以下重復(fù)上面的操作
            if isinstance(element, dict):
                # if value in element.values():
                for key in element.keys():
                    if isinstance(element[key], int) or element[key] == None:
                        continue
                    if pattern in element[key]:
                        try:
                            sql = element[key].split(":")[1]
                            dbname = element[key].split(":")[0].split('-')[1]
                            element[key] = list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]
                        except Exception as e:
                            logger.error(e)
                    # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
                    chdict = element[key]
                    GetSqll(chdict, pattern, env)
            else:
                for i in range(len(dic)):
                    if isinstance(dic[i], int) or dic[i] == None:
                        continue
                    if pattern in dic[i]:
                        try:
                            sql = dic[i].split(":")[1]
                            dbname =dic[i].split(":")[0].split('-')[1]
                            dic[i] = list(DBmananger(env, dbname).callMysql(sql)[0].values())[0]
                        except Exception as e:
                            logger.error(e)
def GetExpectedResults(dic):
    '''
    獲取預(yù)期結(jié)果值,dict的value必須是list,有且兩個值,第一個是位置,第二個是值
    :param dic:
    :return:
    '''
    ExpectedResults = dic.get("ExpectedResults")
    ExpectedResults=ast.literal_eval(str(ExpectedResults))
    if isinstance(ExpectedResults, list):  # 如是list
        if len(ExpectedResults)==2:
            return ExpectedResults
    else:
        return ['res', '']
def GetFun(dic,env,pattern='fun'):
    '''
    獲取用例中的自定義函數(shù)
    :param dic:
    :param pattern:
    :return:
    '''
    if isinstance(dic, dict):
        if re.match(pattern,str(list(dic.keys())[0]),re.I):
            logger.debug(f'有調(diào)用公共函數(shù),開始獲取調(diào)用函數(shù):{list(dic.values())[0]}')
            return eval(list(dic.values())[0].replace('env',env))
    else:
        return False
def yaml_r(yamlpath):
    '''
    yaml文件轉(zhuǎn)換成json
    :param yamlpath:
    :return:
    '''
    with open(yamlpath, 'r', encoding='utf-8') as f:
        # f = open(yamlpath, 'r', encoding='utf-8')
        cfg = f.read()
        d = yaml.load(cfg,Loader=yaml.FullLoader)  # 用load方法轉(zhuǎn)字典
    return d

def File_Name(file_dir):
    L = []
    for root, dirs, files in os.walk(file_dir):
        for file in files:
            if os.path.splitext(file)[1] == '.yaml':
                L.append(os.path.join(root, file))
    return L
def to_extract(key):
    return f"${key}$"

# 遍歷嵌套字典或list并替換字典的key
def update_allvalues(mydict, value, env='stg1'):
    tovalue=GetSqll(mydict, env)
    if isinstance(mydict, dict):  # 使用isinstance檢測數(shù)據(jù)類型,如果是字典
        # if key in mydict.keys():  # 替換字典第一層中所有key與傳參一致的key
        # if value in mydict.values():
        for key in mydict.keys():
            if value in mydict[key] :
                mydict[key] = tovalue
            # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
            chdict = mydict[key]
            update_allvalues(chdict, value, tovalue)
            if value in mydict[key] :
                mydict[key] = tovalue
    elif isinstance(mydict, list):  # 如是list
        for element in mydict:  # 遍歷list元素,以下重復(fù)上面的操作
            if isinstance(element, dict):
                # if value in element.values():
                for key in element.keys():
                    if value in element[key] :
                        element[key] = tovalue
                    # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
                    chdict = element[key]
                    update_allvalue(chdict, value, tovalue)
                    if value in str(element[key]) :
                        element[key] = tovalue


# 遍歷嵌套字典或list并替換字典的value
def update_allvalue(mydict, value, tovalue):
    if isinstance(mydict, dict):  # 使用isinstance檢測數(shù)據(jù)類型,如果是字典
        # if key in mydict.keys():  # 替換字典第一層中所有key與傳參一致的key
        # if value in mydict.values():
            for key in mydict.keys():
                if str(value) in str(mydict[key]):
                    mydict[key] = (str(mydict[key]).replace(value,tovalue))
        # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
                chdict = mydict[key]
                update_allvalue(chdict, value, tovalue)
                if str(value) in str(mydict[key]):
                    mydict[key] = (str(mydict[key]).replace(value, tovalue))
    elif isinstance(mydict, list):  # 如是list
        for element in mydict:  # 遍歷list元素,以下重復(fù)上面的操作
            if isinstance(element, dict):
                # if value in element.values():
                    for key in element.keys():
                        if   str(value) in str(element[key]):
                            element[key] = (str(element[key]).replace(value, tovalue))
                        # for k in mydict.keys():  # 遍歷字典的所有子層級,將子層級賦值為變量chdict,分別替換子層級第一層中所有key對應(yīng)的value,最后在把替換后的子層級賦值給當(dāng)前處理的key
                        chdict = element[key]
                        update_allvalue(chdict, value, tovalue)
                        if str(value) in str(element[key]):
                            element[key] = (str(element[key]).replace(value, tovalue))
def re_search(str,pattern='\\$(.*)\\$'):
    #查找
    match_str=re.search(pattern,str).group()
    return match_str
def nowtime():
    now_time = datetime.datetime.now()
    now = datetime.datetime.strftime(now_time, '%Y-%m-%d %H:%M:%S')
    # date_now=datetime.datetime.strftime(now_time, '%Y-%m-%d')
    date = (int(time.mktime(time.strptime(now, "%Y-%m-%d %H:%M:%S"))))
    return now, date

def readexcle(exclepath):
    wb = openpyxl.load_workbook(exclepath)
    # 獲取所有工作表名
    names = wb.sheetnames
    # wb.get_sheet_by_name(name) 已經(jīng)廢棄,使用wb[name] 獲取指定工作表
    sheet = wb[names[0]]
    # 獲取最大行數(shù)
    maxRow = sheet.max_row
    # 獲取最大列數(shù)
    maxColumn = sheet.max_column
    a12 = sheet.cell(row=1, column=2).value
    # 定義結(jié)果變量list
    result = []
    for i in range(2, (maxRow)):
        casedic = {}
        for j in range(1, (maxColumn) + 1):
            if j == 2 or j == 6 or j == 7:
                casedic[sheet.cell(row=1, column=j).value] = eval(sheet.cell(row=i, column=j).value)
            else:
                casedic[sheet.cell(row=1, column=j).value] = sheet.cell(row=i, column=j).value
        result.append(casedic)
    return result

到了這里,關(guān)于接口自動化測試系列-yml管理測試用例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【測試】MeterSphere單接口用例、自動化場景用例測試教程

    【測試】MeterSphere單接口用例、自動化場景用例測試教程

    1、在對應(yīng)的模塊下創(chuàng)建接口 2、接口的詳細(xì)信息填寫 3、為該接口添加測試用例 設(shè)置斷言規(guī)則 4、調(diào)試單接口測試用例通過(若不通過,根據(jù)請求內(nèi)容、響應(yīng)體和斷言結(jié)果排查錯誤) 1、根據(jù)測試場景將單接口自動化用例進(jìn)行組合,形成場景自動化測試用 輸入場景用例名稱,

    2024年02月13日
    瀏覽(21)
  • 接口自動化測試用例如何設(shè)計(jì)?

    接口自動化測試用例如何設(shè)計(jì)?

    說到自動化測試,或者說接口自動化測試,多數(shù)人的第一反應(yīng)是該用什么工具,比如:Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自動化平臺等。大家似乎更關(guān)注的是哪個工具更優(yōu)秀,甚至出現(xiàn)“ 做平臺的 寫腳本的 用工具的 ”諸如此類的鄙視鏈,但卻很少有人去關(guān)

    2023年04月24日
    瀏覽(19)
  • 2.接口自動化測試學(xué)習(xí)-執(zhí)行excel測試用例

    2.接口自動化測試學(xué)習(xí)-執(zhí)行excel測試用例

    編程語言 編程工具 自動化測試框架:pytest 報告可視化:allure 持續(xù)方案:CI持續(xù)集成-jenkins 倉庫服務(wù)器(自動化執(zhí)行):github/gitlab/gitee 測試管理工具:jira

    2024年04月15日
    瀏覽(23)
  • 如何實(shí)現(xiàn)基于場景的接口自動化測試用例?

    如何實(shí)現(xiàn)基于場景的接口自動化測試用例?

    自動化本身是為了提高工作效率,不論選擇何種框架,何種開發(fā)語言,我們最終想實(shí)現(xiàn)的效果,就是讓大家用最少的代碼,最小的投入,完成自動化測試的工作。 基于這個想法,我們的接口自動化測試思路如下: 1.不變的內(nèi)容全部通過配置化來實(shí)現(xiàn),比如:腳本執(zhí)行的環(huán)境、

    2024年02月14日
    瀏覽(22)
  • Python接口自動化測試:Postman使用-用例執(zhí)行

    Python接口自動化測試:Postman使用-用例執(zhí)行

    一個完整的測試,是必須要有斷言的,沒有斷言就相當(dāng)于沒有預(yù)期結(jié)果是不完整的,Postman給我們提供了方便的斷言方式 可以通過JS腳本來編寫Pre-request Script和Tests Script Pre-request?Script :預(yù)置腳本,可以用來修改一些默認(rèn)參數(shù),在請求發(fā)送之前,有點(diǎn)類型unittest里面的setUp()方法

    2024年02月11日
    瀏覽(29)
  • 接口自動化測試框架(pytest+allure+aiohttp+ 用例自動生成)

    近期準(zhǔn)備優(yōu)先做接口測試的覆蓋,為此需要開發(fā)一個測試框架,經(jīng)過思考,這次依然想做點(diǎn)兒不一樣的東西。 接口測試是比較講究效率的,測試人員會希望很快能得到結(jié)果反饋,然而接口的數(shù)量一般都很多,而且會越來越多,所以提高執(zhí)行效率很有必要 接口測試的用例其實(shí)

    2024年02月07日
    瀏覽(23)
  • 接口自動化測試框架開發(fā)(pytest+allure+aiohttp+ 用例自動生成)

    接口自動化測試框架開發(fā)(pytest+allure+aiohttp+ 用例自動生成)

    近期準(zhǔn)備優(yōu)先做接口測試的覆蓋,為此需要開發(fā)一個測試框架,經(jīng)過思考,這次依然想做點(diǎn)兒不一樣的東西。 接口測試是比較講究效率的,測試人員會希望很快能得到結(jié)果反饋,然而接口的數(shù)量一般都很多,而且會越來越多,所以提高執(zhí)行效率很有必要 接口測試的用例其實(shí)

    2024年01月23日
    瀏覽(22)
  • 接口自動化測試框架開發(fā) (pytest+allure+aiohttp+ 用例自動生成)

    目錄 前言: 第一部分(整個過程都要求是異步非阻塞的) 讀取 yaml 測試用例 http 請求測試接口 收集測試數(shù)據(jù) 第二部分 動態(tài)生成 pytest 認(rèn)可的測試用例 后續(xù)(yml 測試文件自動生成) 前言: 開發(fā)一個接口自動化測試框架是一個很好的方式,可以提高測試效率和準(zhǔn)確性。在這

    2024年02月16日
    瀏覽(49)
  • 接口自動化框架篇:流程封裝與基于加密接口的測試用例設(shè)計(jì)

    ?接口測試僅僅掌握 Requests 或者其他一些功能強(qiáng)大的庫的用法,是遠(yuǎn)遠(yuǎn)不夠的,還需要具備能根據(jù)公司的業(yè)務(wù)流程以及需求去定制化一個接口自動化測試框架的能力。所以,接下來,我們主要介紹下接口測試用例分析以及通用的流程封裝是如何完成的。 首先在做用例分析之

    2024年02月08日
    瀏覽(14)
  • python+pytest接口自動化(12)-自動化用例編寫思路 (使用pytest編寫一個測試腳本)

    python+pytest接口自動化(12)-自動化用例編寫思路 (使用pytest編寫一個測試腳本)

    經(jīng)過之前的學(xué)習(xí)鋪墊,我們嘗試著利用pytest框架編寫一條接口自動化測試用例,來厘清接口自動化用例編寫的思路。 我們在百度搜索 天氣查詢 ,會出現(xiàn)如下圖所示結(jié)果: 接下來,我們以該天氣查詢接口為例,編寫接口測試用例腳本。 針對某個功能做接口測試,首先我們需

    2024年02月04日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包