pytest 单元测试前后置处理

文章目录

  • 方法1 setup/teardown
  • 方法2 fixture 夹具
  • 方法3 conftest.py

测试用例执行前后的一些处理动作,也叫夹具。以下介绍使用前后置操作的几种方法。
 

方法1 setup/teardown

setup,每个测试用例执行前要进行的处理。
teardown,每个测试用例执行结束后要进行的处理。

python3.9中新版本改为setup_method\teardown_method

import pytest


class TestMyProject:
	def setup(self):
		print("每个测试用例执行前的初始化")

	def test_001(self):
		print("测试用例1")
	
	def test_002(self):
		print("测试用例2")

	def teardown(self):
		print("每个测试用例执行结束后的收尾")

 
setup_class/teardown_class
每个测试类初始化前后的操作,如创建日志对象,连接数据库等操作。


class TestMyProject:
	def setup_class(self):
		# 如连接数据库
		print("测试类初始化前的操作")
		
	def setup(self):
		print("每个测试用例执行前的初始化")

	def test_001(self):
		print("测试用例1")
	
	def test_002(self):
		print("测试用例2")

	def teardown(self):
		print("每个测试用例执行结束后的收尾")

	def teardown_class(self):
		# 如关闭数据库
		print("测试类执行后的操作")

 

方法2 fixture 夹具

实现全部或者部分测试用例的前后置处理。

结构及参数

# scope 被标记方法的作用域(函数、类、模块、包)
# params 被标记方法的参数化
# autouse 是否自动使用
# name 别名
@pytest.fixture(scope, params, autouse, ids, name)
def my_func():
	print("前置操作")
	# yield分割前后置操作
	yield
	print("后置操作")
	

 
autouse=False:
非自动使用时,要将my_func传入指定的测试用例(谁需要传给谁);
自动使用且scope="function"时, 将my_func前后置操作用于所有的测试用例。
scope="class"时(autouse=True),每个测试类执行前后置操作。
scope="module"时(autouse=True),每个模块中,执行一次前后置操作。

# 定义夹具操作
@pytest.fixture(scope="function", autouse=False, name="别名")
def my_func():
	print("前置操作")
	# yield分割前后置操作
	yield
	print("后置操作")


class TestMyProject:
	def test_001(self, my_func): 
		# 仅001测试用例有前后置操作,非自动使用要传入
		print("测试用例1")
	
	def test_002(self):
		# 没有前后置操作
		print("测试用例2")

 
params参数使用:
可以给被fixture装饰的函数传入参数。
类型为list/tuple、字典组成的列表&元组

import pytest
import time


params = [
    {#每个字典为一组参数,用例执行一次
        "name": "jack",
        "age": 23
    }, {
        "name": "lucy",
        "age": 18
    }]


# 夹具操作
# ids 设置每个参数的变量名
@pytest.fixture(scope="function", params=params, ids=["dict_1", "dict_2"], autouse=False, name="func_lauf")
def func(request): # 参数必须使用request且调用param属性拿到参数值
	print("前置操作...")
    yield request.param  # 抛出值后执行外部函数体;外部执行结束再执行yield后面的部分
	print("前置操作...")

class TestWebClass:
    # 部分测试用例使用夹具,传入函数的返回值
    # 变量必须与函数别名相同(无别名则用函数名)
    def test_001(self, func_lauf): # func_lauf 为夹具别名,执行时传入夹具的返回值
        print("test 001 成功")
        print("********** 夹具返回值:", func_lauf)

    def test_002(self):
        time.sleep(3)
        assert 1 == 1

 

方法3 conftest.py

  1. conftest.py需要结合fixture一起使用,将fixture装饰的函数放入该模块,实现全局的使用;
  2. conftest.py放入测试用例的同级目录;
  3. 当前包的子包可以使用当前包的conftest.py;
  4. 测试用例优先查找本包的conftest.py;
  5. 测试用例使用时,直接传入夹具即可,不需要导入;

你可能感兴趣的:(pytest单元测试,pytest,单元测试,python)