数据驱动的自动化测试2

目录

Excel参数化之参数化运行

在testcase文件夹下面创建test_excel_case.py文件,代码如下:

from config.Conf import ConfigYaml
from config import Conf
import os
from common.ExcelData import Data
from utils.LogUtil import my_log
from common import ExcelConfig
from utils.RequestsUtil import Request
import json
import pytest
from common import Base
from utils.AssertUtil import AssertUtil
import allure
#1、初始化信息
#1).初始化测试用例文件
case_file = os.path.join(Conf.get_data_path(),ConfigYaml().get_excel_file())
#2).测试用例sheet名称
sheet_name = ConfigYaml().get_excel_sheet()
#3).获取运行测试用例列表
data_init = Data(case_file,sheet_name)
run_list = data_init.get_run_data()

#4).日志
log = my_log()
#初始化dataconfig
data_key = ExcelConfig.DataConfig
#2、测试用例方法,参数化运行
#一个用例的执行
class TestExcel:
    #1、增加Pyest
    #2、修改方法参数
    #3、重构函数内容
    #4、pytest.main

    def run_api(self,url,method,params=None,header=None,cookie=None):
        """
        发送请求api
        :return:
        """
        # 2).接口请求
        request = Request()
        # params 转义json
        # 验证params有没有内容
        if len(str(params).strip()) is not 0:
            params = json.loads(params)
        # method post/get
        if str(method).lower() == "get":
            # 2.增加Headers
            res = request.get(url, json=params, headers=header, cookies=cookie)
        elif str(method).lower() == "post":
            res = request.post(url, json=params, headers=header, cookies=cookie)
        else:
            log.error("错误请求method: %s" % method)

        return res

    def run_pre(self,pre_case):
        #初始化数据
        pass
        url = ConfigYaml().get_conf_url()+pre_case[data_key.url]
        method = pre_case[data_key.method]
        params = pre_case[data_key.params]
        headers = pre_case[data_key.headers]
        cookies = pre_case[data_key.cookies]

        # 1.判断headers是否存在,json转义,无需
        # if headers:
        #     header = json.loads(headers)
        # else:
        #     header = headers
        header = Base.json_parse(headers)
        # 3.增加cookies
        # if cookies:
        #     cookie = json.loads(cookies)
        # else:
        #     cookie = cookies
        cookie = Base.json_parse(cookies)
        res = self.run_api(url,method,params,header)
        print("前置用例执行:%s"%res)
        return res

