Pytest测试框架快速搭建

news2024/11/16 1:50:27

一、介绍

pytest是一个非常成熟的Python测试框架,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等。

二、安装

 安装命令:pip install pytest

验证安装:pytest --version

安装测试报告模板:pip install pytest-html

安装失败后重新执行模板: pip install pytest-rerunfailures

三、pytest约束规则

1、文件名要满足test_*.py格式或*_test.py格式。

2、测试类以Test开头,并且不能带有 init 方法(注意:定义class时,需要以T开头,不然pytest是不会去运行该class的,正是由于有Test开头做标识,不需要init方法启动(个人理解))

3、类中,方法以test开头,可以包含一个或多个test_开头的函数。 在执行pytest命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。

4、批量执行,脚本名以 test 开头。

四、编写脚本

import pytest
 
# 被测试函数
def add(a, b):
    return a + b
 
class TestCase:
    # 测试脚本
    def test_add(self):
        assert 3 == add(1, 2)
 
 
if __name__ == '__main__':
    pytest.main()

通过断言,检验定义的方法 add 输出的结果是否符合预期

五、运行

方式:输入命令:pytest  参数 命令 脚本

 

 collected 2 items :表示加载到两个测试用例;
六、常用参数

1、-v 输出详细的信息

2、-s 输出测试函数或测试方法print内容

3、-k 如: -k “add” 执行所有测试用例名中含有“add”的用例

4、-m按分类执行测试点; 如 -m a  则对标记为a 的用例进行测试,不标记为a 的用例不会被执行;

5、-x  执行中有fail失败的用例,立刻停止

6、--maxfail  执行失败的最大次数,如果设定最大失败的次数是2, 那么如果两个用例执行失败, 后面的会停止执行;如 pytest --maxfail =2

7、–tb=line 错误信息在一行展示

七、参数化

 例如进行接口测试时,测试登录功能,上传图片功能等;可能只是字符串长度不一样、字符种类不一样,文件大小不一样,或是否为空等,但是执行的用例是一样的,这样为了方便,不用重复写;可以使用参数化,把不同的参数,传到同一个用例里。      

@pytest.mark.parametrize('a',[1,2,3,4,5])
def test(a):
    print(a)
 
if __name__ == '__main__':
    pytest.main()

八、前置后置

模块级:该方法表示只能类外面执行用例过程中,作用范围为当前模块,当前模块执行前后都运行一次前置和后置;无论有多少个用例,模块级的前置和后置都只跑一遍。

setup_module(),前置,模块执行前运行一次;

teardown_module(),后置,模块执行后运行一次;

函数级:该方法表示在类外面执行用例过程中,作用范围为当前面模块中的每一个测试函数,模块中的每个用例执行前后分别运行一次。

setup_function(),前置,每个用例执行前运行一次

teardown_function,后置,每个执行后运行一次;

类级别:作用范围为当前类中的每一个测试用例,当前类执行前后分别运行一次。只执行1次测试前置和测试后置

setup_class(),前置,类中执行前运行一次

 teardown_class,后置,类中执行后运行一次;

方法级:作用范围为类中的每个测试方法,每次执行测试用例前,测试前置和测试后置都会执行一次。

setup_method()或setup();前置,每个用例执行前运行一次

teardown_method()或teardown();后置,每个执行后运行一次;

import pytest
 
def setup_module():
    print("\n模块前置!")
 
def teardown_module():
    print("模块后置!")
 
def setup_function():
    print("函数前置!")
 
def teardown_function():
    print("函数后置!")
 
 
@pytest.mark.parametrize('a',[1,2,3,4,5])
def testModule(a):
    print(a)
 
 
@pytest.mark.parametrize('a',[6,7])
def testAdd(a):
    print(a)
 
 
class Testcase:
    def setup_class(self):
        print("类前置")
 
    def teardown_class(self):
        print("类后置")
 
    def setup_method(self):
        print("方法前置!")
 
    def teardown_method(self):
        print("方法后置!")
 
    @pytest.mark.parametrize('a', [8, 9])
    def test(self,a):
        print(a)
 
 
if __name__ == '__main__':
    pytest.main()

九、测试实例

        一、验证登录的 测试用例

 

