自动化测试框架 pytest
myzbx 2025-01-05 19:02 41 浏览
对我来说 pytest 可以说是 Python 语言中我最喜欢的测试框架了,它功能特别强大,却又简单易上手,支持许多的插件可以扩展额外的功能。这篇文章来单独介绍下 pytest 的使用。
目录
- 安装
- 用例编写
- 测试执行(命令行及程序化执行、运行参数介绍)
- conftest.py 文件介绍(包括 fixture 的使用)
安装
pip install pytest用例编写
只有满足以下条件才会被识别为 pytest 用例:
- 文件名需要以 test_ 开头或 _test 结尾
- 测试函数或方法需要以 test_ 开头
- 如果要把测试用例放在类中,测试类需要以 Test 开头
示例:
文件 test_example.py
def test_of_example():
    text = "example"
    assert len(text) == 7
    
    
class TestAdd:
    def test_of_add(self):
        result = 1 + 1
        assert result == 2具体的测试用例写起来很简单,不重点介绍了,今天要重点介绍的是下面的内容。
测试执行
命令行运行
如果要运行项目所有的测试用例,可以直接在命令行运行 pytest,如果要运行指定的文件则在 pytest 后直接加测试文件路径即可,路径后还可以用“::”连接测试类和测试方法或函数来直接指定特定的测试类或测试用例运行。比如要运行上面示例代码的 test_of_add 测试用例,可以这样运行:
pytest test_example.py::TestAdd::test_of_add程序化运行
pytest 提供了程序化执行测试的入口 pytest.main(),执行效果和命令行运行几乎没有区别。pytest.main() 可以将参数以列表的形式传入,比如要通过程序化运行的方式指定测试用例可以这样写:
pytest.main(["test_example.py::TestAdd::test_of_add"])运行参数
下面列举一些常用的 pytest 运行参数
| 参数 | 参数描述 | 
| -v | 打印详细的运行日志。加上此参数终端会打印每条用例的运行结果 | 
| -s | 打印控制台输出内容。带上此参数运行时才会打印代码中 print() 输出语句 | 
| -m | 运行打了指定标记的用例。每条测试用例或测试类都可以用 @pytest.mark.xxx 的方式来打标记,然后可以使用 pytest -m xxx 的方式来运行打了标记的用例。支持使用 and(与)、or(或)、not(非) 来筛选用例 | 
| --lf | 运行上次失败的用例 | 
| --ff | 先运行上次失败的用例,再运行其它用例 | 
| --reruns | 失败重跑。需安装 pytest-rerunfailures 插件,后面跟需重试的次数。可以另外跟 --reruns_delay 参数设置重试之前等待秒数 | 
| --html | 生成 html 测试报告。需安装 pytest-html 插件,后面跟测试报告存放的路径。可以另外跟 --self-contained-html 参数来生成单独的 html 报告,html 样式等文件不另外存放 | 
pytest.ini 配置文件
pytest.ini 配置文件可以用来存放测试运行时比较固定的一些参数等内容。
pytest.ini 文件需放在项目根目录。
pytest.ini 比较常见的配置内容:
# pytest.ini
[pytest]
markers:
    example: 测试用例示例
    add: 加法
    
testpaths:
    testcases/
addopts:
    -s
    -v
    --lf
    --capture=fd
    --self-contained-html
