pytest测试框架

1、下载pytest,直接pycharm下载就行

2、pytest的运行方式

(1)、pytest命令不加路径时是运行当前路径,也可以指定了目录,可以单个目标文件,其实pytest也可以批量运行指定目录(如果不指定,就是当前目录)下的测试用例,为了搜索所有的测试代码,pytest会递归遍历每个目录及其子目录。

而你的测试代码,需要满足如下的命名规则:

测试文件应该用 test_ 开头或者 test 结尾
测试函数、测试方法应该以 test
开头
测试类应该以 Test 开头
(2)、运行某个文件的某个用例则需要冒号

pytest /Users/u0043159/Desktop/python_test/test_03.py::test02

(3)、运行模块中的指定方法——-pytest test_mod.py::TestClass::test_method
通过标记表达式执行——-pytest -m slow—这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例

(4)、通过包执行测试—–pytest –pyargs pkg.testing—这条命令会自动导入包 pkg.testing,并使用该包所在的目录,执行下面的用例

3、pytest的断言

pytest的assert断言关键字支持使用python内置的assert表达式。可以理解为pytest的断言就是直接使用python自带的assert关键字。

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

assert ‘a’ in ‘abc’
assert ‘a’ not in ‘bbc’
something = True
assert something
something = False
assert not something
assert 1==1
assert 1!=2
assert ‘a’ is ‘a’
assert ‘a’ is not ‘b’
assert 1 < 2
assert 2 > 1
assert 1

assert ‘c’ in (‘a’, ‘b’, 1), “{0}是否在{1}里”.format(‘c’, “(‘a’, ‘b’, 1)”)

这个可以将assert断言失败的时候,将备注信息输出到控制台,起到保错信息提示的作用

4、mark中的skip或者skipif(跳过)

场景:

1、调试时不想运行这个用例

2、标记无法在某平台上运行的测试功能(如appium的IOS和安卓不兼容的脚本)

3、当前的外部资源不可用时跳过(如果测试数据是从数据库中取到的,连接数据库的功能如果返回结果未成功就不执行跳过,因为执行也都报错)

4、在某些版本中执行,其他版本中跳过

解决:

@pytest.mark.skip跳过这个测试用例,@skip 或者skipif可以加在函数上,类上,类方法上,如果加在类上面,类里面的所有测试用例都不会执行

@pytest.mark.skipif(condition, reason=””)

作用:希望有条件地跳过某些测试用例

注意:condition需要返回True才会跳过,reason是必须传值当否则就算condition为True也不skip

举个🌰1

使用skip和skpif同理,区别就是skip无需condition且也不需要传reason

pytest测试框架

举个🌰2

可以将 pytest.mark.skip 和 pytest.mark.skipif 赋值给一个标记变量

在不同模块之间共享这个标记变量

若有多个模块的测试用例需要用到相同的 skip 或 skipif ,可以用一个单独的文件去管理这些通用标记,然后适用于整个测试用例集,公共管理,哪个用例需要就调用

这是一个skip.py的文件

pytest测试框架

这是一个要执行的test_05.py文件

pytest测试框架

执行结果是skip或skipif都使用成功了

举个🌰3

如果依赖哪些模块,不管是否找到模块或者模块版本不对则跳过用importorskip

  • modname:模块名
  • minversion:版本号
  • reasone:跳过原因,默认不给也行
pexpect = pytest.importorskip("pexpect", minversion="0.3")

5、mark中的xfail(失败)

场景:

功能测试尚未实施或尚未修复的错误,当测试通过时尽管预计会失败(标记为pytest.mark.xfail),将在结果中显示失败,@pytest.mark.xfail标签,他的含义是期望测试用例是失败的,但是不会影响测试用例的的执行。如果测试用例执行失败的则结果是xfail(不会额外显示出错误信息);如果测试用例执行成功的则结果是xpass

举个🌰

pytest测试框架

运行结果是xfaild,如果将断言结果改成True则,运行结果为Xpass

pytest测试框架

6、使用自定义标记mark只执行部分用例

场景:只执行符合要求的某一部分用例

1:可以把一个项目划分多个模块,然后指定模块名称执行。

2:可以把用例区分级别,是否是关键用例执行,只执行关键用例

3:App自动化时,如果想Android和IOS公用一套代码时,也可以使用标记功能,标记哪些是IOS的用例,哪些是Android的,还有大部分是公共代码,如果想运行IOS代码时指定mark名称运行不执行Android就可以了,反之亦然

解决:

在测试用例方法上加@pytest.mark.标记名称

执行:

-s 参数:输出所有测试用的print信息

-m:执行自定义标记的相关用例

pytest -s test_mark.py -m 标记名称 #执行匹配标记名称的用例

