第二章 命令行选项
在前一章节中,咱们已经用过了-v(啰嗦模式)选项,其实pytest还有很多选项,可以用pytest --help查看所有选项,下面只讲解一部分常用的选项。举例所用的代码是上一章节创建的,忘记的同学可以翻看前一章节,这里简单说明下:
# F:\Pytest_learning\ch01\test_one.py
def test_passing():
assert (1, 2, 3) == (1, 2, 3)
# F:\Pytest_learning\ch01\test_two.py
def test_failinig():
assert (1, 2, 3) == (3, 2, 1)
# F:\Pytest_learning\ch01\ch01_sub\test_three.py
def add(x, y):
return x + y
def test_add_1():
assert add(1, 2) == 3
def test_add_2():
assert add(2, 2) == 3
--collect-only选项
该选项用来显示给定配置下会有哪些测试用例被运行,例如你接手了一个项目,不知道里面有多少测试用例,但又不想直接运行后查看结果(毕竟可能浪费很多时间,而且可能破坏测试环境),就可以使用此选项。如果嫌太长不好记,可以用缩写--co
咱们用上一章节的ch01目录来实验下,效果如下:
-k选项
该选项用来使用表达式指定特定的测试用例运行,例如你想选择名字里包含add的测试用例,可以这么写pytest -k add,如果想选择名字里包含one或者two的用例,可以这么写pytest -k "one or two" (注意,这里需要添加双引号),下面让咱们结合上一个--collect-only选项来看看实际效果:
当然,你也可以选择直接运行:
-m选项
该选项用于运行做过标记的用例。例如你有两个名字完全不同的用例,但是关于同个功能模块的,你想让他们一起运行,那么上面提到的-k选项就无能为力了,这时候就需要使用标记。当然,需要你事先在用例上做标记,然后才能去找被你标记过的用例嘛。
那么,怎么标记用例呢?python里有个叫装饰器的东西,就是@开头的,如果不大清楚具体原理,建议百度下。咱们要做的,只是在用例前面加上 @pytest.mark.标记名 就行了,是不是很简单。让咱们用上一章节的代码作为例子,如果你想运行test_one.py里的test_passing和test_three.py里面的test_add_2,可以如下修改代码:
test_one.py:
import pytest
@pytest.mark.demo01
def test_passing():
assert (1, 2, 3) == (1, 2, 3)
test_three.py:
import pytest
def add(x, y):
return x + y
def test_add_1():
assert add(1, 2) == 3
@pytest.mark.demo01
def test_add_2():
assert add(2, 2) == 3
可以看到,咱们用demo01进行了标记(需要import pytest),然后再用-m选项来测试一下吧:
可以看到用例 test_passing和test_add_2都被准确地选中了,是不是amazing啊。
还有更强大的呢,比如你同个用例想分到多个组里,那就可以对其添加多个标记,然后使用的时候,还可以用 -m "mark1 or mark2"这种形式来同时选中具有mark1标记和mark2标记的所有测试用例。
-x选项
该选项用于断言失败或者触发了异常时立即停止整个会话。正常情况下,pytest会依次执行每条用例,即使某条失败,也会标记失败后继续进行,而添加此选项后则会立即停止,这样可以方便咱们进行调试。下面比较下添加和不添加的效果:
已知第二个用例失败,不加-x,则继续运行后面的用例;
添加-x,则遇到失败的立即结束
--maxfail=num选项
-x选项的特点是,遇到失败或者异常就会停止,但是假如你知道有个用例肯定失败,并不想马上停止,那么可以用--maxfail选项来指定失败几次之后才停止,-x的选项其实就是--maxfail=1。由于之前的用例只有2个失败,如果设置为1,那么就和-x效果一样,如果设置为2,那就和没设置一样,咱们试试看吧:
--maxfail=1
--maxfail=2
-s选项
该选项允许测试运行时输出任何符合标准的输出流信息,例如代码里面的print。例如咱们修改下test_one.py里的用例,加上print一些信息。
import pytest
@pytest.mark.demo01
def test_passing():
print('测试是否会打印出来')
assert (1, 2, 3) == (1, 2, 3)
然后再来试试-s的效果吧:
不加-s:
加-s:
--lf选项
该选项用于重新运行之前失败的用例,如果没有任何失败,则全部重跑。例如上次运行的4个用例中,有2个失败了,那么使用--lf(--last-failed)选项,则当前只会运行上次失败的那两个用例(可以推论出,每次运行的结果其实会缓存在你电脑本地,如果你关注下用例文件夹,就会发现多了一个F:\Pytest_learning\ch01\.pytest_cache\v\cache,里面缓存着执行的信息之类的东西,后面再了解吧)。
--ff选项
即先运行失败再运行其他(--failed-first)。如下图,原本正常的顺序应该是test_one.py第一个运行,使用--ff选项后,先运行了2个失败的用例(即使同个文件内的,也是只先运行失败的那个),另外两个上次成功的才开始执行。
-v选项
这个是老朋友了,就是啰嗦模式,啥信息都显示,看得眼花缭乱。
-q选项
和-v选项刚好相反,这个是安静模式,只显示关键的信息(例如失败原因)。
-l选项
该选项用来失败时显示局部变量(--showlocals),主要是用来调试。那让咱们给用例增加点局部变量来看看效果好了。如果不知道啥是局部变量也不要紧,后面用到再说,或者可以先百度。
没加选项:
增加选项:
可以看到,最后将局部变量local的值显示了出来。
--tb选项
traceback(回溯)该选项用于失败时输出哪些信息,有short、line、no三种模式可以选择。
- short 仅显示assert的一行以及系统判定内容
- line 使用一行输出所有错误信息
- no 啥都不显示
下面来看看三种模式的不同。
short模式:
line模式:
no模式:
简单地说,
no告诉你失败了;
line告诉你哪里失败了;
short告诉你为啥失败了。
除了这些,还有--duration选项用来显示哪个阶段占用时间最长,--version显示版本,--h显示帮助等,作用不是很大,就不一一赘述了。
下一篇:第三章 编写测试函数