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运行指定标记的测试用例

我们之前已经讲过怎么标记用例,可以查看[]

# 运行被标记为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,结果如下:

我们可以看出来:

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

总结

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

pytest(10)-常用执行参数说明的更多相关文章

  1. Pytest命令行执行测试

    Pytest命令行执行测试 from collections import namedtuple Task = namedtuple('Task', ['summary','owner','done' ...

  2. python常用执行方式&变量&input函数

    linux系统中执行py文件方式:  ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...

  3. 每10秒执行定时任务-crontab

    * * * * * /data/crontab.sh * * * * * sleep 10; /data/crontab.sh * * * * * sleep 20; /data/crontab.sh ...

  4. 【前端】javascript中10常用的个小技巧总结

    javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了 ...

  5. DG on Windows 10 S: 执行任意代码

    DG on Windows 10 S: 执行任意代码 windows 10 S版本是什么鬼? 众所周知,我们使用的是windows 10企业版 LTSC.更准确一点,CMD运行winver,我的版本是 ...

  6. Python单元测试框架之pytest 1 ---如何执行测试用例

    From: https://www.cnblogs.com/fnng/p/4765112.html 介绍   pytest是一个成熟的全功能的Python测试工具,可以帮助你写出更好的程序. 适合从简 ...

  7. Pytest_常用执行参数详解(3)

    前面讲了测试用例的执行方式,也认识了 -v  -s 这些参数,那么还有没有其它参数呢?答案肯定是有的,我们可以通过 pytest -h来查看所有可用参数. 从图中可以看出,pytest的参数有很多,但 ...

  8. pytest多进程/多线程执行测试用例

    前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...

  9. AngularJs自定义指令详解(10) - 执行次序

    代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...

随机推荐

  1. Java Date 类型比较

    //某时间Date time = tRemind.getTime();//现在时间Date now = new Date();//结果大于0则是现在时间大于某时间//结果等于0则为刚好相等//结果小于 ...

  2. C/C++避免头文件重复包含的方法

    C/C++避免头文件重复包含的方法 1. #ifndef 2. #pragma once 3. 混合使用 在实际的编程过程中,因为会使用多个文件,所以在文件中不可避免的要引入一些头文件,这样就可能会出 ...

  3. 在Linux系统(centos7)中,安装VScode,并在VScode上编写HTML网页

    [实验目的] 在Linux系统中,搭建编写HTML网页的环境.在VS code官网上,下载VS code安装程序,进行安装.在VS code软件中编写HTML页面,并正确运行. [实验步骤] 1)   ...

  4. 白话TCP/IP原理

    TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...

  5. 前端——JSON学习总结

    学习网址: https://www.bilibili.com/video/BV1Pt411u7R3 什么是JSON?(以下有关概念内容为视频中学习文档相关内容,代码为本人学习时使用的有关代码) JSO ...

  6. 【刷题-LeetCode】213. House Robber II

    House Robber II You are a professional robber planning to rob houses along a street. Each house has ...

  7. 带你十天轻松搞定 Go 微服务系列(二)

    上篇文章开始,我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分(本文) 用户服务 产品服务 订单服务 支付服务 RPC 服务 ...

  8. url地址如何定位到Servlet程序去访问

  9. Reset the default deployment target in Windows Phone Developer Tools

    楼主在更新Windows Phone 8.1 SDK之后遇到一个很烦人的问题,编译选择调试目标列表没有数据.正常情况下都会有一个模拟器列表和真机的选项.肯定又是Preview的bug,问题产生的原因暂 ...

  10. Android开发-页面布局

    首页布局 首页是ListView的布局 这个还需要制作ListView组件和适配器来显示数据. 关于页面 关于页面显示的是软件的基本信息和软件制作者的信息 这个就是采用基本的页面布局就行.