pytest使用

主要技术内容

1.pytest设计 接口测试 框架设想

common—公共的东西封装

1.request请求

2.Session

3.断言

4.Log

5.全局变量

6.shell命令

❖ config---配置文件及读取

❖ Log—

❖ payload—请求参数—*.yaml及读取

❖ testcases—conftest.py; testcase1.py…….可以有包,最好按模块就近划分

❖ result/report— 运行数据和报告

❖ 测试 策略—组织 运行all_test.py; p0_test.py; ……

2.框架执行简化流程

1.初始化配置

2.查找测试 用例套件
3.运行套件
4.初始化测试 数据pytest.fixture()

5.执行测试用例

6.读取yaml等测试数据

7.request运行

8.assert验证

9.allure记录报告

10.可与ienkins集成发邮件

3.测试 套件设计 模块化思想

4.测试 用例和套件落地思路

搜索功能—五个接口请求—返回股票stock信息;返回讨 论信息,组合,用户,群组;综合

❖ 搜索是个套件,五个接口分别是测试 用例,鉴于pytest 套件的灵活性,可以设计为 一个文件一个类下-【搜索】 下5个不同测试 方法【接口】(或可一个文件一个方法一 个接口设计 也行,灵活性强。这需要根据实际权 衡,如 果需要灵活多选择 后者,如果相对稳 定建议前者)

❖ 如果是通用的功能,可以放在共享的文件中-conftest.py

5.pytest的相关回顾

1. pytest是一个非常成熟的全功能的Python测试 框架

2. 简单 灵活,容易上手;支持参数化;

3. 能够支持简单 的单元测试 和复杂的功能测试 ,还可以用来做 selenium/appnium等自动化测试 、接口自动化测试 (pytest+requests);

4. pytest具有很多第三方插件,并且可以自定义扩 展, 比较好用的如pytest -selenium(多浏览 器执行)、 pytest-html(完美html测试报 告生成)、 pytest-rerunfailures(失败case重复执行)、 pytest-xdist(多CPU分发 )等;pytest-assume(允许每次测试 多次失败),

5. 测试 用例的skip和xfail处理;

6. 可以很好的和jenkins集成;

7. https://docs.pytest.org/en/latest/contents.html#toc 

pytest安装,导入相关依赖库

Pip install –U pytest U表示升级 ➢ Pip intall –U pytest-html ➢ pip install -U pytest-rerunfailures ➢ Pip install pytest-assume ➢ Pip install pytest-allure ➢ Pip install pytest-xdist ➢ Pip list查看 ➢ Pytest –h 帮助 兹测试学

Pytest框架结构

Import pytest

类似的setup,teardown同样更灵活,

模块级 (setup_module/teardown_module)模块始末,全局的

函数级(setup_function/teardown_function)不在类中的函数有用

类级 (setup_class/teardown_class)只在类中前后运行一次

方法级(setup_method/teardown_methond)运行在类中方法始末 

session() 


#这是一个模块model
import pytest@pytest.fixture(scope="module", autouse=True)
def setup_model():print("setup_model")yieldprint("teardown_model")#类class在模块中定义,它们可以包含多个方法和数据成员。
class TestClassA:def setup_class(self):print('\nsetup class')def teardown_class(self):print('\nteardown_class')#方法method是与类关联的函数def setup_method(self):print("\nsetup_method")def teardown_method(self):print("\nteardown_method")def test_method_1(self):print("TestClassA: test_method_1")def test_method_2(self):print("TestClassA: test_method_2")class TestClassB:def test_method_1(self):print("TestClassB: test_method_1")def test_method_2(self):print("TestClassB: test_method_2")#全局函数function,class内的函数function是方法methoddef setup_function():print("setup_function")def teardown_function():print("teardown_function")def test_function_1():print("test_function_1")def test_function_2():print("test_function_2")if __name__ == "__main__":pytest.main()

module

import pytest# 功能函数
def multiply(a, b):return a * b# ====== fixture ======
def setup_module():print("setup_module():在整个模块之前执行")def teardown_module():print("teardown_module():在整个模块之后执行")def setup_function(function):print("setup_function():在每个方法之前执行")def teardown_function(function):print("teardown_function():在每个方法之后执行")def test_multiply_1():print("正在执行test1")assert multiply(3, 4) == 12def test_multiply_2():print("正在执行test2")assert multiply(3, 'a') == 'aaa'


 

