pytest(10)-常用执行参数说明

简介: pytest单元测试框架中可以使用命令行及代码pytest.main()两种方式执行测试,且可以加入各种参数来组织执行测试。接下来我们来了解常用的执行参数的含义及其用法。pytest中的执行参数根据作用的不同大致可以分为以下几类:1. 指定测试用例2. 控制执行过程3. 结果展示每个示例都会以 pytest.main()形式 及 命令行形式 两种方式进行说明。

指定测试用例


运行指定路径的测试用例

# 运行当前文件所在的同级目录中,testcase文件夹里的所有测试用例
pytest.main(["./testcase"])
# 也可以写成如下形式。后续示例中都将`./`省略
pytest.main(["testcase"])
# 命令行形式
pytest 
# 运行指定模块
pytest.main(["testcase/test_case.py"])
# 命令行形式
pytest testcase/test_case.py
# 运行指定模块中的测试类
pytest.main(["testcase/test_case.py::TestOrder"])
# 命令行形式
pytest testcase/test_case_1.py::TestOrder
# 运行指定类中的测试方法
pytest.main(["testcase/test_case.py::TestOrder::test_order"])
# 命令行形式
pytest testcase/test_case.py::TestOrder::test_order


-m 运行指定标记的测试用例

我们之前已经讲过怎么标记用例,可以查看pytest-标记用例(指定执行、跳过用例、预期失败)

# 运行被标记为smoke的用例
pytest.main(['-m smoke'])
# 命令行形式
pytest -m smoke
# 运行被标记为smoke或order的用例
pytest.main(["-m", "smoke or order"])
# 命令行形式
pytest -m "smoke or order"


-k 运行匹配指定字符串的测试用例

-k 指定字符串,用于匹配包名、模块名、类名、测试函数名/方法名,这些命名中包含指定的字符串则匹配并执行。

# 运行包名、模块名、类名、测试函数名/方法名中包含order的测试用例
pytest.main(["-k", "order"])
# 命令行形式
pytest -k order
# 运行指定模块中的类名、测试函数名/方法名中包含order的测试用例
pytest.main(["-k", "order", "testcase/test_case.py"])
# 命令行形式
pytest -k login testcase/test_case.py
# 运行指定类中测试函数名包含order的测试用例
pytest.main(["-k", "order", "testcase/test_case.py::TestOrder"])
# 命令行形式
pytest -k order testcase/test_case.py::TestOrder


控制执行过程


用例失败重新执行次数

用例执行时有可能会出现某些偶然因素导致用例断言失败但实际又不是bug的情况,如网络波动导致响应时间慢,此时用例失败后再次去重新执行该用例就显得很重要。

pytest提供了一个常用的插件 pytest-rerunfailures,用于设置测试用例运行失败后的最多重新执行次数(即重试机制)。

使用之前需要先安装:pip install pytest-rerunfailures,使用方式如下:

# 运行失败后该用例重新运行最多3次
pytest.main(["--reruns", "3", "testcase/test_case.py"])
# 命令行形式
pytest --reruns=3 testcase/test_case.py


用例执行失败则停止运行

根据需求提供以下两种方式:

  1. -x或--exitfirst,遇到用例执行失败就停止项目的运行,只要失败就立即停止运行
  2. --maxfail=num,遇到多少次用例执行失败就停止项目运行,num表示用例运行失败次数
# -x,遇到执行用例失败则停止整个项目的运行
pytest.main(["-x", "testcase/test_case.py"])
# 命令行形式
pytest -x testcase/test_case.py
# --maxfail,如累计有5次用例执行失败则停止整个项目的运行
pytest.main(["--maxfail", "5", "testcase/test_case.py"])
# 命令行形式
pytest --maxfail=5 testcase/test_case.py


运行上次失败用例

当bug修复完成后,我们可能只需要去执行上次运行失败的用例,在pytest中就提供了这样的功能,需要用到以下参数:

  1. --lf或--last-failed,只执行上次运行失败的用例,若上次运行没有失败用例则会执行全部用例。
  2. --ff或--failed-first,首先执行上次运行失败的用例,再执行项目中其他所有用例。
# --lf,只执行上次运行失败的用例,若上次运行没有失败用例则会执行全部用例
pytest.main(["--lf", "testcase/test_case.py"])
# 命令行形式
pytest --lf testcase/test_case.py
# --ff,首先执行上次运行失败的用例,再执行项目中其他所有用例
pytest.main(["--ff", "testcase/test_case.py"])
# 命令行形式
pytest --ff testcase/test_case.py


执行结果展示


与展示结果相关的常用的参数有以下几个:

  1. -s,在测试结果中显示测试用例里print的内容(执行结果默认不显示测试用例中print的内容)。
  2. -v,显示更详细的测试结果。
  3. -q,展示简略的测试结果,与-v作用刚好相反。
