![](https://img-blog.csdnimg.cn/2b2ba68cae054c96ad4d9eb09c033b73.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Pytest学习笔记
文章平均质量分 77
黎晟的pytest学习笔记
_黎晟
Road under foot, heart in distant!
展开
-
Pytest学习笔记(25)-重复执行用例插件 pytest-repeat
前言日常业务测试过程中,经常会遇到偶现的bug,需要重复操作来复现bug自动化测试同样如此,也会需要重复执行用例,来确定用例的稳定性、成功性和复现偶现的bugpytest-repeat 是 pytest 的一个插件,可以重复的执行单个测试或多个测试,也可以自定义重复执行的次数官方文档:https://pypi.org/project/pytest-repeat/前提条件Python 2.7、3.5+ 或 PyPypytest 3.6 或更高版本插件安装pip3 in原创 2022-03-02 17:43:31 · 857 阅读 · 0 评论 -
Pytest学习笔记(24)-使用 pytest-xdist 如何保证 scope=session 的 fixture 在多进程运行时仍然只运行一次
背景使用 pytest-xdist 分布式插件可以加快运行,充分利用机器多核 CPU 的优势,也提高了资源利用率将常用功能放到 fixture,可以提高复用性和维护性做接口自动化测试的时候,通常我们会将登录接口放到 fixture 里面,并且 scope 会设置为 session,让他全局只运行一次但是当使用 pytest-xdist 的时候,scope=session 的 fixture 无法保证只运行一次,官方也通报了这一问题官方介绍pytest-xdist 的设计使每个工作进程将执行原创 2022-03-01 19:09:58 · 2105 阅读 · 3 评论 -
Pytest学习笔记(23)-pytest-xdist的原理和流程
pytest-xdist的原理xdist通过产生一个或多个由master控制的workers来工作每个workers负责执行完整的测试收集,然后按照master的指示运行测试master本身不执行任何测试pytest-xdist的流程第一步:创建workermaster在测试会话开始时产生一个或多个workersmaster和worker节点之间的通信,使用execnet及其网关为workers执行代码的,可能是远程的或本地的机器第二步:收集测试项用例每个worker本身都是一原创 2022-02-28 20:43:12 · 759 阅读 · 0 评论 -
Pytest学习笔记(22)-分布式执行pytest-xdist插件
前言在日常功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一半,如果有10个小伙伴,那么执行时间就会变成十分之一,大大节省了测试时间为了节省项目测试时间,10个测试同时并行测试,这就是分布式执行同样道理,当我们自动化测试用例非常多的时候, 一条条按顺序执行会非常慢,pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而大大节省自动化测试执行原创 2022-02-28 16:54:13 · 1262 阅读 · 0 评论 -
Pytest学习笔记(21)-使用allure.dynamic动态生成标题、描述
前言前面提到,可以使用@allure.title 和 @allure.description 给测试用例添加标题和描述在用例里面也可以动态更新标题和详情使用allure.dynamic.description 和 allure.dynamic.title 实现源码class Dynamic(object): @staticmethod def title(test_title): plugin_manager.hook.add_title(test_title原创 2022-02-26 19:09:40 · 1369 阅读 · 0 评论 -
Pytest学习笔记(20)-参数化parametrize结合allure.title()动态生成用例标题
前言使用参数化,allure报告默认的用例标题为用例名称,这样可读性较差参数化使用ids,也并不能完全解决问题(还是会保留用例名称)使用allure.title()装饰器写死标题的方式,用例维护成本较高所以希望能把parametrize参数化数据驱动结合title使用,下面会以登录用例为例来详细介绍参数化默认的标题代码data_login = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd原创 2022-02-25 18:58:20 · 1766 阅读 · 2 评论 -
Pytest学习笔记(19)-allure命令行参数
本文主要介绍allure支持的一些命令行参数的用法查看参数帮助文档安装allure后,可以通过allure -h命令查看allure -hallure命令语法allure [options] [command] [command options]options 列表Options: --help Print commandline help. # 打印命令行帮助文档 -q, --quiet Switch on the quiet mode. # 切换至安静模原创 2022-02-24 18:59:58 · 1148 阅读 · 0 评论 -
Pytest学习笔记(18)-allure之清空测试报告
前言使用allure生成测试报告,当报告存放路径相同时,报告数据是会累加,会导致测试报告内展示了之前运行的用例情况同理,当你的用例名称修改后,再次执行后,也会保留上一次的用例运行记录不同用例文件,报告路径相同准备 test_report_1.py 和 test_report_2.py 两个用例文件,内容如下:#!/usr/bin/env python3# -*- coding:utf-8 -*-""" __File__ = test_report_1.py _原创 2022-02-23 16:31:31 · 1717 阅读 · 0 评论 -
Pytest学习笔记(17)-allure之@allure.suite()
@allure.suite()、@allure.parent_suite和@allure.sub_suiteallure也提供了测试套件的功能,但是因为已有epic, feature, story,所以不常有,本文进行简单了解。源码def suite(suite_name): return label(LabelType.SUITE, suite_name)def parent_suite(parent_suite_name): return label(LabelType.PA原创 2022-02-23 14:58:09 · 1027 阅读 · 0 评论 -
Pytest学习笔记(16)-allure之@allure.severity()
@allure.severity()写测试用例时需要划分用例等级,allure同样提供了划分等级的功能,且可以展示到测试报告内老规矩上源码# allure.pyfrom allure_commons._allure import severityfrom allure_commons.types import Severity as severity_level# _allure.pydef severity(severity_level): return label(LabelTy原创 2022-02-22 21:43:51 · 982 阅读 · 0 评论 -
Pytest学习笔记(15)-allure之@allure.epic()、@allure.feature()和@allure.story()
@allure.epic()、@allure.feature()和@allure.story()本次主要介绍如何使用allure来灵活的标记测试。Pytest 通过使用标记装饰器@pytest.mark来实现,但是不会展示到测试报告内Allure 则提供了 3 种类型的标记装饰器来标记测试,并且可以同步展示到测试报告内BDD风格的标签严重程度的标签自定义的标签BDD风格的标签**@allure.epic:**敏捷里面的概念,定义史诗,相当于module级的标签**@allure原创 2022-02-18 18:37:46 · 7474 阅读 · 0 评论 -
Pytest学习笔记(14)-allure之@allure.link()、@allure.issue()和@allure.testcase()
@allure.link()、@allure.issue()和@allure.testcase()本次主要介绍如何将将测试报告与bug管理工具或测试管理系统关联,通过使用@allure.link、@allure.issue、@allure.testcase实现。先看下源码最上游的源码def link(url, link_type=LinkType.LINK, name=None): return safely(plugin_manager.hook.decorate_as_link(url=原创 2022-02-16 16:29:18 · 1358 阅读 · 0 评论 -
Pytest学习笔记(13)-allure之allure.description()和@allure.title()
allure.description() 和@allure.title()前言前面介绍了allure的step和attach功能,本次来看下allure的另外两个功能:@allure.description()@allure.title()@allure.description()为测试用例添加详细描述,并展示到测试报告内,可以提高测试报告的可读性,使报告更加直观,通俗易懂语法主要有三种语法,如下:在测试用例下使用""“xxxx”""添加描述(添加普通描述-方法1)使用@all原创 2022-02-15 20:57:16 · 1168 阅读 · 0 评论 -
Pytest学习笔记(12)-allure特性·@allure.step()和allure.attach
allure.step()和allure.attach前言allure除了支持常用的pytest功能外( xfails、fixture、skips和skipif、parametrize),自身还有一些强大实用的功能。本次主要介绍step和attach功能,可以设置测试步骤及添加报告中的附件。@allure.step()Allure 报告的最重要的方面是它允许对每个测试用例的调用进行非常详细的步骤说明通过@allure.step装饰器来实现可以存储在您的测试之外,并在需要时仅导入Step 方原创 2022-02-14 20:42:11 · 2739 阅读 · 1 评论 -
Pytest学习笔记(11)-allure特性·环境配置和用例分类
前言pytest自动化测试中,要想报告内容丰富,优雅和可读性强,就需要与allure结合使用。allure报告有很多内置的特性,这些特性主要以配置文件、装饰器、函数等的方式使用,使我们的报告更加直观、详细。Environment环境变量,可以读取环境变量配置文件,并直观的展示到测试报告内。可以说是附加的功能,并没有什么实际效果,看需求而定即可。注意:默认无此功能如何添加环境变量通过environment.properties文件添加#environment.properties文件Bro原创 2022-02-12 15:49:13 · 1095 阅读 · 0 评论 -
Pytest学习笔记(10)-测试报告
测试报告前言在pytest中,如何生成html测试报告呢,pytest提供了pytest-html插件,可以帮助我们生成测试报告,当然,如果希望生成更加精美的测试报告,我们还可以使用allure生成报告,下面详细看看如何实现pytest-html插件安装pytest-html使用pip命令安装pip install pytest-html举个????使用方法很简单,在测试用例的目录下执行命令 pytest --html=reportname.html 即可执行效果如下:合并css原创 2022-02-10 18:22:29 · 617 阅读 · 0 评论 -
Pytest学习笔记(9)-失败重跑
失败重跑前言在进行自动化测试的过程中,我们一定会有这样的需求:希望失败的用例可以自动重跑在pytest中,提供了pytest-rerunfailures插件可以实现自动重跑的效果前提条件Python 3.6,最高 3.10,或 PyPy3pytest 5.3 或更高版本插件安装pip3 install pytest-rerunfailures -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com使用前了解命原创 2022-02-10 18:20:37 · 3803 阅读 · 0 评论 -
Pytest学习笔记(8)-Skip和Xfail
skip和xfail前言在实际使用中,经常会遇到需要跳过某些测试用例的情况,pytest提供了skip和ifskip来跳过测试skip标记在测试函数中使用示例:@pytest.mark.skip(reason=“跳过的原因,会在执行结果中打印”),举个????:import pytestdef test_1(): print("测试用例1")@pytest.mark.skip(reason="没写完,不执行此用例")def test_2(): print("测试用例2"原创 2022-02-10 18:16:16 · 655 阅读 · 0 评论 -
Pytest学习笔记(7)-参数化
参数化前言我们在实际自动化测试中,某些测试用例是无法通过一组测试数据来达到验证效果的,所以需要通过参数化来传递多组数据在unittest中,我们可以使用第三方库parameterized来对数据进行参数化,从而实现数据驱动测试,也可以使用DDT进行数据驱动而在pytest中,也提供了功能强大的@pytest.mark.parametrize装饰器来实现数据参数化Pytest参数化的方式pytest有三种传参方式:@pytest.mark.parametrize() 通过装饰器方式进行参数化(原创 2022-02-10 18:03:13 · 707 阅读 · 0 评论 -
Pytest学习笔记(6)-配置文件pytest.ini
配置文件pytest.ini前言很多 pytest settings 可以设置在 配置文件 ,它通常位于存储库的根目录或测试文件夹中pytest.ini 文件优先于其他文件,即使是空的pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行常用配置项markers它的作用是做注册标记,防止拼写错误。比如把@pytest.mark.smoke拼成@pytest.mark.somke,默认情况下。这不会引起程序错误。pytes原创 2022-02-09 22:21:46 · 1600 阅读 · 0 评论 -
Pytest学习笔记(5)-断言Assert和Assume
断言assert和assume前言pytest作为单元测试框架,自然少不了断言功能,在unittest中有丰富的断言方法,比如assertEqual()、assertIn()、assertTrue()、assertIs()等等,而在pytest中,并没有提供特殊的断言方法,而是直接使用python自带的关键字assert来进行断言操作。常用断言Pytest里的断言实际上就是Python中的assert断言方法,常用断言方法如下:assert xx :判断 xx 为真assert not xx原创 2022-02-08 20:29:15 · 2122 阅读 · 0 评论 -
Pytest学习笔记(4)-Fixture装置
Fixture装置前言传统的前后置处理方法,对处理前后置的场景是有一定的局限性。所以才引入fixture装饰器函数,fixture是pytest的核心功能,也是亮点功能,它可以灵活的处理很多特殊的场景fixture用途用于执行测试前后的初始化操作,比如打开浏览器、准备测试数据、清除之前的测试数据等等用于测试用例的前置条件,比如UI自动化的登录操作,读取config参数等用于测试用例之间的参数和数据传递fixture优势firture相对于unittest中的setup和teardown来原创 2022-02-08 20:26:02 · 419 阅读 · 0 评论 -
Pytest学习笔记(3)-Setup和Teardown
setup和teardown前言在做自动化的时候,常常有这样的诉求:用例执行前,需要重新启动一次浏览器用例执行结束时,需要清除测试数据在unittest中,我们可以使用 setUp() 和 tearDown() 两个方法来实现以上需求,其中 setUp() 方法用于初始化测试固件;而 tearDown() 方法用于销毁测试固件。程序会在运行每个测试用例(以 test_ 开头的方法)之前自动执行 setUp() 方法来初始化测试固件,井在每个测试用例(以 test_ 开头的方法)运行完成之后自动原创 2022-02-08 20:04:19 · 609 阅读 · 0 评论 -
Pytest学习笔记(2)-常用命令行参数
常用命令行参数所有命令行标志都可以通过运行 pytest --help 查看:-v输出用例更加详细的执行信息,比如用例所在的文件及用例名称等,执行pytest -v test_class.py-s输出用例中的调式信息,比如print的打印信息等,修改test_class.py如下,执行pytest -vs test_class.pyclass TestClass: def test_one(self): x = "this" print("测试调试信息原创 2022-02-08 19:57:40 · 360 阅读 · 0 评论 -
Pytest学习笔记(1)-快速入门
快速入门安装pytest终端或者命令行运行以下命令:pip install -U pytest检查是否安装了正确的版本:pytest --version 显示可用的内置函数参数:pytest --fixtures显示pytest命令行插件帮助信息:pytest --help快速开始1.创建测试函数/类Pytest 使用 Python 的 assert 进行条件判断,最简单的测试函数如:# content of test_class.pyclass TestClass:原创 2022-02-08 19:38:12 · 491 阅读 · 0 评论