Pytest测试框架基础-fixture详解
fixture修饰的方法可以被其他函数引用,这样就可以实现类似 setup,teardown的效果,但是fixture更加灵活,下面将详细讲解一下其用法。
一、方式1:直接将fixture修饰的方法名称当做参数传入,如下代码:
import pytest
from selenium import webdriver
@pytest.fixture()
def open():
driver = webdriver.Chrome()
driver.maximize_window()
print('启动浏览器')
return driver
#或者yield driver
def test_case01(open):
driver = open
driver.get("https://www.baidu.com")
print('第一个测试用例')
def test_case02(open):
driver = open
driver.get('https://www.cnblogs.com/longlongleg/')
print('第二个测试用例')
def test_case03(open):
open.get('https://www.google.com.hk/')
print('第三个测试用例')
def test_case04():
print('第四个测试用例')
if __name__ == '__main__': pytest.main(['-vs','test_case01.py'])
open是由fixture修饰的一个方法,在其他的测试用例当中,将open做为参数引入。每一个测试用例都会运行一遍open的方法,没有引用的如case04,则不会运行open函数内容。yield跟return类似,都可以返回参数,但是return后面如果还有内容不会运行,但是yield会运行其后的内容
二、方式2:添加范围进行引用@pytest.fixture(scope='class'),范围有多种,如下
function: 默认作用域,每个测试用例都运行一次
class: 每个测试类只执行一次
module: 每个模块只执行一次
package:每个python包只执行一次
session: 整个会话只执行一次,即整个项目运行时,只执行一次
以class为例
import pytest
@pytest.fixture(scope='class')
def open():
print('hello,world')
@pytest.mark.usefixtures('open')
class TestDemo:
def test_case1(self):
print('case 01')
def test_case2(self):
print('case 02')
def test_case3(self):
print('case 3')
if __name__ == '__main__':
pytest.main(['-vs','testcase02.py'])
运行TestDemo里面的测试用例之前,会执行一次open函数。也可以将open当做参数写在每个testcase里面。
以module为例,将fixture修饰的函数写在conftest中,被引用的参数会默认先去寻找conftest.py里面的方法,代码如下所示
conftest.py
from selenium import webdriver
import pytest
@pytest.fixture(scope='module')
def open():
driver = webdriver.Chrome()
driver.maximize_window()
print('open function')
return driver
testcase.py
import pytest
class Testcase:
def testcase01(self,open):
open.get("https://www.baidu.com")
print('Testcase03:case1')
def testcase02(self,open):
open.get("https://www.google.com.hk/")
print('Testcase03:case2')
def testcase03(open):
open.get('https://www.cnblogs.com/longlongleg/')
print('Testcase03:case3')
if __name__ == '__main__':
pytest.main(['-vs','testcase.py'])
此时三个testcase都只会运行一次open,如果范围为class,那么会运行两次open。因为最后一个测试用例不属于class Testcase类里面。
module范围输出内容

如果为class范围,输出内容


浙公网安备 33010602011771号