# -s,测试结果中显示测试用例里print的内容
pytest.main(["-s", "testcase/test_case.py"])
# 命令行形式
pytest -s testcase/test_case.py
# -v,设置测试结果显示的详细程度
pytest.main(["-v", "testcase/test_case.py"])
# 命令行形式
pytest -v testcase/test_case.py
# -q,设置测试结果显示的详细程度
pytest.main(["-q", "testcase/test_case.py"])
# 命令行形式
pytest -q testcase/test_case.py


示例


测试用例写在 testcase/test_case.py 中,项目执行代码写在与 testcase 同级目录的 run.py 中,简单示例如下:

test_case.py:

def test_01():
    print("执行test_01")
    a = "hello"
    b = "hi"
    assert a != b
def test_02():
    print("执行test_02")
    a = "hello"
    b = "hi"
    assert a == b
class TestOrder:
    def test_order(self):
        print("下单")

run.py:

import pytest
if __name__ == '__main__':
    pytest.main(["-s", "-v", "--reruns", "2", "testcase/test_case.py"])

运行run.py或命令行pytest -s -v --reruns=2 testcase/test_case.py,结果如下:

微信图片_20220425172806.png

我们可以看出来:

  1. 因为-s,结果中打印了测试用例中print里面的内容。
  2. 因为-v,显示了较为详细的测试结果(不加-v则只显示执行的测试模块,不显示测试用例而是用.表示)。
  3. 因为--reruns2,因为test_02的断言始终是失败的,所以失败后又执行了2次,总共执行了3次。


总结


这里只列举了一些常用的运行方法与参数,大家可以在自己的自动化项目中尝试着使用这些方式与参数。

相关文章
|
9月前
|
API 开发者 索引
Python中的省略号(Ellipsis)赋值方式
在Python中,省略号(`...`)是一种特殊对象,称为Ellipsis,虽不常用但在特定场景下非常实用,如函数占位、未实现方法示例及NumPy数组处理。本文通过示例介绍`a = ...`的用法。省略号类似于`None`,可用作代码结构的占位符,保持代码完整性和可读性,同时在API设计中标识待实现的方法。特别是在NumPy中,省略号用于表示多维数组的剩余维度,简化数组操作,提高代码灵活性和可读性。掌握这一技巧有助于提升Python编程能力。
203 0
|
8月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
308 16
|
9月前
|
SQL 数据可视化 安全
微软SQL Server可视化工具与技巧
微软SQL Server不仅提供了强大的数据库管理功能,还集成了多种可视化工具,帮助用户更直观地理解和管理数据
|
11月前
|
算法 Java 程序员
同步与互斥(二)
同步与互斥(二)
259 0
|
11月前
|
存储 Prometheus 监控
Prometheus 的扩展与集成
【8月更文第29天】Prometheus 是一款非常强大的监控系统,它不仅能够采集和存储时间序列数据,还提供了丰富的生态系统来扩展其功能。本文将介绍如何通过自定义 Exporters 和集成中间件(如 Thanos)来扩展 Prometheus 的能力。
309 2
|
12月前
|
监控 安全 算法
云上智能风控:构建金融安全的智能防线
云上智能风控系统具有良好的灵活性和可扩展性。随着金融市场的不断变化和技术的不断发展,系统能够灵活调整风控策略和算法模型以适应新的风险类型和场景。同时,系统还能够根据业务需求进行功能扩展和升级以满足不同金融机构的个性化需求。
716 7
|
11月前
|
分布式计算 安全 Hadoop
Hadoop安全性和数据保护机制
【8月更文第28天】随着大数据技术的普及,Hadoop已成为处理大规模数据集的核心技术之一。然而,随着数据价值的增加,数据安全问题变得越来越重要。本文将深入探讨Hadoop的安全模型以及如何实施访问控制、数据加密等措施来保障数据安全。
925 0
|
Ubuntu Linux
查看Linux系统是Ubuntu还是CentOS
查看Linux系统是Ubuntu还是CentOS
1884 0
|
缓存 负载均衡 安全
虚拟 IP 地址对于网络有什么用处?
随着互联网技术和科技的发展,在上网的时候使用代理ip的使用人数也越来越多,因为业务的需求需要使用http动态代理ip的应用范围越来越多,那么http代理ip组成成分有哪些?接下来小编就给大家介绍一下
467 0
虚拟 IP 地址对于网络有什么用处?
|
关系型数据库 分布式数据库 PolarDB
PolarDB for PostgreSQL启动问题之启动失败如何解决
PolarDB for PostgreSQL是基于PostgreSQL开发的一款云原生关系型数据库服务,它提供了高性能、高可用性和弹性扩展的特性;本合集将围绕PolarDB(pg)的部署、管理和优化提供指导,以及常见问题的排查和解决办法。