前言
fixtrue修饰器标记的方法通常用于在其他函数、模块、类或者整个工程调用时会优先执行,通常会被用于完成预置处理和重复操作。
例如:登录,执行SQL等操作。
完整方法如下:
fixture(scope='function',params=None,autouse=False,ids=None,name=None)
参数说明:
1.scope参数:标记方法的作用域。有4个可选值:function(默认,函数)、class(类)、module(模块)、package/session(包)
(1)作用域为函数实例
import pytest
@pytest.fixture(scope='function',autouse=True)
def login():
print('登录系统')
def test_01():
print('测试用例一')
class TestCase:
def test_03(self):
print('测试用例三')
def test04(self):
print('测试用例四')
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
注意:该模块中所有的函数在执行之前都会执行login函数。
(2)作用域为类实例一:
import pytest
@pytest.fixture(scope='class',autouse=True)
def login():
print('登录系统')
def test_01():
print('测试用例一')
class TestCase1:
def test_03(self):
print('测试用例三')
def test04(self):
print('测试用例四')
class TestCase2:
def test_05(self):
print('测试用例五'')
def test06(self):
print('测试用例六')
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
注意:在TestCase1类和TestCase2类中,login方法都只会被执行一次。函数test_01也会执行一次。
(2) 作用域为类实例二:
import pytest
@pytest.fixture()
def login():
print('登录系统')
def test_01():
print('测试用例一')
@pytest.mark.usefixtures('login')
class TestCase:
def test_03(self):
print('测试用例三')
def test04(self):
print('测试用例四')
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
注意:此方式函数不会被执行,但是被作用的类中的每个函数执行之前都会执行一次,在测试类前面添加:@pytest.mark.usefixtures(‘login’) 其中login为函数名。
(3)作用域为module时表示整个模块中都只会执行一次。这里不在累述。
(4)作用域为package时表示整个包都只会执行一次。这里不在累述。
(5)在N个用例中指定某一个用例执行
import pytest
@pytest.fixture()
def login():
print('登录系统')
def test_01():
print('测试用例一')
class TestCase1:
def test_03(self):
print('测试用例三')
def test04(self,login):
print('测试用例四')
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
注意:test04以参数的形式传入了执行的方法login,这样来指定只有test04方法在执行时才执行login方法。
特别注意:如果在login函数中加入reutrn ‘success’,在test04方法中加入print(login),那么print(login)打印的值就是返回的success.
Fixture参数之params参数可实现参数化:(可以为list和tuple,或者字典列表,字典元祖等)
实例如下:
import pytest
def read_yaml():
return ['1','2','3']
@pytest.fixture(params=read_yaml())
def get_param(request):
return request.param
def test01(get_param):
print('测试用例:'+get_param)
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
注意:
1.此例中test01方法被执行了三次,分别使用的数据为’1′,’2′,’3’,此结果类似于ddt数据驱动的功能。特别注意:这里的request参数名是固定的,然后request.param的param没有s哦。
2.可以把return request.param改成yield request.param,yield也是返回的意思,它和return的区别在于return返回后后面不能接代码,但是yield返回后,后面还可以接代码。
Fixture其他参数:
1.autouse参数:自动执行,上面的示例已经用到了。
2.ids参数:ids参数是给每一项params参数设置自定义名称用的,意义不大。
3.name参数:相对于把被fixture标记的方法重命名,意义不大。
如下图所示案例:
@pytest.fixture(name='mashang') #name参数给fixture设置名称
def login():
print('登录方法')
def testcase(mashang): #使用name参数名来引用,还用login报错
print('测试用例')
使用@pytest.mark.parametrize()方法实现参数化
方法详情:
parametrize(argnames,argvalues,indirect=False,ids=None,scope=None)
常用参数:
argnames:参数名
argnames:参数值(可以为list和tuple,或者字典列表,字典元祖等),参数值有N个,用例就会执行N次。
(1)使用方式一
import pytest
lis = [{'name':'zhangsan'},{'age':'18'},{'sex','男'}]
@pytest.mark.parametrize('caseinfo',lis)
def test01(caseinfo):
print(caseinfo)
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
(2)使用方式二类似于@unpack解包功能实现参数化
import pytest
lis = [('admin','123'),('admin1','123456')]
@pytest.mark.parametrize('username,password',lis)
def test01(username,password):
print(username,password)
if __name__ == '__main__':
pytest.main(['-s','pytest-demo.py'])
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!