pytest学习笔记02-默认规则、运行方式及常用参数
作为一个单元测试框架,它有着自己的规则,先讲讲它的默认规则
文件名必须以test_开头或者_test结尾
测试类必须以Test开头,并且不能有init方法
函数必须以test开头
如果不按照这个规则来写会怎么样呢?
不按照这个默认规则来写的话,就无法被pytest识别作为测试用例去运行,所以我们还是老老实实的去遵守这个规则吧。
运行方法
可以使用主函数运行,也可以使用命令行运行,两者写法是差不多的。
主函数模式(要把主函数放在根目录下去运行)
if __name__ == '__main__':
pytest.main()
(1)运行所有 pytest main()
我这里是有两个test的文件的,我们来试一下运行结果
可以看到这里是把两个文件都运行了
(2)运行指定模块 pytest main([‘-vs’,’文件名’])
这里要注意一下,使用这种写法的时候,文件一定要和main方法的文件在同一个目录下,否则会找不到文件
(3)运行指定目录 pytest main([‘-vs’,’./文件夹名’])
(4)通过nodeid指定用例运行,nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest main([‘-vs’,’./文件夹名/文件名::函数名’])
比如我现在想要只运行上面的test_02函数
这样就可以指定只运行该函数
pytest main([‘-vs’,’./文件夹名/文件名::类名::方法名’])
那我现在想运行上面的test_one,写法也是差不多的,只不过要加上类名
这样就OK了
命令行模式
打开终端,在终端中运行
(1)运行所有 pytest
(2)运行指定模块 pytest -v 文件名
(3)运行指定目录 pytest -vs ./文件夹名
(4)通过nodeid指定用例运行,nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest -vs ./文件夹名/文件名::函数名
pytest -vs ./文件夹名/文件名::类名::方法名
命令行与主函数的运行大同小异,这里就不再贴图了。然后下面附上常用的参数
参数:
-v:显示更详细的信息
-s:表示输出调试信息,包括print打印的信息
-vs:这两个参数一起用
-n:表示多线程或者分布式运行测试用例
为什么要用多线程,有的时候可能我们有很多用例,一条一条按顺序执行就会很麻烦,所以这个时候我们就会用到多线程。
比如我现在改一下我的用例
import time
class TestClass:
def test_one(self):
x = "this"
time.sleep(5)
assert "h" in x
def test_two(self):
x = "hello"
time.sleep(5)
assert "h" not in x
我如果单独执行的话,那每个等待5秒,就需要10秒的时间
可以看到两条用例运行了10秒左右,这个时候我再用多线程去运行试试
这样每条用例就只用了5秒左右,会大大的节省时间,提高效率。
pytest main(]‘-vs’,’./文件夹名/文件名::类名::方法名’,’-n=x’])设置x个线程
Pytest -vs ./文件夹名/文件名::类名::方法名 -n x 设置x个线程
—reruns num:失败用例重跑
有的时候我们希望用例执行失败然后重试看能不能重新运行成功,我们就可以使用这个参数
import pytest
if __name__ == '__main__':
pytest.main(['-vs','./pythonProject/test_01.py','--reruns=2'])
这里我们可以看到,test_two是运行报错了,所以根据我的设置又再重复运行了2次。
pytest main([‘-vs’,’./文件名’,—reruns=x’])设置所有执行失败的用例重试(重新执行)x次
Pytest -vs ./文件名 —reruns x 设置所有执行失败的用例重试(重新执行)x次
——————————————就算路是弯的,那也得走过才知道。因为你没有选择,这个社会,不前进,就灭亡。