pytest -s test_mark.py -m ‘not 标记名称’ #执行非标记的所有其他的用例

注册mark标记

首先在项目中根据目录创建一个文件pytest.ini(如何),这个是pytest的配置文件。然后在pytest.ini文件的markers中写入你的 mark 标记, 冒号 “:” 前面是标记名称,后面是 mark 标记的说明,可以是空字符串;注意:pytest.ini 文件中只能使用纯英文字符,绝对不能使用中文的字符(尤其是冒号和空格)!,在 pytest.ini 文件中添加参数 “addopts = –strict”,注意要另起一行,不要在 markers 中添加;添加该参数后,当使用未注册的 mark 标记时,pytest会直接报错:” ‘xxx’ not found in markers configuration option “,方便查看报错。

注意:pytest.ini 配置文件不支持注释,不支持注释,不支持注释…

[pytest]

markers =

web : ‘marks tests as web’

app : ‘marks tests as app’

success : ‘marks tests as success’

failed : ‘marks tests as failed’

addopts = –strict-markers

pytest测试框架

命令: pytest ./ -m ‘app’——-可以是具体.py文件也可以是路径

pytest测试框架

结果为只执行了当前的目录下所有文件的app标记的模块用例

将命令置为:pytest ./test_2.py -m ‘not web’——-可以是具体.py文件也可以是路径

pytest测试框架

意思为不执行该标记,执行了该文件下其他两条用例

Pytest -fixture

Pytest提供了fixture机制,通过它可以在测试执行前后执行一些操作,类似setup和teardown

fixture优势
1.firture相对于setup和teardown来说应该有以下几点优势

命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到配置
scope=”module” 可以实现在当前模块.py文件前后调用一次
scope=”session” 以实现多个.py跨文件使用一个session来完成多个用例

@pytest.fixture函数的scope

可能的取值有function,class,module,package 或 session。他们的具体含义如下:

function,表示fixture函数在测试方法执行前和执行后执行一次。

class,表示fixture函数在测试类执行前和执行后执行一次。

module,表示fixture函数在测试脚本执行前和执行后执行一次。

package,表示fixture函数在测试包(文件夹)中第一个测试用例执行前和最后一个测试用例执行后执行一次。

session,表示所有测试的最开始和测试结束后执行一次。

通常,数据库连接和断开、测试配置文件的读取等工作,是需要放到session级别的fixture函数中,因为这些操作针对整个测试活动只需要做一次。而针对测试数据的读取,通常是function级别或者class级别的,因为测试数据针对不同的测试方法或者测试类往往都不相同。

scope=function

定义一个pytest.fixture,在函数上加入@pytest.fixture(),没有传scope的值时,默认等于function,然后把fixture的名称,当做参数传进去,在执行该fixture的用例前,先执行fixture,yield前是前置,yield后是后置,如果传多个fixture时,按从左到右顺序执行

undefined

从执行结果可以分析:

1、当scope=function的值为,不传值时默认function,作用于函数,同样适用于class的方法

2、调用时在函数/类直接把定义的fixture的名称当作参数传进去,会直接执行这个方法,等用例结束后再后置yield后面的脚本,如果定义的的fixture有return返回值,在执行方法用例需要这个值时,直接把fixture的name当做变量直接作用在语句上

3、当传两个fixture时,执行顺序按传入顺序执行,可以参考图上执行结果

scope=class

每一个类调用一次(只限制了class,不限制.py文件),一个类中可以有多个方法

pytest测试框架

从 执行结果可以分析:

1:当定义fixture的scope=class时,函数调用时每个函数用例都会执行yield前置后置两个函数体,此时作用于函数用例时和scope=function区别不大

2:类里的方法,就算每个方法都调用fixture却只执行一次yield前后两个函数体,而且两个方法的用例都执行完了才执行结束,所以scope=class时:每一个类调用一次(只限制了class,不限制.py文件),一个类中可以有多个方法,一般在第一个用例方法调用,只有一个方法时则区别不大

scope=Module

Module:每一个.py文件调用一次(只限制.py文件),该文件内就算有多个function和class,最终只执行一次fixture的内容

pytest测试框架

从执行结果可以分析:

执行整个文件,从调用该fixture的方法/类开始进行前置,等该文件所有的用例都执行完后,再执行yield的后置

由此看出:每一个.py文件调用一次(只限制.py文件)**当.py文件有多个scope = module装饰的方法或者函数时,先执行先调用的前置,然后执行第二个调用的前置,然后执行用例等所有用例执行后,再执行第二个的后置,然后再执行第一个后置,如果有第三个依次类推

多个测试用例调用一个fixture功能 conftest.py