import pytest
import requests
 
#创建session对象,用于实现会话保持
req = requests.session()
 
#登录 接口
#提前在模块前置把要测试登录接口的数据录入到data里,如用户名过长、非法字符、过短,及密码、预期结果等;data的每组数据为用户名、密码、预期结果
#通过参数化,就可以对所有用例运行一遍,把返回结果与预期结果比对;
#@pytest.mark.parametrize('data',data)
def test_login(data)
    url = 'http://192.168.0.1:8080/login'
    data ={'username':data[0],'pwd':data[1]}
    r = requests.post(url,data)
    assert data[2] == r.text
    print(r.text)
 
 
if __name__ == '__main__':
    #运行,并保存报告
    pytest.main(['-v',-f'--html={report_path}/{t}.html',case_path])

二、 验证 template.wps.com 的搜索接口:
把测试用例写好放到:E:/automationtest/searchParameter.xls ,为了方便处理,Excel表格每列一个参数;参数部分如图:
 

  代码:

import xlrd
import pytest
import requests
 
#获取工作薄文件对象
wb = xlrd.open_workbook("E:/automationtest/searchParameter.xls")
#返回Excel文件中所有的sheet对象,通过对象调用 name 返回sheet名称
sheets = wb.sheets()
 
#sheet名获取指定的表
sheet = wb.sheet_by_name("Sheet1")
 
#用list 保存从xls表读取出来的数据,这些都是要做接口测试的参数;
list=[]
for index in range(1,sheet.nrows):
    list.append(sheet.row_values(index,7,14))
    index = index + 1
 
for index in list:
    print(index)
 
#第n行,第m列的元素
#   value = sheet.cell(n,m).value
 
 
 
#取出所有参数,做参数化;
'''
#不能用下面这种方式做;否则就是所有参数的全组合;
#这种类型的参数化是所有的组合;不是4列;
@pytest.mark.parametrize("platf", platf)
@pytest.mark.parametrize("excludePayTemplate", excludePayTemplate)
@pytest.mark.parametrize("is_excluded", is_excluded)
@pytest.mark.parametrize("excluded_member_discount", excluded_member_discount)
@pytest.mark.parametrize("keyword", keyword)
@pytest.mark.parametrize("start", start)
@pytest.mark.parametrize("count", count)
'''
@pytest.mark.parametrize("list", list)
def testSearch(list):
    url = "https://template.wps.com/server/pf/template"
    param = {'platf': list[0],'excludePayTemplate':list[1],'is_excluded':list[2],'excluded_member_discount':list[3],'keyword':list[4],'start':list[5],'count':list[6]}
    response = requests.get(url=url,params=param)
#输出响应码和响应信息;也可以把预期结果当做一个参数传进来做断言判断
    print(response.status_code,'  ',response.text,'\n')
 
if __name__ == "__main__":
    pytest.main(["-s", "testSearch.py"])

  项目结构: 

case:保存每个接口的测试脚本;

common:保存公共模块,如数据库操作、CVS文件读取等

data:保存每个接口的测试用例

report:用于保存测试报告
 

十、fixture         

介绍:

前面提到前置、后置;编写用例时候需要用到用例的前置和用例的后置,可以用setup_class和teardown_class等帮助我们完成,但是不够完善而且灵活性不够强。例如:一个calss中有3条用例,其中2条需要登录,1条不需要登录,这个时候如果在用setup和teardown来做就有点不方便。fixture可以用做测试 用例的前置和后置操作,且fixture命令规范没有setup、teardown的格式。可以随意命名。控制fixture的前置和后置操作是通过yield关键字进行区分,代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。且fixture不要求前后置同时存在,可以只存在前置或只存在后置。fixture如果有后置内容,无论遇到什么问题,都会进行执行后置的代码。

 使用:

用 @pytest.fixture()  装饰器声明一个函数是 fixture,如果测试函数的参数列表中包含 fixture 名,那么 pytest 就会检测到,并在运行测试函数之前运行它,fixture 可以返回数据给测试函数。
        
参数列表:

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)

scope 可选参数,默认为 function ,可选值为 function、class、module、session,范围依次增加。session的作用域是整个测试会话,即开始执行pytest到结束测试。

autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture

name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name

 

import pytest
 
@pytest.fixture
def login():
    print("先登录")
    yield
    print("退出登录 ")
 
 
def test_s1(login):
    print("测试用例 1:登录后的其它操作!")
 
 
def test_s2():  # 不传 login
    print("测试用例 2:不需要登录,")
 
 
 
 
if __name__ == '__main__':
        pytest.main()

十一、HTML报告生成

 一种是Pytest的 pytest-html插件,另一种是 allure-pytest插件;

使用pytest-html生成html测试报告:

安装pytest-html插件:pip install pytest-html

运行命令: --html=reportname.html,其中 reportname为要生成报告的名称。

如:针对 test.py 生成报告,在 terminal 输入:pytest --html=report.html test.py

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合腾讯企业邮箱/企业微信邮箱

springboot整合腾讯企业邮箱/企业微信邮箱 登录后点击“客户端设置” 2.勾选红框中选项并保存 3.点击微信绑定并绑定微信 4.绑定微信后点击生成新密码并保存(复制生成的密码后面会使用) 5.将配置复制到代码中 <dependency><groupId>com.sun

凤凰架构阅读记录-三(分布式算法)

1.Paxos 世界上只有一种共识协议&#xff0c;就是 Paxos&#xff0c;其他所有共识算法都是 Paxos 的退化版本。 算法流程: 1.提案节点&#xff1a;称为 Proposer&#xff0c;提出对某个值进行设置操作的节点&#xff0c;设置值这个行为就被称之为提案&#xff08;Proposal&a…

【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率)

【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率) 目录 【海量数据挖掘/数据分析】 之 K-NN 分类(K-NN、K-NN实例、准确率评估方法、准确率、召回率) 一、 K-NN 简介 二、K-NN 分类 三、K-NN 分类实例 1、1-NN 分类 : 此时 A 类别…

leetcode 859. Buddy Strings(同伴字符串)

给出字符串s 和 goal, 判断交换 s 中的一对字母是否能得到goal. 必须是不同位置字母的交换。 思路&#xff1a; 先考虑边界情况&#xff0c; s 和 goal 的长度不相等时&#xff0c;s 怎么交换都不会得到goal. s 的长度 < 2时&#xff0c;没有可交换对象&#xff0c;肯定是…

【力扣】94、二叉树的中序遍历

94、二叉树的中序遍历 注&#xff1a;二叉树的中序遍历&#xff1a;左根右&#xff1b; // 非递归&#xff1a; var inorderTraversal function (root) {const arr [];//创建新数组&#xff1b;const stack [];//创建一个栈道&#xff1b;let o root;while( stack.length |…

办公实现降本增效,可借助微服务开源平台的力量!

在如今的快节奏发展时代&#xff0c;低代码开发平台拥有了一个广阔的发展天地&#xff0c;逐渐在通信业、医疗、物流、高校等众多大中型企业中获得一个立足之地&#xff0c;是助力企业提质、降本、增效的得力助手。微服务开源平台可以让企业实现这一目的&#xff0c;那么对于企…

AMBER分子动力学能量优化与分析、结合自由能计算专题

AMBER分子动力学能量优化与分析、结合自由能计算专题 第一天 时间:AM9:00~9:50 内容:六.分子动力学入门理/论 教学目标&#xff1a;了解本方向内容、理论基础、研究意义。 主要知识点:4分子力学简介 4.1分子力学的基本假设 4.2分子力学的主要形式 5分子力场 5.1分子力场的简…

passware kit forensic使用

一、从外部注册表文件提取密码 适用于不联网的情况下&#xff0c;例如2023盘古石杯的NAS取证 找到Windows/System32/config并在本地打开 将路径填充到config folder中 跑出来了John电脑对应的密码是paofen&#xff0c;NAS的密码是P88w0rd 后续遇见再补

Linux - 那些年测试服务器带宽的 3 种方式

方式一 speedtest-cli wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod x speedtest-cliorcurl -Lo speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.pychmod x speedtest-c…

【Linux】基础开发工具——yum篇