class

def multiply(a, b):"""Return the product of two numbers."""return a * b# Test fixture for the multiply function
class TestMultiply:def setup_class(cls):print("setup_class(): Executed before any method in this class")def teardown_class(cls):print("teardown_class(): Executed after all methods in this class")def setup_method(self):print("setup_method(): Executed before each test method")def teardown_method(self):print("teardown_method(): Executed after each test method")def test_multiply_3(self):"""Test multiply with two integers."""print("Executing test3")assert multiply(3, 4) == 12def test_multiply_4(self):"""Test multiply with an integer and a string (should fail)."""print("Executing test4")# Note: This test will raise a TypeError due to incompatible types.assert multiply(3, 'a') == 'aaa'

Pytest框架assert断言使用 断言:支持显示最常见的子表达式的值,包括调用,属性,比较以及二元和一元运算符。 包含,相等,不等,大于 小于运算,assertnot 假

assert “h” in “hello”(判断h在hello中)

assert 3==4(判断3=4)

assert 3!=4(判断3!=4)

assert f() ==4 (判断f()方法返回值是否=4)

assert 5>6 (判断5>6为真)

assert not xx (判断xx不为真)

assert {'0', '1', '3', '8'} == {'0', '3', '5', '8'} 断言列表或者字典

import pytestdef intest():assert 'h' in "hello"assert 3==4# (判断3=4)assert 3!=4# (判断3!=4)assert f() ==4# (判断f()方法返回值是否=4)assert 5>6# (判断5>6为真)assert not xx# (判断xx不为真)assert {'0', '1', '3', '8'} == {'0', '3', '5', '8'}# 断言列表或者字典def add(a, b):return a+b
# 测试相等def test_add1():assert add(3, 4) == 7# 测试不相等
def test_add_2():assert add(17, 22) != 50# 测试大于或等于
def test_add_3():assert add(17, 22) <= 50# 测试小于或等于
def test_add_4():assert add(17, 22) >= 38# 功能:用于判断素数
def is_prime(n):if n <= 1:return Falsefor i in range(2, n):if n % i == 0:return Falsereturn True# 判断是否为True
def test_true_1():assert is_prime(13)# 判断是否为True
def test_true_2():assert is_prime(7) is True
# 判断是否不为True
def test_true_3():assert not is_prime(4)
# 判断是否不为True
def test_true_4():assert is_prime(6) is not True
# 判断是否为False
def test_false_1():assert is_prime(8) is False# 测试包含
def test_in():a = "hello"b = "he"assert b in a# 测试不包含
def test_not_in():a = "hello"b = "hi"assert b not in aif __name__ == "__main__":pytest.main()

pytest-fixture的灵活

Fixture优势 :

1、对于setup,teardown,可以不起这两个名字,所以命名方式 灵活。(可独立命名,声明后激活)前置后置

import pytest@pytest.fixture()
def login():print('这是个登陆模块!')def test_soso(login):print('case1:登际后执行搜索')def test_cakan():print('case2:不登陆就看')def test_cart(login):print('case3:登陆,加购物车')

2、数据共享。在conftest.py配置里写方法可以实现 数据共享 ,不需要import导入。可以跨文件共享

创建conftest文件

import pytest@pytest.fixture()
def login():print('From_conftest - 这是个登陆模块!')
import pytestdef test_soso(login):print('case1:登际后执行搜索')def test_cakan():print('case2:不登陆就看')def test_cart(login):print('case3:登陆,加购物车')

3、 神奇的yield,提供返回值,不是return;;相当于setup 和 teardown 

import pytest@pytest.fixture(scope="module", autouse=True)
def setup_model():print("setup_model")yieldprint("teardown_model")def test_soso(setup_model):print('case1:登际后执行搜索')def test_cakan():print('case2:不登陆就看')def test_cart(setup_model):print('case3:登陆,加购物车')if __name__ == "__main__":pytest.main()

pytest-fixture

pytest-fixture-CSDN博客

1.Fixture(scope=“function”,params=None, autouse=False, ids=None, name=None):

2.可以使用此装饰器定义fixture

1. scope:=module,session,class,function;