#1).初始化信息,url,data

    # 1、增加Pyest
    @pytest.mark.parametrize("case",run_list)
    # 2、修改方法参数
    def test_run(self,case):
        # 3、重构函数内容
        #data_key = ExcelConfig.DataConfig
        # run_list第1个用例,用例,key获取values
        url = ConfigYaml().get_conf_url()+case[data_key.url]
        print(url)
        case_id = case[data_key.case_id]
        case_model = case[data_key.case_model]
        case_name = case[data_key.case_name]
        pre_exec = case[data_key.pre_exec]
        method = case[data_key.method]
        params_type = case[data_key.params_type]
        params = case[data_key.params]
        expect_result = case[data_key.expect_result]
        headers = case[data_key.headers]
        cookies =case[data_key.cookies]
        code = case[data_key.code]
        db_verify = case[data_key.db_verify]



        # 1、验证前置条件
        if pre_exec:
            pass
        # 2、找到执行用例
            # 前置测试用例
            pre_case = data_init.get_case_pre(pre_exec)
            print("前置条件信息为:%s"%pre_case)
            pre_res = self.run_pre(pre_case)
            headers,cookies = self.get_correlation(headers,cookies,pre_res)

        header = Base.json_parse(headers)
        cookie = Base.json_parse(cookies)
        res = self.run_api(url, method, params, header,cookie)
        print("测试用例执行:%s" % res)

        #allure
        #sheet名称  feature 一级标签
        allure.dynamic.feature(sheet_name)
        #模块   story 二级标签
        allure.dynamic.story(case_model)
        #用例ID+接口名称  title
        allure.dynamic.title(case_id+case_name)
        #请求URL  请求类型 期望结果 实际结果描述
        desc = "<font color='red'>请求URL: </font> {}<Br/>" \
               "<font color='red'>请求类型: </font>{}<Br/>" \
               "<font color='red'>期望结果: </font>{}<Br/>" \
               "<font color='red'>实际结果: </font>{}".format(url,method,expect_result,res)
        allure.dynamic.description(desc)

        #断言验证
        #状态码,返回结果内容,数据库相关的结果的验证
        #状态码
        assert_util = AssertUtil()
        assert_util.assert_code(int(res["code"]),int(code))
        #返回结果内容
        assert_util.assert_in_body(str(res["body"]),str(expect_result))
        #数据库结果断言
        Base.assert_db("db_1",res["body"],db_verify)


        #1、初始化数据库
        # from common.Base import init_db
        # sql = init_db("db_1")
        # #2、查询sql,excel定义好的
        # db_res = sql.fetchone(db_verify)
        # log.debug("数据库查询结果:{}".format(str(db_res)))
        # #3、数据库的结果与接口返回的结果验证
        # #获取数据库结果的key
        # verify_list = list(dict(db_res).keys())
        # #根据key获取数据库结果,接口结果
        # for line in verify_list:
        #     res_line = res["body"][line]
        #     res_db_line = dict(db_res)[line]
        # #验证
        #     assert_util.assert_body(res_line,res_db_line)
        # 1.判断headers是否存在,json转义,无需
        # if headers:
        #     header = json.loads(headers)
        # else:
        #     header = headers
        # # 3.增加cookies
        # if cookies:
        #     cookie = json.loads(cookies)
        # else:
        #     cookie = cookies

        # #2).接口请求
        # request = Request()
        # #params 转义json
        # #验证params有没有内容
        # if len(str(params).strip()) is not 0:
        #     params = json.loads(params)
        # #method post/get
        # if str(method).lower()=="get":
        #     # 2.增加Headers
        #     res = request.get(url,json=params,headers = header,cookies=cookie)
        # elif str(method).lower()=="post":
        #     res = request.post(url, json=params,headers = header,cookies=cookie)
        # else:
        #     log.error("错误请求method: %s"%method)
        # print(res)
#TestExcel().test_run()

    def get_correlation(self,headers,cookies,pre_res):
        """
        关联
        :param headers:
        :param cookies:
        :param pre_res:
        :return:
        """
        #验证是否有关联
        headers_para,cookies_para = Base.params_find(headers,cookies)
        #有关联,执行前置用例,获取结果
        if len(headers_para):
            headers_data = pre_res["body"][headers_para[0]]
        #结果替换
            headers = Base.res_sub(headers,headers_data)
        if len(cookies_para):
            cookies_data = pre_res["body"][cookies_para[0]]
            # 结果替换
            cookies = Base.res_sub(headers, cookies_data)
        return headers,cookies
if __name__ == '__main__':
    #pass
    report_path = Conf.get_report_path()+os.sep+"result"
    report_html_path = Conf.get_report_path()+os.sep+"html"
    pytest.main(["-s","test_excel_case.py","--alluredir",report_path])


    #Base.allure_report("./report/result","./report/html")
    #Base.send_mail(title="接口测试报告结果",content=report_html_path)
    #固定headers请求
    #1.判断headers是否存在,json转义,无需
    #2.增加Headers
    #3.增加cookies
    #4.发送请求

    #动态关联
    #1、验证前置条件
    #if pre_exec:
    #pass
    #2、找到执行用例
    #3、发送请求,获取前置用例结果
    #发送获取前置测试用例,用例结果
    #数据初始化,get/post,重构
    #4、替换Headers变量
        #1、验证请求中是否${}$,返回${}$内容
    # str1 = '{"Authorization": "JWT ${token}$"}'
    # if "${" in str1:
    #     print(str1)
    # import re
    # pattern = re.compile('\${(.*)}\$')
    # re_res = pattern.findall(str1)
    # print(re_res[0])
    #     #2、根据内容token,查询 前置条件测试用例返回结果token = 值
    # token = "123"
    #     #3、根据变量结果内容,替换
    # res = re.sub(pattern,token,str1)
    # print(res)
    #5、请求发送

    #1、查询,公共方法
    #2、替换,公共方法
    #3、验证请求中是否${}$,返回${}$内容,公共方法
    #4、关联方法

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