4-pytest之高阶用法-appium测试补充
程序员文章站
2024-02-27 13:53:51
...
pytest之高阶用法
一:pytest之fixture介绍
1,fixture 修饰器用来标记固定的工厂函数,在其他函数、模块、类或者整个工程调用他时会被**优先执行,
通常被用作完成预处理和重复操作
注释:
工厂函数
工厂函数都是类对象, 即当你调用他们时, 创建的其实是一个类实例
例如: str(), list(), tuple()...
内建函数
内建函数通常是python自定义的一些函数, 这些函数通常具有某些特定的功能
例如: len(), hex(), string.capitalize()...
2,ixture是以模块化的方式实现的,因为每个fixture名称都会触发fixture函数,其本身也可以使用其他fixture
3,fixture管理从简单的单元扩展到复杂的函数测试,允许根据配置和组件选项参数化fixture和测试,或者在函数、类、模块或整个测试会话范围内重复使用fixture
二:pytest之fixture用途
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能
a>unittest中的测试用例和测试用例之间是无法传递参数和数据的;
b>当每个测试用例的执行环境和条件都不一样时,显然无法用 setup 和 teardown 来实现但是fixture却可以解决这个问题;
c>fixture可以使环境管理更灵活,每个测试用例可以有自己的fixture,作用域可对整个测试类全局生效;
二:pytest之fixture用法
fixture(scope="function",params=None,autouse=False,ids=None,name=None,
1,scope:可以理解成fixture的作用域,
默认:function,作用于每个测试方法,每个test都运行一次
class,作用于整个类,每个class的所有test 只运行一次
module,作用于整个module,每个module的所有test 只运行一次,moudule是__init__.py 定义成的资源包
session:作用于整个session,每个session 只运行一次
2,params:list类型,提供参数数据,供调用标记方法的函数使用
3,autouse:是否为自动运行,False为关闭,True 为自动运行
三:pytest之fixture调用
1,通过参数的调用
import pytest
@pytest.fixture()
def before():
print('\n'+'before_'.rjust(50,'>'))
with open('data.text',"w") as f:
f.write("1")
class Test_demo:
def test_a(self,before):
with open('data.text',"r") as f:
assert f.read() =="1", "前置写入的不是1"
if __name__ == '__main__':
pytest.main(" -s test_demo.py")
注释:
1,优先运行fixture修饰before() 函数
2,test_a中修饰before函数在此作为参数传入
3,如果此处不调用的话,before就不会运行,想要不传参也运行时,@pytest.fixture(autouse=True)默认是function 时,类内全部用例都会前置执行一次before
@pytest.fixture(scope='class',autouse=True)
当设置成class时,一个类只执行一次。
2,通过函数的调用
# -*-coding:utf-8 -*-
import pytest
def before():
print('before')
with open('data.text',"w") as f:
f.write("1")
@pytest.mark.usefixtures("before")
class Test_demo:
def setup(self):
print('setup ')
def teardown(self):
print('teardown')
def test_a(self):
print('test_a')
with open('data.text',"r") as f:
assert f.read() =="1", "前置写入的不是1"
def test_b(self):
print('test_b')
assert True
if __name__ == '__main__':
pytest.main(" -s test_demo.py")
注释:
1,test_a不做传参使用,因@pytest.mark.usefixtures("before")修饰类,在类内的所有的test用例执行前都会执行before函数,setup 与teardown除外
2,test_a传参和@pytest.mark.usefixtures("before")修饰类同时修饰时,单个用例传参效果与@pytest.mark.usefixtures("before")修饰效果相同。
3,@pytest.mark.usefixtures("before")此处也可单独放在类中函数中,执行时只会在这个函数之前执行一次
3,通过函数的调用
上一篇: pytest-运行次序(1)