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次。


总结


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

相关文章
|
JavaScript 前端开发
js获取当前域名
js获取当前域名
509 0
|
缓存 网络协议 测试技术
NFS挂载信息如何调整?
NFS挂载信息如何调整?
587 3
MyBatis-Plus-Join关联查询
MyBatis-Plus-Join关联查询
611 2
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
405 31
|
API 开发者 索引
Python中的省略号(Ellipsis)赋值方式
在Python中,省略号(`...`)是一种特殊对象,称为Ellipsis,虽不常用但在特定场景下非常实用,如函数占位、未实现方法示例及NumPy数组处理。本文通过示例介绍`a = ...`的用法。省略号类似于`None`,可用作代码结构的占位符,保持代码完整性和可读性,同时在API设计中标识待实现的方法。特别是在NumPy中,省略号用于表示多维数组的剩余维度,简化数组操作,提高代码灵活性和可读性。掌握这一技巧有助于提升Python编程能力。
390 1
|
SQL 数据可视化 安全
微软SQL Server可视化工具与技巧
微软SQL Server不仅提供了强大的数据库管理功能,还集成了多种可视化工具,帮助用户更直观地理解和管理数据
1075 5
|
移动开发 网络协议 C语言
详解 httptools 模块,一个 HTTP 解析器
详解 httptools 模块,一个 HTTP 解析器
354 0
|
SQL 关系型数据库 数据处理
|
缓存 测试技术 Android开发
深入了解Appium:Capability 高级配置技巧解析
Appium 提供多种进阶配置项以优化自动化测试,如 deviceName 作为设备别名,udid 确保选择特定设备,newCommandTimeout 设置超时时间,PRINT_PAGE_SOURCE_ON_FIND_FAILURE 在错误时打印页面源,以及测试策略中的 noReset、shouldTerminateApp 和 forceAppLaunch 控制应用状态和重启。这些配置可提升测试效率和准确性。
|
Ubuntu Linux
查看Linux系统是Ubuntu还是CentOS
查看Linux系统是Ubuntu还是CentOS
2233 0