4.同一个模块里出现多个范围的装饰
当出现多个范围装饰的时候,优先实例化范围优先级高的。
也就是优先级从大到小:session-->module–->class–->function
5.fixture的如何实现teardown
上图代码中的 print("teardown smtp")和smtp.close(),会在module范围内的最后一个测试完成后执行,不管测试中有没有exception的状态。
如果我们在装饰器中指定scope="function",那么stmp将会在每次单个测试中建立和清除。
6.fixture中的参数 autouse
关于autouse,默认是False, 如果不加scope='session',的使用autouse,只在当前module下有效。
① 如果你想一个module下的都用上,那就打开改成True, 如下,这样就不需要往每个函数里传入fixture,例如:
看下运行结果:
② 同样的,当我加上scope="class"时,当前模块下的所有类,都会调用一次fixture。
看下运行结果:
③ 文件中同时包含了function,class,就不可以使用autouse了,否则function也会执行到
看运行结果:
④ 如何运行类的fixture
这里使用一个更加通用的方法即可,@pytest.mark.usefixtures("这里是你要用的fixture"),标记在你要使用的类。
看下运行结果:
这里要注意的是:scope=“class”,别忘记添加,否则类下的每个function都会执行。
⑤ 当scope='session'时,要注意的点!
如果你的scope='session',那么不要像function,class,module那样,和case放在一起,我们要放在另一个文件,conftest.py下,才可以。
这里是同一个项目下的,2个case文件:
还有个同项目下的 conftest.py:
运行测试case,这个2个case文件下的所有case都会被找到,但是只会执行一次conftest.py中的 fixture。
⑥ 当case里需要传入多个 fixture 或者 yield 怎么办呢? 先后执行的顺序是什么?
在后续使用的过程中,遇到了case里我想传入多个yield,于是写了demo验证了下。下面上结果,就不放截图啦(形式传参“before”表示执行在case前,“yield”表示执行在case后)
def test_1(before, yield) 与 def test_1(yield,before)
结论:不管你顺序如何,依旧会先执行case前的before,case结束后执行yield
def test_2(before1, before2, yield)
结论:这样有多个before,会依次按传参顺序先后执行。
def test_3(before, yield1, yield2)
结论:这样有多个yield的,会依次从后往前执行,这里先执行yield2,再执行yield1。
关于pytest的fixture使用,就先写这么多吧,应该可以满足日常使用的场景了,欢迎补充。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走: