python使用pytest接口自动化测试的使用

作者:迷茫的Test小白 时间:2022-06-15 05:23:48 

简单的设计思路

  • 利用pytest对一个接口进行各种场景测试并且断言验证

  • 配置文件独立开来(conf文件),实现不同环境下只需要改环境配置即可

  • 测试的场景读取excle的测试用例,可支持全量执行或者自定义哪条用例执行(用例内带加密变量);

  • 接口入参还包含了加密的逻辑,所以需加一层加密处理

用例的样例:

python使用pytest接口自动化测试的使用

应用的库包含:


import pytest
import time, json
import base64, hmac
import hashlib, uuid, re
import requests
import pandas as pd

1. 先定义好conf配置代码


def config_txt(file_name="config.txt"):
   data_head = list()
   data_tail = list()
   for line in open(file_name, encoding='gb18030', errors='ignore'):
       head, sep, tail = line.partition('=')
       data_head.append(head.strip('\n '))
       if tail.find('#') != -1:
           tail, tail_b, tail_c = tail.partition('#')
       data_tail.append(tail.strip('\n  '))
   txt_data = dict(zip(data_head, data_tail))
   heada, sepa, taila = txt_data["GATEWAY_URL"].partition('/test_a')
   txt_data['HTTP_URI'] = "/test_a" + taila
   return txt_data

conf文件配置样例:
GATEWAY_URL = https://127.0.0.1:8051/test_a/adk #url链接地址
zhu_KEY = test_key  #用户信息1
zhu_SECRET = test_secret #用户2
zhu_ID = 18825176013    #用户ID
zhuLY_ID = 588347220  #用户信息3

2. 简单处理一下加密的处理,给后续持续调用


def md5(data_md5):
   data_md5 = hashlib.md5(data_md5.encode(encoding='UTF-8')).hexdigest()
   return data_md5

def sha256(data_sha256):
   data_sha256 = hashlib.sha256(data_sha256.encode(encoding='UTF-8')).hexdigest()
   return data_sha256

def hash_hmac(app_secret, msg, sha1):
   hmac_code = hmac.new(app_secret.encode(), msg.encode(), sha1).digest()
   return base64.b64encode(hmac_code).decode()

3. 处理用例里面的加密变量,例如:请求参数md5(18812345678)先进行数据预处理


def body_encrypt(data_encrypt):
   if data_encrypt.find("sha256(") != -1:
       sha_ss = re.findall(r"sha256[(](.+?)[)]", data_encrypt)
       for i in range(len(sha_ss)):
           data_encrypt = re.compile("sha256[(]" + str(sha_ss[i]) + '[)]').sub(str(sha256(sha_ss[i])), data_encrypt)
   if data_encrypt.find("md5(") != -1:
       md5_ss = re.findall(r"md5[(](.+?)[)]", data_encrypt)
       for i in range(len(md5_ss)):
           data_encrypt = re.compile("md5[(]" + str(md5_ss[i]) + '[)]').sub(str(md5(md5_ss[i])), data_encrypt)
   return data_encrypt

4. 读取excel文档里面的用例数据做为测试场景


def excel_case(file_name="case_file2.xlsx", case_id="all"):  # 读取excel账号及路由代理信息file_name
   data_excle = pd.read_excel(file_name, sheet_name=0, engine="openpyxl")
   df = pd.DataFrame(data_excle)
   if case_id != "all":
       df_data = df[(df.case_id == case_id)].to_dict('list')
   else:
       df_data = df.to_dict('list')
   case_id, case_name = df_data['case_id'], df_data['case_name']
   case_body, case_assert = df_data['case_body'], df_data['case_assert']
   case_body1 = body_encrypt(str(case_body))
   txt_data = list(zip(case_id, case_name, eval(case_body1), case_assert))
   return txt_data

5. 上主菜,pytest的使用


class Test_zhu(object):
   #类初始化,此处在测试执行中,全局只会执行一次(读取配置文件)
   @classmethod
   def setup_class(self):
       self.text_data = config_txt()
  #方法初始化,此处在测试执行中,每条用例都会先执行一遍
   def setup_method(self):
       time.sleep(0.4)
       self.time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  #request接口请求的逻辑
   def request_id(self, GATEWAY_URL, http_body):
       HTTP_BODY = eval(http_body)
       TIME_STAMP = str(int((time.time() + 5) * 1000))
       zhuCE = uuid.uuid1().hex
       msg = self.text_data['zhuLY_ID'] + "\n" + TIME_STAMP + "\n" + zhuCE + "\n" + self.text_data['zhu_KEY'] + "\n" + \
             self.text_data["HTTP_URI"] + "\n" + json.dumps(HTTP_BODY)
       HTTP_HEADER = {
           "zhu_ID": self.text_data['zhu_ID'],
           "zhuLY_ID": self.text_data['zhuLY_ID'],
           "zhuCE": zhuCE,
           "zhu_KEY": self.text_data['zhu_KEY'],
           "TIMESTAMP": TIME_STAMP,
           "SIGNATURE": hash_hmac(self.text_data['zhu_SECRET'], msg, hashlib.sha1)}
       print('**请求参数:{}.'.format(HTTP_BODY))
       response_one = requests.post(GATEWAY_URL, json=HTTP_BODY, headers=HTTP_HEADER, verify=True)
       print('**响应结果:{}.'.format(response_one.text))
       return eval(response_one.text)
   #parametrize为数据驱动,此处获取了excle用例里的数据;apitest定个标签,后续冒烟啥的可以选择性的跑(暂时无用);
   #excel_case(case_id="all")说明,all为全部用例执行或者指定用例执行case_0001
   @pytest.mark.parametrize('case_id,case_name, case_body, case_assert', excel_case(case_id="all"))
   @pytest.mark.apitest
   def test_zhu_case(self, case_id, case_name, case_body, case_assert):
       print("**\n执行编号:" + case_id + "\n**用例名称:" + case_name)
       case_assert_a = json.loads(case_assert)
       alertText = self.request_id(self.text_data['GATEWAY_URL'], case_body)
       retcode = case_assert_a.get('code') if case_assert_a.get('retcode') == None else case_assert_a.get('retcode')
       alertText_a = alertText.get('code') if alertText.get('retcode') == None else alertText.get('retcode')
       #此处为断言,判断用例通过还是不通过
       assert alertText_a == retcode

if __name__ == '__main__':
   pytest.main(["-sv", 'zhu_testA.py'])

6. 利用pytest-html库可以生成html报告

命令:pytest zhu_testA.py --html=report.html --self-contained-html

 python使用pytest接口自动化测试的使用

来源:https://www.jianshu.com/p/dba1632f73e3

标签:python,pytest,接口自动化
0
投稿

猜你喜欢

  • python中MethodType方法介绍与使用示例

    2022-09-08 03:28:50
  • C#调用python.exe使用arcpy方式

    2021-03-30 05:41:13
  • python装饰器decorator介绍

    2021-12-18 10:56:25
  • Python入门基础之变量及字符串

    2023-08-08 06:10:11
  • python 实现体质指数BMI计算

    2023-01-25 12:44:56
  • JS+ASP实现无刷新新闻列表之分页

    2007-08-22 12:57:00
  • python实现一个简单的ping工具方法

    2022-01-27 17:20:41
  • Python3实现简单可学习的手写体识别(实例讲解)

    2021-10-05 14:24:05
  • python中eval与int的区别浅析

    2023-06-24 00:21:08
  • Opencv实现二维直方图的计算及绘制

    2023-07-18 23:34:52
  • scrapy-splash简单使用详解

    2023-06-02 15:22:37
  • 使用mysqli完成事务处理

    2011-03-29 15:49:00
  • Python的函数使用介绍

    2022-07-02 12:05:42
  • Python全栈之进程和守护进程

    2021-11-25 18:05:44
  • python频繁写入文件时提速的方法

    2023-11-11 01:48:40
  • Python3基于sax解析xml操作示例

    2022-06-07 10:18:52
  • Python 提速器numba

    2021-04-27 21:14:06
  • python安装教程 Pycharm安装详细教程

    2022-08-08 02:25:55
  • 如何实现一个python函数装饰器(Decorator)

    2023-12-02 19:38:37
  • python输入一个水仙花数(三位数) 输出百位十位个位实例

    2022-12-09 12:39:58
  • asp之家 网络编程 m.aspxhome.com