自动化测试框架Pytest(九)——任务管理

前面几章我们学了一个自动化用例应该怎么写,今天我们来实现一个任务跑多个参数不同的自动化用例。

自动化测试框架Pytest(九)——任务管理

首先我们在pm_get_token.yaml里新增一个参数parameterize,该参数为一个列表,第一行为我要替换的参数名,后面几行为每一个参数名实际对应的值。

后面的参数如果需要替换值我们都用$ddt{xxx} 来替换。这样我们可以实现写一个yaml文件,同时跑【密码正确】和【密码不正确】两个测试用例。

-
  parameterize:
    - [ 'name','appid','secret','validate']
    - [ '密码正确','wxxx8b67ced3c4b884','xxxx24bd9ca932e31e229be30b0a805b', 'access_token' ]
    - [ '密码错误','wxxx8b67ced3c4b884','xxxx24bd9ca932e31e229be30b0a8033', 'errcode' ]
  name: $ddt{name}
  request:
    method: get
    url: https://api.weixin.qq.com/cgi-bin/token
    params:
      grant_type: client_credential
      appid: $ddt{appid}
      secret: $ddt{secret}
  validate:
    - contains: $ddt{validate}
  extract:
    access_token: '"access_token":"(.*?)"'
    expires_in: $.expires_in

下面我们来看看如何实现:

1、新建commons/parameterize.py

read_testcase_ddt方法主要是判断参数里是否有parameterize,如果有则去替换ddt{XXX},如果没有就不用替换值直接返回yaml文件里的数据。​​​​​​

import json
import os
import yaml
#获取项目根路径
def get_object_path():
    # print(os.getcwd())
    return os.getcwd()
#读取测试用例
def read_testcase_ddt(yaml_path):
    with open(get_object_path()+yaml_path,encoding='utf-8') as f:
        arg_names = yaml.load(f,Loader=yaml.FullLoader)
        # 判断yaml里是否有parameterize参数
        if "parameterize" in dict(*arg_names).keys():
            new_arg_names = get_ddt(*arg_names)
            return new_arg_names
        else:
            return arg_names
def get_ddt(arg_names):
    print("--------------get_ddt---------------")
    try:
        arg_names_str = json.dumps(arg_names)
        data_list = arg_names["parameterize"]
        key_length = len(data_list[0])
        # 循环数据-判断参数个数是否有误
        for param in data_list:
            if len(param) != key_length:
                print("参数个数有误")
                return arg_names
        # 替换值
        new_art_names = []
        for x in range(1, len(data_list)):
            # print(data_list[x])
            temp_arg_names = arg_names_str
            for y in range(0, len(data_list[x])):
                # print(data_list[x][y])
                # 如果要替换的参数是整形,需要将引号一起替换掉
                if isinstance(data_list[x][y], int) or isinstance(data_list[x][y], float):
                    temp_arg_names = temp_arg_names.replace('"$ddt{' + data_list[0][y] + '}"', str(data_list[x][y]))
                else:
                    temp_arg_names = temp_arg_names.replace("$ddt{" + data_list[0][y] + "}", str(data_list[x][y]))
            #将temp_arg_names字符串变成json对象
            # print(json.loads(temp_arg_names))
            #数组添加json对象
            new_art_names.append(json.loads(temp_arg_names))
            # print(new_art_names)
        return new_art_names
    except Exception as e:
        print("数据驱动异常")

2、接着我们把用例代码里的read_testcase_yaml改成read_testcase_ddt读取yaml文件​​​​​​

from test9.commons.parameterize import read_testcase_ddt
from test9.commons.request_util import RequestUtil
from test9.commons.yaml_util import read_testcase_yaml
class TestProductApi:
    @pytest.mark.parametrize("caseinfo", read_testcase_ddt('/testcase/pm_get_token.yaml'))
    def test_get_token(self, caseinfo):
        caseinfo.pop('parameterize')
        print(caseinfo)
        RequestUtil().standard_yaml(caseinfo)

3、执行一次任务可以看到该用例执行了2次,每次参数都替换成功。

自动化测试框架Pytest(九)——任务管理

自动化测试框架Pytest(九)——任务管理

‍这一章代码不多,但如何实现的思路很重要,建议反复观看。

学习资源分享

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

自动化测试框架Pytest(九)——任务管理

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….

自动化测试框架Pytest(九)——任务管理

Original: https://blog.csdn.net/m0_58026506/article/details/126602543
Author: 静姐说测试
Title: 自动化测试框架Pytest(九)——任务管理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/775656/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球