pytest系列之用例的前后置问题

339 阅读2分钟

1 所有用例前后置

def setup(self):
    print('每个用例开始前执行')
​
def setup_class(self):
    print('每个类之前执行')
​
def teardown(self):
    print('每个用例结束后执行')
​
def teardown_class(self):
    print('每个类结束后执行')

2 部分用例前后置

@pytest.fixture(scope='function', autouse=False, params=None, ids=None, name=None)
def excute_sql(request):
    print('执行SQL查询')
    yield request.param
    print('关闭数据库连接')
​
​
class TestLogin(CommonUtil):
​
    def test_01_db(self):
        print('数据库测试01')
​
    def test_02_db(self):
        print('数据库测试02')

2.1 scope:作用域

function:在函数之前和之后执行

1.手动调用时要在测试用例的参数里面加入fixture的名称

2.fixture有返回值时,可以通过固件名字将其传入测试用例

class:在类之前和之后执行

1.手动调用时要在类定义时添加装饰器 @pytest.mark.usefixtures("excute_class_sql")

package/session:在整个项目会话之前和之后执行,一般会结合conftest.py进行使用

2.2 autouse:自动执行

默认是False,代表需要手动执行。True代表不需要手动执行

如果希望在其他文件中调用需要结合conftest.py文件使用

2.3.params:用来实现参数化

通过在fixture函数的里面加入request来接受参数,然后通过request.param来取值

@pytest.fixture(scope='function', autouse=False, params=read_yaml())
def excute_sql(request):
    print('执行SQL查询')
    yield request.param
    print('关闭数据库连接')

2.4.ids

必须和params一起使用,用于给参数起别名

@pytest.fixture(scope='function', autouse=False, params=read_yaml(), ids=["01", "02", "03"])
def excute_sql(request):
    print('执行SQL查询')
    yield request.param
    print('关闭数据库连接')

2.5.name

作用是给fixture起别名,注意和ids的区别。

@pytest.fixture(scope='function', autouse=False, params=read_yaml(), ids=["01", "02", "03"], name="db")
def excute_sql(request):
    print('执行SQL查询')
    yield request.param
    print('关闭数据库连接')

一旦起了别名,那么fixture的名称就不能再用了,只能用别名。

3 conftest.py文件

1.专门用于存放fixture的配置文件,名称是固定的,不能改变。

2.调用conftest.py中的方法时不需要进行导入

3.conftest.py可以有多个,且多个conftest.py文件中的多个fixture可以被一个用例所调用

多线程时fixture中的额打印信息无法看到

4 优先级的问题

fixture的session级别>fixture的class级别>setup_class>fixture的function级别>setup