function:每个test都运行,默认是function的scope ,

class:每个 class的所有test只运行一次;

module:每个module的所有test只运行一次;

session:每个session只运行一次


#这是一个模块model
import pytest@pytest.fixture(scope="class", autouse=True)
def setup_model():print("setup_model_class")yieldprint("teardown_model_class")#类class在模块中定义,它们可以包含多个方法和数据成员。
class TestClassA:def setup_class(self):print('\nsetup class')def teardown_class(self):print('\nteardown_class')#方法method是与类关联的函数def setup_method(self):print("\nsetup_method")def teardown_method(self):print("\nteardown_method")def test_method_1(self):print("TestClassA: test_method_1")def test_method_2(self):print("TestClassA: test_method_2")class TestClassB:def test_method_1(self):print("TestClassB: test_method_1")def test_method_2(self):print("TestClassB: test_method_2")#全局函数function,class内的函数function是方法methoddef setup_function():print("setup_function")def teardown_function():print("teardown_function")def test_function_1():print("test_function_1")def test_function_2():print("test_function_2")if __name__ == "__main__":pytest.main()

2. params:可选多个参数调用fixture

3. Autouse:如果是True,则为 所有测试 激活fixture,如果是False,则需要显式参考来激活。


#这是一个模块model
import pytest@pytest.fixture(scope="class")
def setup_model():print("setup_model_class")yieldprint("teardown_model_class")#类class在模块中定义,它们可以包含多个方法和数据成员。
class TestClassA:def setup_class(self):print('\nsetup class')def teardown_class(self):print('\nteardown_class')#方法method是与类关联的函数def setup_method(self):print("\nsetup_method")def teardown_method(self):print("\nteardown_method")def test_method_1(self,setup_model):print("TestClassA: test_method_1")def test_method_2(self):print("TestClassA: test_method_2")class TestClassB:def test_method_1(self):print("TestClassB: test_method_1")def test_method_2(self):print("TestClassB: test_method_2")#全局函数function,class内的函数function是方法methoddef setup_function():print("setup_function")def teardown_function():print("teardown_function")def test_function_1():print("test_function_1")def test_function_2():print("test_function_2")if __name__ == "__main__":pytest.main()

4. ids:每个字符串ID的列表,每个字符串对应 于param,这是测试 ID的一部分。  

import pytest@pytest.fixture(params=['www.baidu.com','www.bingying.com'],ids=['case1','case2'])
def urls(request):return request.paramdef test_url(urls):url = urlsprint("url:",url)

5. Name:fixture的名称。

3.fixture带参数传递 -通过固定参数request传递 ;传二个以上参数(通过字典,其实算一个),可 以传多个组合测试 。

import pytest@pytest.fixture(params=['www.baidu.com','www.bingying.com'],ids=['case1','case2'])
def urls(request):return request.paramdef test_url(urls):url = urlsprint("url:",url)

传一个字典

import pytest@pytest.fixture(params=[{'name':'baidu','url':'www.baidu.com'},{'name':'biying','url':'www.biying'}])
def urls_name(request):url = request.param['url']name = request.param['name']return url,namedef test_name_url(urls_name):url,name = urls_nameprint(name,url)

4.参数化:@pytest.mark.parametrize(“login_r”, test_user_data, indirect=True) indeirect=True 是把 login_r当作函数去执行

fixture传二个参数与数据驱动结合

@pytest.mark.parametrize 装饰器接受两个主要参数:

  1. 第一个参数是一个字符串,表示测试函数中需要参数化的参数名称,多个参数之间用逗号分隔。
  2. 第二个参数是一个列表或元组,其中每个元素都是一个参数组合,每个组合也是一个元组或列表,其元素顺序必须与第一个参数中列出的参数顺序相匹配。

直接在测试函数上使用

import pytest# 假设我们有一个函数,它接受两个参数并返回它们的和
def add(a, b):return a + b# 使用 parametrize 装饰器,指定测试函数的参数和对应的值
@pytest.mark.parametrize("a, b, expected", [(1, 2, 3),   # 第一组参数(2, 3, 5),   # 第二组参数(-1, 1, 0),  # 第三组参数(0, 0, 0),   # 第四组参数
])
def test_add(a, b, expected):assert add(a, b) == expected

