pytest之通过yaml实现数据驱动

本文介绍了如何使用Python的`pyyaml`库处理YAML文件,展示了创建和读取YAML文件的示例,并讲解了如何在pytest中使用`@pytest.mark.parametrize`进行数据驱动测试,以YAML文件作为测试数据来源。
摘要由CSDN通过智能技术生成

一、安装pyyaml

pip install pyyaml

二、yaml基本语法

略过

三、将测试用例数据写入yaml

#用例1
-
 interfaceName: 首屏-考试数据接口
 url: http://stupad-stre****
 headers: {
  'Content-Type': 'application/json',
  'requestid': '021618985865',
  'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI4OTg2MyIsInN5c3RlbUlkIjoiODE5NTEwNTU3NDEiLCJvcmdJZCI6IjgwIiwidGltZXN0YW1wIjoiMTYxODk4NTcwODkyOCJ9.rTSoq0rwvCcHNLXiwKCa76_Vw_i926BuMoFrl1Tv0Q0'
 }
 data: {
  "type": 1
 }


#用例2
-
 interfaceName: 首屏-考试数据接口
 url: http://stupad-stres****
 headers: {
  'Content-Type': 'application/json',
  'requestid': '021618985865',
  'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI4OTg2MyIsInN5c3RlbUlkIjoiODE5NTEwNTU3NDEiLCJvcmdJZCI6IjgwIiwidGltZXN0YW1wIjoiMTYxODk4NTcwODkyOCJ9.rTSoq0rwvCcHNLXiwKCa76_Vw_i926BuMoFrl1Tv0Q0'
 }
 data: {
  "type": 2
 }


#用例3
-
 interfaceName: 首屏-考试数据接口
 url: http://stupad-str****
 headers: {
  'Content-Type': 'application/json',
  'requestid': '021618985865',
  'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI4OTg2MyIsInN5c3RlbUlkIjoiODE5NTEwNTU3NDEiLCJvcmdJZCI6IjgwIiwidGltZXN0YW1wIjoiMTYxODk4NTcwODkyOCJ9.rTSoq0rwvCcHNLXiwKCa76_Vw_i926BuMoFrl1Tv0Q0'
 }
 data: {
  "type": 3
 }

四、封装读取yaml的方法

  1. 创建ymal_tuil.py文件
  2. 封装:用_init_()方法来传入文件,再通过yaml.load()来进行反序列化
import yaml

class yamlUtil():
    def __init__(self,yaml_file):

        '''
        通过init把文件传入到这个类
        :param yaml_file:
        '''
        self.yaml_file = yaml_file

    #读取ymal文件
    def read_yaml(self):
        '''
        读取yaml,将yaml反序列化,就是把我们yaml格式转换成dict格式
        :return:
        '''
        with open(self.yaml_file,encoding="utf-8") as f:
            value = yaml.load(f,Loader=yaml.FullLoader) #文件流,加载方式
            print(value)


if __name__ == '__main__':
    yamlUtil("./interface.yaml").read_yaml()

运行结果:

{'interfaceName': '首屏-考试数据接口', 'url': 'http://stupad-st****', 'header': {'Content-Type': 'application/json', 'requestid': '021618985865', 'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI4OTg2MyIsInN5c3RlbUlkIjoiODE5NTEwNTU3NDEiLCJvcmdJZCI6IjgwIiwidGltZXN0YW1wIjoiMTYxODk4NTcwODkyOCJ9.rTSoq0rwvCcHNLXiwKCa76_Vw_i926BuMoFrl1Tv0Q0'}, 'data': {'type': 2}}

五、通过@pytest.mark.parametrize()实现yaml的数据驱动

import pytest
import os
from common.yaml_util import yamlUtil

class Test_yaml():

    @pytest.mark.parametrize("args",yamlUtil(os.getcwd()+"/testcase/test_yaml/interface.yaml").read_yaml())
    def test_yaml(self,args):
        # print(args)
        interfaceName = args['interfaceName']
        url = args["url"]
        headers = args["headers"]

        assert 2 == args["data"]["type"]

运行结果:

===================================================================================== test session starts ======================================================================================
platform darwin -- Python 3.9.4, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 -- /Users/dongshuai/venv/python3.9/bin/python
cachedir: .pytest_cache
metadata: {'Python': '3.9.4', 'Platform': 'macOS-11.2.3-x86_64-i386-64bit', 'Packages': {'pytest': '6.2.3', 'py': '1.10.0', 'pluggy': '0.13.1'}, 'Plugins': {'variables': '1.9.0', 'rerunfailures': '9.1.1', 'html': '3.1.1', 'xdist': '2.2.1', 'metadata': '1.11.0', 'allure-pytest': '2.8.40', 'ordering': '0.6', 'forked': '1.3.0'}}
rootdir: /Users/dongshuai/PycharmProjects/ui-test, configfile: pytest.ini, testpaths: /Users/dongshuai/PycharmProjects/ui-test
plugins: variables-1.9.0, rerunfailures-9.1.1, html-3.1.1, xdist-2.2.1, metadata-1.11.0, allure-pytest-2.8.40, ordering-0.6, forked-1.3.0
collected 1 item                                                                                                                                                                                

testcase/test_yaml/Test_yaml.py::Test_yaml::test_yaml[args0] PASSED

======================================================================================= 1 passed in 0.06s =======================================================================================
(python3.9) (base) dongshuai@dongshuaideMacBook-Air ui-test % 
  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
pytest是一个Python的测试框架,用于编写和运行测试用例。而yaml则是一种常见的数据格式,用于存储和传输数据。 在pytest中,可以使用ddt(Data-Driven Testing)模块来进行数据驱动的测试。ddt模块允许我们将测试用例的输入数据和预期结果从代码中分离出来,以yaml格式存储在单独的文件中。这样一来,我们可以轻松地修改和扩展测试数据,而无需修改测试代码。 使用ddt进行数据驱动测试的步骤如下: 1. 安装ddt模块:在终端中运行`pip install ddt`命令来安装ddt模块。 2. 在测试类中引入ddt装饰器:在测试类上方添加`@ddt`装饰器,以告诉pytest该类将使用ddt模块。 3. 使用@data装饰器和@unpack装饰器:在测试方法上方添加`@data`装饰器,并传入从yaml文件中读取的测试数据。如果测试数据是一个列表,可以使用`@unpack`装饰器将其拆分为多个参数,方便使用。 4. 在测试方法中使用测试数据:在测试方法内部,使用传入的测试数据进行测试操作。通过调用断言函数来比较实际结果和预期结果,以判断测试是否通过。 5. 在命令行中运行测试用例:在终端中运行命令`pytest`来执行测试用例pytest将自动查找和执行包含ddt装饰器的测试方法,并使用测试数据进行多次测试。 通过这种方式,我们可以通过简单修改或添加yaml文件中的测试数据,从而轻松地扩展和维护测试用例。同时,ddt模块还提供了更多的装饰器和功能,如@file_data、@cases、@data_class等,可以满足各种不同的测试需求。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值