定义的fixture,作用于当前目录/所有子目录的用例,即调用fixture的测试用例,必须是当前目录或者是当前目录到项目的根目录的整个路径链路中, 所以想要整个项目全局都能用,就在根目录下搞个conftest.py,不可以跨目录调用,如/A/a目录的用例不能调用/A/B目录下面的conftest.py的fixture

学习路径:

《pytest测试实战》新手友好版——第一章 pytest入门_幼儿园二园长的博客-CSDN博客_pytest测试实战

pytest.fixture()基础使用实例_changxingang的博客-CSDN博客

Original: https://blog.csdn.net/weixin_57976803/article/details/124591118
Author: 米兜舞动代码
Title: pytest测试框架

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/773418/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python + matplotlib.animation 模拟斜抛运动动画(含完整代码)

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年8月31日
    041
  • Spring Bean作用域

    目录 什么是作用域呢 ? 那什么又是Spring Bean的作用域呢 ? Spring框架默认Bean作用域是什么呢 ? Spring Bean的作用域都有哪些呢 ? 如何设置Be…

    Python 2023年9月29日
    039
  • Python中的路径

    windows路径使用的是\,linux路径使用的是/。 特别的,在windows系统中如果有这样的一个路径 D:\nxxx\txxx\x1,程序会报错。因为在路径中存在特殊符 \…

    Python 2023年6月3日
    074
  • 如何使用appnium爬取视频数据

    要先安装Appium,并用它来查找对应元素的id、xpath等信息 from appium import webdriver from appium.webdriver.exten…

    Python 2023年5月24日
    057
  • Python 开发环境的下载与配置以及anconda3在pycharm的配置

    ### 回答1: Anaconda是一个 Python_发行版,它包含了 _Python_解释器、许多常用的 _Python_库以及一些工具。 _PyCharm_是一个 _Pyth…

    Python 2023年9月8日
    064
  • Python+Vue实现简单的前后端分离

    准备工作 安装Node环境 安装Python环境 注意:项目整个过程需要从后往前,即先数据库->后端->前端;启动流程也是先启动后端项目,再启动前端项目完整项目地址:地…

    Python 2023年8月1日
    074
  • 熔断与降级的关系

    熔断的概念: [TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is s…

    Python 2023年6月3日
    053
  • pytest接口测试自动化框架

    pytest简介及安装 pytest的使用规则 pytest运行方式 主函数方式 命令行方式 跳过、标记及预期失败特殊场景处理 pytest前后置、夹具 pytest高级用法fix…

    Python 2023年9月9日
    059
  • python+uiautomator2+pytest自动化测试框架(三)

    python+uiautomator2+pytest自动化测试框架(三) 目的解决多设备运行,并行多台设备及多用例同时进行 1、修改conftest.py 初始化设备进行了修改,根…

    Python 2023年9月12日
    048
  • 下载和安装和测试Python第三方库20210225

    要安装的库 numpy==1.19.0 matplotlib==3.0.3 scikit-learn==0.20.3 pyqt5==5.9.2 jupyter==1.0.0 pyg…

    Python 2023年9月25日
    053
  • python怎么启动线程_如何在Python中同时启动线程

    我想做一个小程序,播放一首歌和一个图像弹出时,鼠标光标移动。我有3个功能,可用于3个操作,我想同时运行它们,但我无法完成。你能帮帮我吗?在import random import …

    Python 2023年9月24日
    034
  • Pandas数据分析练习7

    练习7-可视化 探索泰坦尼克灾难数据 目录 步骤1 导入必要的库 步骤2 从以下地址导入数据 步骤3 将数据框命名为titanic 步骤4 将PassengerId设置为索引 步骤…

    Python 2023年8月29日
    054
  • Selenium+python自动化-登录教程

    Original: https://www.cnblogs.com/123456feng/p/16195474.htmlAuthor: 蚂蚁ailingTitle: Seleniu…

    Python 2023年5月24日
    068
  • 轻轻学爬虫—scrapy框架巧用3

    轻轻学爬虫—scrapy框架巧用3 本节继续来学习scrapy框架,本博主会以不同方法,实战的方式来讲解爬虫。省去了全篇一律的方法。 上节课我们学习了如何常见一个scrapy及一个…

    Python 2023年10月7日
    040
  • 如何漂亮打印Pandas DataFrames 和 Series

    当我们必须处理可能有多个列和行的大型DataFrames时,能够以可读格式显示数据是很重要的。这在调试代码时非常有用。 默认情况下,当打印出DataFrame且具有相当多的列时,仅…

    Python 2023年8月8日
    065
  • 04-pytest-fixture作用范围

    一、fixture参数介绍 二、scope参数控制fixture的作用范围 默认作用域 class作用域 module作用域 session作用域 一、fixture参数介绍 de…

    Python 2023年9月14日
    023
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球