类级别使用它,对整个类的所有测试方法进行参数化

两组数据组合

两组数据参数化,从下往上执行

pytest-fixture

1.Fixture 显示调用

2.Fixture 应用usefixtures

3.autouse=True自动激活

4.可以使用多个fixture

5.可以嵌套fixture


 

55:00

fixture结合parametrize+yaml进行搜索接口 测试

读取url

读取yaml文件,请求access_token,在test里create_tag

import pytest
import requests
import os
import yamldef _base_data(file_name):cur_path = os.path.dirname(os.path.realpath(__file__))yaml1 = os.path.join(cur_path, file_name)f1 = open(yaml1)  # 打开yaml文件data = yaml.load(f1, Loader=yaml.FullLoader)  # 使用load方法加载return data@pytest.fixture(autouse=True)
def get_base_data():base_data = _base_data('tag.yml')for v in base_data.values():  #读值print(v)return vtest_user_data2 = [{"tag": {"name": 'mou1moumou'}},{"tag": {"name": 'maimai2'}},{"tag": {"name": 'sl2ience'}}]@pytest.fixture(autouse=True)
def query_param(request):return request.param@pytest.mark.parametrize("query_param", test_user_data2, indirect=True)
def test_tag(get_base_data, query_param):method = get_base_data.get('method')url = get_base_data.get('url')params = get_base_data.get('param')res = requests.request(method=method, url=url, params=params)data = res.json()access_token = data['access_token']tag_params = query_paramresponse = requests.post('https://api.weixin.qq.com/cgi-bin/tags/create?access_token='+access_token, json=tag_params)assert 'tag' in response.json()

读取测试数据

读取多个测试数据,待解决!
import yaml
import os
import pytestdef _base_data(file_name):cur_path = os.path.dirname(os.path.realpath(__file__))yaml1 = os.path.join(cur_path, file_name)f1 = open(yaml1)  # 打开yaml文件data = yaml.load(f1, Loader=yaml.FullLoader)  # 使用load方法加载return data@pytest.fixture(scope="module")
def get_test_data():test_data = _base_data('tag_data.yml')test_user_data2 = test_data.get('test_user_data2')return test_user_data2@pytest.mark.parametrize("tag_data", get_test_data(), indirect=True)
def test_functionality(tag_data):# test_case 是一个字典,包含 'name', 'input', 'expected_output' 等键response= requests.get(url='https://api.weixin.qq.com/cgi-bin/token', param={'grant_type': 'client_credential','appid': 'wx2e193b26f5edc5cf','secret': '99fe9aa25e42f30fa81c5d83816e4fc7'})access_token = response['access_token']response_tag = requests.post('https://api.weixin.qq.com/cgi-bin/tags/create?access_token=' + access_token, json= tag_data)print(response_tag)

附:fixture工厂模式

私有方法

html测试报告

安装 

pip install pytest-html

 执行

pytest --html=report.html -vs test_yml_func.py

在当前目录生成report.html

Allure 见其他文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384059.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Can we Deploy Web Application in Azure OpenAI of Production Level

题意&#xff1a;我们可以在Azure OpenAI中部署生产级别的Web应用程序吗 问题背景&#xff1a; I have created azure ai search service and used Text split skillset and made index. I also deployed a web Application but have a question that If I want to create to …

【React】JSX 实现列表渲染

文章目录 一、基础语法1. 使用 map() 方法2. key 属性的使用 二、常见错误和注意事项1. 忘记使用 key 属性2. key 属性的选择 三、列表渲染的高级用法1. 渲染嵌套列表2. 条件渲染列表项3. 动态生成组件 四、最佳实践 在 React 开发中&#xff0c;列表渲染是一个非常常见的需求。…

队列的实现

概念与结构 概念&#xff1a;只允许在⼀端进行插入数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out)。 入队列&#xff1a;进行插入操作的⼀端称为队尾。 出队列&#xff1a;进行删除操作的⼀端称为队头。 …

使用echo写入多行文字到文件时换行的处理

目标 想使用echo写入如下内容到文件program.c里 #include<stdio.h> int main(){printf("hello!\n"); } 需要处理 1、如何处理行换 2、代码中的换行如何处理 实际例子 创建文件夹 mkdir test cd test chmod 777 . 创建文件写入内容 查看 cat -n program.c…