目录 &#x1f4d6;Linux下安装软件的三种方案&#x1f4f0;源代码安装&#x1f4f0;rpm安装&#x1f4f0;yum安装 &#x1f4d6;Linux软件包管理器yum&#x1f4f0;rz、sz&#x1f4f0;查看软件包&#x1f4f0;软件安装&#x1f4f0;软件删除 &#x1f4d6;yum源问题&#x1f…

Hadoop:DataNode启动失败:Initialization failed for Block pool

一、问题发现 ​在启动Hadoop集群后&#xff0c;发现原本应该是启动三台机子的数据节点&#xff0c;结果只有一台node2成功启动&#xff0c;另外两台&#xff08;node1、node3&#xff09;并没有启动&#xff0c;如下两图所示&#xff1a; 问题描述&#xff1a; ​确认配置信…

day3 QT对话框

目录 QDialog 标准对话框&#xff08;Standard Dialogs&#xff09;&#xff1a; 内置对话框&#xff08;Built-in Dialogs&#xff09;&#xff1a; 自定义对话框&#xff08;Custom Dialogs&#xff09; 示例 myqdialog.h widget.h myqdialog.cpp widget.cpp QDialog Q…

springboot实现网络图片转存的临时文件后上传腾讯云cos

有时复制一张图片url&#xff0c;想转存到自己的腾讯云cos保存。 实现思路是&#xff1a;先将网络图片url保存到当前项目一个临时文件夹里&#xff0c;然后发送腾讯云cos对象存储&#xff0c;返回一个url&#xff0c;最后&#xff0c;删除该临时文件图片。 测试结果 1. util实…

【C】分支和循环语句

目录 【1】什么是语句 【2】分支语句&#xff08;选择结构&#xff09; 【2.1】if 语句 【2.1.1】语法结构 【2.1.2】悬空else 【2.1.3】书写形式的对比 【2.1.4】练习 【2.2】switch 语句 【3.2.1】语法结构 【3.2.2】在switch语句中的 break 【3.2.3】default子句…

Nginx【Nginx场景实践(fair模块安装、Nginx配置故障转移、跨域问题、跨域问题解决)】(九)-全面详解(学习总结---从入门到深化)

目录 Nginx场景实践_fair模块安装 Nginx场景实践_Nginx配置故障转移 Nginx场景实践_跨域问题 Nginx场景实践_跨域问题解决 Nginx场景实践_fair模块安装 模块介绍 fair采用的不是内建负载均衡使用的轮换的均衡算法&#xff0c;而是可以根据 页面大小、加载时间长短智能的进…

C++(Day5)

思维导图&#xff1a; 全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类…

客户案例:构建可靠海外通邮系统,护航教育行业信息安全

►►►客户背景 某985高校作为一所国内知名的高等教育机构&#xff0c;拥有优质的师生资源和丰富的教学经验&#xff0c;积极开展与国外高校的合作交流&#xff0c;组织师生参与出国交流、学术考察等活动&#xff0c;在跨境科研合作和人才培养等领域开展深入合作&#xff0c;推…

2023-07-03:讲一讲Redis缓存的数据一致性问题和处理方案。

2023-07-03&#xff1a;讲一讲Redis缓存的数据一致性问题和处理方案。 答案2023-07-03&#xff1a; 数据一致性 当使用缓存时&#xff0c;无论是在本地内存中缓存还是使用 Redis 等外部缓存系统&#xff0c;会引入数据同步的问题。下面以 Tomcat 向 MySQL 中进行数据的插入、…

《操作系统》- 操作系统的发展与分类

目录 前言一、手工操作阶段1.1 人工操作方式1.2 脱机输入/输出方式 二、批处理阶段2.1 单道批处理系统2.2 多道批处理系统 三、分时操作系统四、实时操作系统五、微机操作系统的发展六、总结 前言 从第一台计算机诞生至今已过去70多年了&#xff0c;在这期间&#xff0c;计算机…

Python程序设计基础:程序流程控制(二)

文章目录 一、循环结构1、for语句2、while语句3、break和continue语句4、循环结构中的else语句5、循环的嵌套 一、循环结构 最基本的复杂工作就是循环&#xff0c;要想写出的程序能够执行更加复杂的工作&#xff0c;就需要将循环问题进行实现。 1、for语句 for语句用一个循环…