先安装pip install pytest

pytest用例管理框架

默认规则:

1.py文件必须以test_开头或者_test结尾

2.类名必须以test开头

3.测试用例必须以test_开头

get 请求通过params传递参数

post请求通过json或者data传参

data

数据报文:dict字典类型,请求头:application/x-www-form

以form表单的方式传参   格式:id=3&sn=ed24aw

数据报文:str类型,请求头:text/plain

data只能传简单的只有键值对的dict或者是str格式

json

数据报文:不管是dict还是str类型,application/json

data=json.dumps(data)   序列化,把字典格式的数据转化为字符串的数据

json.loads(data)              反序列化,把str格式转化为字典格式

import requests
class TestSendRequest: #Test开头的类
  token=""         #把token设为全局变量,也称类变量,通过类名来访问TestSendRequest.token
  cks =""
  session = request.session()
  
  def setup(self):
    print("在每个用例之前都执行一次")  
    
  def teardown(self):
    print("在每个用例之后都执行一次")

  def test_login(self):  #Test_开头的测试用例
    url = "……" 
data = { "key":"value" "key":"value" "key":"value" }
rep = session.request("get",url=url,params=data) #传入接口路径和接口参数 #这样去发送请求时就会得到一个response响应
       print(rep.json()) #查看接口文档的响应数据是什么格式 #返回一个token值,是一个键值对 
    TestSendRequest.token =rep.json()['token'] #通过这个键取到这个值

  def test_patch_mecharmId(self,conn_database):    #将函数方法名conn_database传进来
    url = "…… token="+TestSendRequest.token+""
    data = {"SN":"","ID":"32"}
    rep =session.request("post",url=url,json=data) # data=json.dumps(data) 序列化,把字典格式的数据转化为字符串的数据 #post可传URL,data,json等    print(rep.json()) 
    TestSendRequest.cks =rep.cookies

  def test_file_upload(self):
    url ="…… token="+TestSendRequest.token+""
    data = {
      "file":open(r"E:\SHU.png":"rb") #以二进制的形式打开
}
    headeres = {              #有请求头时
      "Accept":"application/json,text/javascript"
      "x-Requested-with":"XMLHttpRequest"
}
    rep =session.request("post",url=url,files=data,headers=headers,cookies=TestSendRequest.cks) #需要cookies鉴权时
    print(rep.json())

运行方式

-v 输出更加详细的运行信息  
-s 输入调试信息
-n 多线程运行
--reruns 数字 失败用例重跑
--html= 报告的路径

实际工作中会使用pytest.ini 的配置文件来配置运行
#新建一个配置文件  当.py文件运行时,会自动读取这个配置文件
[pytest]
addopts = -vs #配置命令
testpaths=./testcases #配置文件路径
python_files = test_*.py #配置文件规则
python_classes = test_*
python_function = test_*
新建一个conftest.py文件,用来实现部分的前置
conftest.py文件是单独存放@pytest.fixture的方法,这些方法不需要导入,直接调用即可
用处是可以在多个.py文件之间共享前置配置
@pytest.fixture(scope="function")      #定义成一个函数
def conn_database(); #把用例名称传到.py文件需要用的的用例即可
  print("连接数据库")
  yield #唤醒
  print("关闭数据库")

@pytest.fixture(scope="session",autouse=True) #将自动清除写进前置文件里面
def clear_yaml():   
  YamlUtil().clear_extract_yaml()

一般会新建一个all.py文件来运行

if _name_=='_main_':   #写个main方法运行
 pytest.main(['-vs']) # -v 输出更加详细的运行信息 -s 输入调试信息

那么怎么做接口的封装呢?

上面的环境变量不过松散,而且每个.py文件都有变量,有着多种关联,建议封装一个读写YAML和写YAML的方法

新建一个extract.yml

再新建一个python package--新建一个公共包--新建yaml_util.py文件

import os
class YamlUtil:
  def read_extract_yaml(self): #读取YAML文件
    with open(os.getcwd()+"/extract.yml",mode='r',encoding='utf-8') as f: #作为文件流
      value = yaml.load(stream=f,Loader=yaml.FullLoader) #通过yaml.load去加载,Loader为加载方式
      return value;
  def read_extract_yaml(self,data):  #写入YAML文件
    with open(os.getcwd()+"/extract.yml",mode='a',encoding='utf-8') as f:
      value = yaml.dump(data=data,stream=f,allow_unicode=True)
      return value;

  def clear_extract_yaml(self):  #清除YAML文件
    with open(os.getcwd()+"/extract.yml",mode='w',encoding='utf-8') as f:
      f.truncate() #直接清除即可
      


import requests
class TestSendRequest: #删除全局变量,将yaml文件写进去
           
  cks =""
  session = request.session()
     def test_login(self):  
    url = "……"
data = { "key":"value" "key":"value" "key":"value" }
rep = session.request("get",url=url,params=data)
print(rep.json()) #下面的yaml文件一般是一个键值对
    YamlUtil().write_extract_yaml({'token':rep.json()['token']}) #把yaml文件写进去,之前是TestSendRequest.token =rep.json()['token']  
  def test_patch_mecharmId(self,conn_database):
    