基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 粒子群优化算法&#xff08;PSO&#xff09; 4.2 分组卷积神经网络&#xff08;GroupCNN&#xff09; 4.3 PSO优化GroupCNN 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行…

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

vue3前端开发-小兔鲜项目-form表单的统一校验

vue3前端开发-小兔鲜项目-form表单的统一校验&#xff01;实际上&#xff0c;为了安全起见&#xff0c;用户输入的表单信息&#xff0c;要满足我们的业务需求&#xff0c;参数类型等种种标准之后&#xff0c;才会允许用户向服务器发送登录请求。为此&#xff0c;有必要进行一次…

重拾CSS,前端样式精读-函数(颜色,计算,图像和图形)

前言 本文收录于CSS系列文章中&#xff0c;欢迎阅读指正 在计算机编程中&#xff0c;函数有着重要的作用和意义&#xff0c;它可以实现封装&#xff0c;复用&#xff0c;模块化&#xff0c;参数等功能效果&#xff0c;在如何在CSS中写变量&#xff1f;一文带你了解前端样式利…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…

Python升级打怪—Django入门

目录 一、Django简介 二、安装Django 三、创建Dajngo项目 (一) 创建项目 (二) 项目结构介绍 (三) 运行项目 (四) 结果 一、Django简介 Django是一个高级Python web框架&#xff0c;鼓励快速开发和干净、实用的设计。由经验丰富的开发人员构建&#xff0c;它解决了web开…

学习笔记-系统框图简化求传递函数公式例题

简化系统结构图求系统传递函数例题 基础知识回顾 第四讲 控制系统的方框图 (zhihu.com) 「自控原理」2.3 方框图的绘制及化简_方框图化简-CSDN博客 自动控制原理笔记-结构图及其等效变换_结构图等效变换-CSDN博客 例子一 「自控原理」2.3 方框图的绘制及化简_方框图化简-CS…

PYTHON学习笔记(八、字符串及的使用)

目录 1、字符串 1.1、字符串的常用操作 1.2、格式化字符串 1.2.1、占位符格式化字符串 1.2.2、f-string格式化字符串 1.2.3、str.format( )格式化字符串 1.3、数据的验证 1.4、正则表达式 1.5.1元字符 1.5.2限定符 1.5.3其他字符 1.5.4re模块 1、字符串 1.1、字符…

文件解析的终极工具:Apache Tika

文件解析的终极工具&#xff1a;Apache Tika Apache Tika 简介 Apache Tika 是一个开源的、跨平台的库&#xff0c;用于检测、提取和解析各种类型文件的元数据。 它支持多种文件格式&#xff0c;包括文档、图片、音频和视频。 Tika是一个底层库&#xff0c;经常用于搜索引擎…

Python | Leetcode Python题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…

【Linux】基本指令1

文章目录 1. find2. which3. alias4.whereis5.grep6. sort 、uniq7. linux怎么编辑文件中的内容 1. find 1.1 find: 查找文件所在的位置。&#xff08;当我们进行find搜索的时候&#xff0c;可能需要访问磁盘进而导致效率低下。&#xff09; 1.2 find / file.txt 在Linux系统是…

室内消防逃生通道占用检测AI算法:科技筑防,守护生命通道

随着城市化进程的加快&#xff0c;高层建筑和大型公共场所的数量急剧增加&#xff0c;消防安全问题愈发凸显。其中&#xff0c;室内消防逃生通道的畅通性直接关系到火灾发生时人员的安全疏散。然而&#xff0c;由于各种原因&#xff0c;如杂物堆放、车辆停放等&#xff0c;消防…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

== 与 equals 的区别

概念 它的作用是判断两个对象的地址是不是相等&#xff0c;判断两个对象是不是同一个对象基本数据类型比较的是值是否相等引用数据类型比较的是内存地址是否相等 equals() 概念 它的作用也是判断两个对象是否相等。但它一般有两种使用情况&#xff1a;情况1&#xff1a;类没有…

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…

洛谷 P9854 [CCC 2008 J1] Body Mass Index

这题让我们计算出 BMI 值&#xff0c;随后判断属于哪个等级。 BMI 值计算公式&#xff1a; ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​。 BMI 范围 对应信息 …