上篇文章中提到了,在pytest中的fixture能够完成unitest中setUp、tearDown。今天就来详细看一下。session
为可靠的和可重复执行的测试提供固定的基线(能够理解为测试的固定配置,使不一样范围的测试都可以得到统一的配置),fixture提供了区别于传统单元测试(setup/teardown)风格的使人惊喜的功能,并且pytest作得更炫。函数
1.fixture 能够做为一个函数的参数被调用
如上图, 这里的 test_ehlo函数,须要参数值smtp_connection,pytest就是找到而且调用这个用@pytest.fixture装饰的smtp_connection函数。
换句话讲,被装饰器装饰的函数或者方法,仍然能够被调用。步骤是这样的:单元测试
2.fixture能够在一个类、或者一个模块、或者整个session中被共享,加上范围便可
如上图,加入scope=“module”的参数,可让fixture function在每次模块测试的时候只请求一次。这样不一样的test function在同一个test module中接收到的 smtpfixture参数都是同样的。这里的smtp_connection,就能够在这个模块中,共享使用。相似的:
若是想在一个类中使用,那么@pytest.fixture(scope="class");
若是想在所有会话中使用,那么@pytest.fixture(scope="session")。测试
3.fixture也能够单独存放
有的时候为了方便配置和访问,也能够将这样的fixture放到conftest.py文件中单独存放(注意:该文件要放在case同级目录下哦)。
3d
4.同一个模块里出现多个范围的装饰
当出现多个范围装饰的时候,优先实例化范围优先级高的。
也就是优先级从大到小:session-->module–->class–->functionblog
5.fixture的如何实现teardown
上图代码中的 print("teardown smtp")和smtp.close(),会在module范围内的最后一个测试完成后执行,无论测试中有没有exception的状态。
若是咱们在装饰器中指定scope="function",那么stmp将会在每次单个测试中创建和清除。it
6.fixture中的参数 autouse
关于autouse,默认是False, 若是不加scope='session',的使用autouse,只在当前module下有效。
① 若是你想一个module下的都用上,那就打开改为True, 以下,这样就不须要往每一个函数里传入fixture,例如:
看下运行结果:
io
② 一样的,当我加上scope="class"时,当前模块下的全部类,都会调用一次fixture。
看下运行结果:
function
③ 文件中同时包含了function,class,就不可使用autouse了,不然function也会执行到
看运行结果:
class
④ 如何运行类的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后)
关于pytest的fixture使用,就先写这么多吧,应该能够知足平常使用的场景了,欢迎补充。