上面配置文件中,markers 配置了测试用例标记,如果测试用例进行了标记此处没有列出的话,运行测试时会有警告错误,可以添加 filterwarnings: ignore::UserWarning 忽略警告错误。testpaths 可以指定测试用例路径,如果指定了测试用例路径,运行时不需要再指定测试文件路径。addopts 可以配置命令行参数,此处配置了命令行参数后,运行的时候不需再额外传参数,如果运行时也传有参数,则会取两者的合集。
重点内容——conftest.py 文件
conftest.py 文件是一个很神奇的文件,它可以极大地方便你的测试用例编写,简化你的自动化测试流程。先说下它的一些特点:
- 命名固定,不可随意更改
- 作用域为其所在的整个文件夹,包括子文件夹。所以当其存在于根目录时,它可以作用于整个项目
- 可以存在多个 conftest.py 文件,但每个文件夹只能存在唯一一个
- conftest.py 不能被其它文件导入,在代码运行时 pytest 会自动导入,并在文件夹内其它文件运行之前运行
conftest.py 主要是和 fixture 结合来使用,一般用法就是在 conftest.py 文件内存放 fixture 函数,然后在测试文件内调用,来实现测试环境的准备或清理等操作。当 conftest.py 存在于根目录时,里面的 fixture 函数可以被整个项目的文件调用。下面我们需要先简单介绍下 fixture。
@pytest.fixture()
当一个函数使用 @pytest.fixture() 装饰之后,这个函数就是 fixture 函数,它可以用来执行一些测试用例初始环境配置或测试环境清理的工作,类似 unittest 的 setup 和 teardwon 的功能。它可以设置作用范围,可设置的作用范围有 session(会话级别,整次测试执行一次)、module(模块级别,调用该函数的整个测试文件运行之前执行一次)、class(类级别,整个类运行一次)和 function(函数/方法级别,默认,每个函数或方法都会调用一次)。
当我们要使用 fixture 函数时,可以直接将它函数或方法名作为参数传入,也可以使用 @pytest.mark.usefixtures('fixture_name') 装饰器,还可以直接使用 @pytest.fixture(autouse=True) 自动使用。
下面上代码示例:
# conftest.py 文件
import pytest
@pytest.fixture()
def my_function_fixture():
    print("测试开始")
    yield
    print("测试结束")
@pytest.fixture(scope="session", autouse=True)
def my_session_fixture():
    print("整个测试开始")
    yield
    print("整个测试结束")
#====================================================#
# example_test.py 文件
import pytest
@pytest.mark.usefixtures("my_function_fixture")
def test_of_example():
    text = "example"
    assert len(text) == 7
class TestAdd:
    def test_of_add(self, my_function_fixture):
        result = 1 + 1
        assert result == 2上面代码运行 pytest -s -v 之后会输出以下内容
testcases/example_test.py::test_of_example 整个测试开始
测试开始
PASSED测试结束
testcases/example_test.py::TestAdd::test_of_add 测试开始
PASSED测试结束
整个测试结束可以看到作用范围为 session 的 my_session_fixture 只在整个测试运行之前和之后执行了一次,作用范围为 function 的 my_function_fixture 在两个用例运行之前和之后都分别执行了一次。
yield 在 fixture 函数内起到了 return 的作用,但是它更大的作用是分割了测试执行之前和之后的代码,如示例的运行结果,yield之前的代码会在作用范围的代码运行之前执行,yield 之后的代码会在作用范围的代码运行之后执行,所以 fixture 函数可以实现类似 setup 和 teardown 的作用。
conftest.py 和 fixture 结合来实现 UI 自动化特别方便,可以使用 fixture 来实现测试之前手机连接,测试应用的安装等操作,还可以实现每条用例都重启应用,以保证每条用例都不受上一条用例的影响等。
下一篇文章会结合 pytest 和 uiautomator2 来完整地实现一个 UI 自动化项目。
相关推荐
- 如何设计一个优秀的电子商务产品详情页
- 
        加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面... 
- 怎么在JS中使用Ajax进行异步请求?
- 
        大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加... 
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
- 
        前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很... 
- 前端监控 SDK 开发分享_前端监控系统 开源
- 
        一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的... 
- Ajax 会被 fetch 取代吗?Axios 怎么办?
- 
        大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch... 
- 前端面试题《AJAX》_前端面试ajax考点汇总
- 
        1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实... 
- Ajax 详细介绍_ajax
- 
        1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的... 
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
- 
        dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver... 
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
- 
        接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝... 
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
- 
        时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预... 
- 2021年超详细的java学习路线总结—纯干货分享
- 
        本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象... 
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
- 
        Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人... 
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
- 
        作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易... 
- 最贱超级英雄《死侍》来了!_死侍超燃
- 
        死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/... 
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
- 
        一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求... 
- 一周热门
- 最近发表
- 标签列表
- 
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
 
