【python做接口测试的学习记录day5——pytest+yaml数据驱动+allure报告的一个包含token关联的自动化测试框架】

之前的学习中,我们已经将需要的插件都安装好了,现在我们开始记录一下一个包含token关联的接口自动化框架的搭建全过程

我们的总体结构如下:

【python做接口测试的学习记录day5——pytest+yaml数据驱动+allure报告的一个包含token关联的自动化测试框架】

common:用来存放公共类 reports是生成报告temp是测试接口生成的json数据 ,用于生成报告的(详细可看之前的报告生成文章)testcases用来存放测试用例,其它就是一些配置文件,运行程序和前后置

第一步,YAML数据方法的封装

首先我们先对yaml数据的读取,写入,清除等方法进行封装,属于公共方法,因此我们在common下创建yaml_util.py代码如下

import os
import yaml

#读取
class YamlUtil:

    # 读取
    def read_yaml(self,key):
        with open(os.getcwd() + '/extract.yaml', encoding='utf-8', mode='r') as f:
            value = yaml.load(f, yaml.FullLoader)
            return value[key]

    # 写入
    def write_yaml(self,data):
        with open(os.getcwd() + '/extract.yaml', encoding='utf-8', mode='a') as f:
            yaml.dump(data, stream=f, allow_unicode=True)

    # 清空
    def clear_yaml(self):
        with open(os.getcwd() + '/extract.yaml', encoding='utf-8', mode='w') as f:
            f.truncate()

    # 读取测试用例
    def read_testcase(self,yaml_name):
        with open(os.getcwd() + '\\testcases\\' + yaml_name, mode='r', encoding='utf-8') as f:
            value = yaml.load(f, yaml.FullLoader)
            return value

第二步,接口请求的封装

依旧在common中创建request_util.py文件,代码如下:

import requests
import json

class RequestUtil:
    sess= requests.session()

    def send_request(self,method,url,datas=None,**kwargs):
        method=str(method).lower()  #转换小写
        res=None
        if method=="get":
            res=RequestUtil.sess.request(method=method,url=url,params=datas,**kwargs)
        elif method=="post":
            if datas and isinstance(datas,dict):
                datas=json.dumps(datas)
            res=RequestUtil.sess.request(method=method, url=url, data=datas, **kwargs)
        else:
            pass
        return res

这里我只封装了get和post两种请求,如果要使用其它方法,自行加入即可。

第三步,yaml数据创建

创建一个get_token.yaml文件,用来存放我们登录接口的用例,例如我的:

-
  name: 获取接口统一鉴权码token接口
  request:
    method: post
    url: https://***/jlcloud/api/login
    data:
      "account": "****"
      "password": "014f4041514bc5dcb82845fe5efa3c54"
      "project": "DEFAULT"
      "teacherLogin": False
      "clientId": "1"
      "secret": ""
    headers:
      'Content-Type': 'application/json'
    validate: None
-
  name: 获取接口统一鉴权码token接口
  request:
    method: post
    url: https://***/jlcloud/api/login
    data:
      "account": "***"
      "password": "123456"
      "project": "DEFAULT"
      "teacherLogin": False
      "clientId": "1"
      "secret": ""
    headers:
      'Content-Type': 'application/json'
    validate: None

yaml数据写入规则请看我之前的文章,

第二个接口是获取用户信息的get请求,我创建userinfo.yaml来存放第二个接口的用例

-
  name: 获取接口统一鉴权码token接口
  request:
    method: get
    url: https://***/jlcloud/api/login/getUserInfo
    data:
      {}
    headers:
      'Content-Type': 'application/json'
    validate: None

第四步,接口测试自动化

数据准备完成后,在testcases下创建一个test_login的py文件,这里我们在test_login里写入代码、

import pytest
import requests
import json
from common.request_util import RequestUtil
from common.yaml_util import YamlUtil

class TestRequest:
    pass
    @pytest.mark.parametrize("args_name",YamlUtil().read_testcase('get_token.yaml')) ##读取测试用例的get_token.yaml文件中的参数及值,赋值给变量args_name
    def test_login(self,args_name):
        url=args_name['request']['url']
        data = args_name['request']['data']
        method= args_name['request']['method']
        headers=args_name['request']['headers']
        res = RequestUtil().send_request(method=method, url=url, datas=data, headers=headers)
        print(res.text)
        if "data" in res.text:
            YamlUtil().write_yaml({"token":res.json()['data']})  #将token值写入yaml文件,执行后根目录生成extract.yaml文件,可在此查看提取的token

    @pytest.mark.parametrize("userinfo", YamlUtil().read_testcase('userinfo.yaml'))##读取测试用例的userinfo.yaml文件中的参数及值,赋值给变量userinfo
    def test_userinfo(self, userinfo):
        token = YamlUtil().read_yaml('token')  # 读取token的值
        url = userinfo['request']['url']+'?token='+token   #我这里的url需要带上token
        data = userinfo['request']['data']
        method = userinfo['request']['method']
        headers = userinfo['request']['headers']
        res = RequestUtil().send_request(method=method, url=url, datas=data, headers=headers)
        print(res.text)

第五步,测试前置后置

在根目录下创建conftest.py,注意这个文件名称是pytest 框架写死的不能更改,常用来处理测试用例的前置条件。并用fixture标记一些函数,例如连接数据库的操作、或者我们这种token值变化,每次运行前就需要清除一下等

这里我们在测试时进行yaml数据清除

import pytest
from common.yaml_util import YamlUtil

@pytest.fixture(scope="function")
def exe_sql():
    print("用例执行之前")
    yield
    print("用例执行之后")

#在所有的接口请求之前执行
@pytest.fixture(scope="session",autouse=True)
def clear_extract():
    YamlUtil().clear_yaml()

第六步,运行

在根目录新建run.py文件

import pytest
import os

if __name__ == '__main__':   # pytest运行模式
    pytest.main()
    os.system("allure generate ./temp -o ./reports --clean")  ##生成测试报告

运行后,目录中会自动生成temp的json数据,以及reports里的的index.html文件,打开文件即可查看报告,如下:

【python做接口测试的学习记录day5——pytest+yaml数据驱动+allure报告的一个包含token关联的自动化测试框架】

这样一个简单的框架就搭建好了,当然这只是很初步的一个框架,很多问题使用这个框架是无法实现的,例如动态参数问题,数据太大的问题等,后续我在学习的过程中会继续跟进,欢迎各位前辈指点,讨论~

Original: https://blog.csdn.net/weixin_42833736/article/details/125488198
Author: 小丫么小二郎~
Title: 【python做接口测试的学习记录day5——pytest+yaml数据驱动+allure报告的一个包含token关联的自动化测试框架】

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

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

(0)

大家都在看

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