YamlUtil().write_extract_yaml('token')  #读写yaml的token
    url = "…… token="+token+""     #直接使用token
    data = {"SN":"","ID":"32"}     
    rep =session.request("post",url=url,json=data)    
    print(rep.json()) 
    TestSendRequest.cks =rep.cookies   def test_file_upload(self):
    url ="…… token="+TestSendRequest.token+""
    data = {
      "file":open(r"E:\SHU.png":"rb")
}
    headeres = {
      "Accept":"application/json,text/javascript"
      "x-Requested-with":"XMLHttpRequest"
}
    rep =session.request("post",url=url,files=data,headers=headers,cookies=TestSendRequest.cks)
    print(rep.json())
 

pytest用例管理框架实战(基础篇)的更多相关文章

  1. Git 沙盒模拟实战(基础篇)

    Git 沙盒模拟实战 分支 现有一个主分支 创建分支 # 创建分支 $ git branch bugFix # 切换到指定分支 $ git checkout bugFix 或者 # 创建分支,并切换到 ...

  2. [ASP.NET Core开发实战]基础篇03 中间件

    什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...

  3. [ASP.NET Core开发实战]基础篇02 依赖注入

    ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...

  4. [ASP.NET Core开发实战]基础篇06 配置

    配置,是应用程序很重要的组成部分,常常用于提供信息,像第三方应用登录钥匙.上传格式与大小限制等等. ASP.NET Core提供一系列配置提供程序读取配置文件或配置项信息. ASP.NET Core项 ...

  5. [ASP.NET Core开发实战]基础篇05 服务器

    什么是服务器 服务器指ASP.NET Core应用运行在操作系统上的载体,也叫Web服务器. Web服务器实现侦听HTTP请求,并以构建HttpContext的对象发送给ASP.NET Core应用. ...

  6. [ASP.NET Core开发实战]基础篇04 主机

    主机定义 主机是封闭应用资源的对象. 设置主机 主机通常由 Program 类中的代码配置.生成和运行. HTTP项目(ASP.NET Core项目)创建泛型主机: public class Prog ...

  7. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

  8. 基于Python的接口自动化实战-基础篇之读写配置文件

    引言 在编写接口自动化测试脚本时,有时我们需要在代码中定义变量并给变量固定的赋值.为了统一管理和操作这些固定的变量,咱们一般会将这些固定的变量以一定规则配置到指定的配置文件中,后续需要用到这些变量和变 ...

  9. 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库

    引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...

  10. [WF4.0 实战] WPF + WCF + WF 打造Hello World(基础篇)

    本篇博客是一个基础的演示样例,也就是一个新手教程吧!让大家熟悉一下WPF + WCF + WF三者的关系!这仅仅是一个基础篇,下篇会继续深入,作为这段时间研究工作流的一个小小总结! 三者关系: WPF ...

随机推荐

  1. Java基础之基本运算符

    基本运算符 算数运算符:+.-.*./.%.++.-- 赋值运算符:= 关系运算符:>.<.>=.<=.==.!= instanceof 逻辑运算符:&&.|| ...

  2. 【mysql练习】A,B两表结构完全一样,其中A中一些数据在B中不存在,用SQL将A表数据更新到B表中

    1,创建符合条件的A,B表和数据 create table IF not EXISTS A (id int auto_increment primary key);create table IF no ...

  3. WPF中向下拉框中绑定枚举体

    1.枚举绑定combox的ItemsSourceItemsSource绑定的是个集合值,要想枚举绑定ItemsSource,首先应该想到的是把枚举值变成集合. 方法一:使用资源里的ObjectData ...

  4. 完整的javaweb文档

    1.index.jsp <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8&qu ...

  5. 使用kubeadm快速部署k8s高可用集群

    二进制安装方法请移步到:二进制部署高可用kubernetes-1.22.7集群 一:环境初始化 系统规划 k8s-master01 192.168.113.100   k8s-master02 192 ...

  6. Flutter 新建项目

    一.打开VSCode,点击侧边栏扩展按钮,搜索flutter,安装Flutter和Dart 二.按command+shift+P,输入flutter,选择Flutter:New project,新建项 ...

  7. unity game Developemnt in 24 hours 第1章 untiy

    屏幕有3个主要窗口 , Hierarchy.Project.Insepector ,个人理解Project是类定义,Hierarchy是创建类.实例化类,而Insepector是对类的属性进行管理

  8. Vue-数据代理

    Vue中的数据代理 数据代理定义 所谓数据代理,就是通过一个对象代理对另一个对象中的属性的操作(读/写).说白了就是操作一个对象上的属性可以读取和修改另一个对象上的属性,这种关系就叫做数据代理. 在V ...

  9. Redis集群模式及工作原理

    Redis有三种集群模式:主从模式.哨兵模式和集群模式. 1. 主从模式 所有的写请求都被发送到主数据库上,再由主数据库将数据同步到从数据库上.主数据库主要用于执行写操作和数据同步,从数据库主要用于执 ...

  10. 【项目记录】2:python3 使用MySQL 出现RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods 报错

    报错是因为缺少了一个库 cryptography  导入了就好了. ps:如果是本机,输入IP会报错,直接使用localhost可连接数据库