pytest测试框架使用基础03 setUp()和tearDown()

本文介绍了Python中setUp()和tearDown()函数的作用,以及在Pytest框架下的不同级别(模块级、类级、方法级、函数级)应用。通过示例展示了如何在Selenium自动化测试中使用这些函数来管理和优化测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、setUp()和tearDown()函数介绍

前置setup()函数和后置teardown()函数非常好用,在每次用例开始前和结束后都去执行一次。
当然还有更高级一点的setupClass()函数和teardownClass()函数,需配合classmethod装饰器一起使用,
在做Selenium自动化的时候,它的效率尤为突出,可以只启动一次浏览器执行多个用例。

2、setUp()和tearDown()函数作用

  • setup() 函数主要是进行测试前的初始化工作,比如:在接口测试前面做一些前置的参数赋值,数据库操作等等。 teardown()
  • 函数是测试后的清除工作,比如:参数还原或销毁,数据库的还原恢复等。

总结:setup()函数表示测试类中每个测试方法执行前都需要执行的操作,teardown()函数表示每个测试方法执行后都需要执行的操作。

3、Pytest框架的setUp()和tearDown()

Pytest框架也有前置setup()函数和后置teardown()函数,并且还不止四个。
Pytest框架setUp()函数和tearDown()函数主要分为:模块级,类级,方法级,函数级。

说明每个级别的含义:
模块级:指的是一个.py文件。
类级:一个.py文件中可以写多个类。(一般情况下只写一个类)
方法级:类中定义的方法叫方法。
函数级:类外定义的方法叫函数。

Pytest框架提供的setUp()函数和tearDown()函数如下:
模块级与函数级,不定义在测试类中。

  • 模块级:setup_module()/teardown_module():开始于模块始末,全局的。
  • 函数级:setup_function()/teardown_function():只对函数用例生效(不在类中)。

类级与方法级,定义在类中

  • 类级:setup_class()/teardown_class():只在类中前后运行一次(在类中)。
  • 方法级:setup_method()/teardown_method():开始于方法始末(在类中)。
  • 自由的:setup()/teardown():直接使用感觉和方法级前后置函数一样。

4、示例

(1)方法级

"""
setup_method()和 teardown_method()函数
需要定义在测试类中,定义在类外不起作用。
setup_method()定义场景,如:打开浏览器,加载网页等
teardown_method()场景,如:关闭浏览器等
"""

import pytest

class Test_SetUp_tearDown:

    # 方法级,前置函数
    def setup_method(self):
        print("setup_method(self):在每个用例之前执行\n")

    def teardown_method(self):
        print("teardown_method(self):在每个用例之后执行\n")

    def test_a(self):
        print("测试方法a")
        assert True

    def test_b(self):
        print("测试方法b")
        assert True

if __name__ == '__main__':
    pytest.main()


"""
运行结果
============================= test session starts =============================
collecting ... collected 2 items
Test_setup_teardown.py::Test_SetUp_tearDown::test_a setup_method(self):在每个用例之前执行
测试方法a
PASSEDteardown_method(self):在每个用例之后执行
Test_setup_teardown.py::Test_SetUp_tearDown::test_b setup_method(self):在每个用例之前执行
测试方法b
PASSEDteardown_method(self):在每个用例之后执行
============================== 2 passed in 0.06s ==============================

"""

(2)类级

"""
setup_class()和 teardown_class()函数
需要定义在测试类中,定义在类外不起作用。
setup_class()定义场景,比如:创建日志对象,创建数据库的连接,创建接口的请求对象等。
teardown_class()定义场景,比如:销毁日志对象,销毁数据库的连接,销毁接口的请求对象。
"""
 
import pytest
 
 
class Test_setUp_tearDown:
 
    # 方法级,前置函数
    def setup_method(self):
        print("setup_method(self):在每个测试方法之前执行")
 
    # 方法级,后置函数
    def teardown_method(self):
        print("teardown_method(self):在每个测试方法之后执行\n")
 
    # 类级,前置函数
    def setup_class(self):
        print("setup_class(self):每个测试类之前执行一次\n")
 
    # 类级,后置函数
    def teardown_class(self):
        print("teardown_class(self):每个测试类之后执行一次")
 
    # 测试用例a
    def test_a(self):
        print("test_a方法")
        assert True
 
    # 测试用例b
    def test_b(self):
        print("test_b方法")
        assert True
 
 
if __name__ == '__main__':
    pytest.main()
 
"""
执行结果:
setup_class(self):每个测试类之前执行一次
setup_method(self):在每个测试方法之前执行
test_a方法
teardown_method(self):在每个测试方法之后执行
PASSEDsetup_method(self):在每个测试方法之前执行
test_b方法
teardown_method(self):在每个测试方法之后执行
teardown_class(self):每个测试类之后执行一次
"""

(3)函数级

"""
setup_function()和 teardown_function()函数
需要定义在测试类外面,只负责函数的前后置。
对类中定义的方法,不起作用。
"""
 
import pytest
 
# 函数级,前置函数
def setup_function():
    print("setup_function: 每个函数开始前都会执行")
 
# 函数级,后置函数
def teardown_function():
    print("teardown_function: 每个函数结束都会执行\n")
 
 
# 测试用例a
def test_a():
    print("test_a函数")
    assert True
 
 
# 测试用例b
def test_b():
    print("test_b函数")
    assert True
 
# 测试类
class Test_setUp_tearDown:
 
    # 测试用例a
    def test_c(self):
        print("test_c方法")
        assert True
 
    # 测试用例b
    def test_d(self):
        print("test_d方法")
        assert True
 
 
if __name__ == '__main__':
    pytest.main()
 
"""
执行结果:
setup_function: 每个函数开始前都会执行
test_a函数
teardown_function: 每个函数结束都会执行
PASSEDsetup_function: 每个函数开始前都会执行
test_b函数
teardown_function: 每个函数结束都会执行
PASSEDtest_c方法
PASSEDtest_d方法
PASSED
"""

(4)模块级

"""
setup_module()和 teardown_module()函数
需要定义在测试类外面,
对函数和类中定义的方法,都不起作用。
"""
 
import pytest
 
 
# 模块级,前置函数
def setup_module():
    print("setup_module():在模块最之前执行\n")
 
 
# 模块级,后置函数
def teardown_module():
    print("teardown_module:在模块之后执行")
 
 
# 函数级,前置函数
def setup_function():
    print("setup_function: 每个函数开始前都会执行")
 
 
# 函数级,后置函数
def teardown_function():
    print("teardown_function: 每个函数结束都会执行\n")
 
 
# 测试用例a
def test_a():
    print("test_a函数")
    assert True
 
 
# 测试用例b
def test_b():
    print("test_b函数")
    assert True
 
 
# 测试类
class Test_setUp_tearDown:
 
    # 测试用例a
    def test_c(self):
        print("test_c方法")
        assert True
 
    # 测试用例b
    def test_d(self):
        print("test_d方法")
        assert True
 
 
if __name__ == '__main__':
    pytest.main()
 
"""
setup_module():在模块最之前执行
setup_function: 每个函数开始前都会执行
test_a函数
teardown_function: 每个函数结束都会执行
PASSEDsetup_function: 每个函数开始前都会执行
test_b函数
teardown_function: 每个函数结束都会执行
PASSEDtest_c方法
PASSEDtest_d方法
teardown_module:在模块之后执行
PASSED
"""
pytestunittest都是Python中常用的测试框架。其中,setupteardown是两个常用的测试用例执行前执行后的钩子函数。 在pytest中,setupteardown可以通过pytest.fixture装饰器来使用。装饰器可以被附加到函数、方法或类上,以标记其为fixture。当测试函数需要使用fixture时,它们可以将fixture名称作为输入参数,pytest将自动查找运行fixture函数,并将其输出值传递给测试函数。例如: ```python import pytest @pytest.fixture def setup(): print("执行setup操作") yield print("执行teardown操作") def test_example(setup): print("执行测试操作") ``` 在这个例子中,setup函数被标记为fixture,test_example函数接收setup作为输入参数。在运行test_example函数之前,pytest将自动运行setup函数,然后运行测试函数,最后再运行teardown函数。 在unittest中,setupteardown可以通过setUptearDown方法来实现。这些方法被定义在unittest.TestCase类中,并在每次运行测试方法之前之后自动调用。例如: ```python import unittest class TestExample(unittest.TestCase): def setUp(self): print("执行setup操作") def tearDown(self): print("执行teardown操作") def test_example(self): print("执行测试操作") ``` 在这个例子中,TestExample类继承自unittest.TestCase类,并覆盖了setUptearDown方法。在运行test_example方法之前,unittest将自动调用setUp方法,然后运行测试方法,最后再调用tearDown方法。 总体而言,pytestunittest都提供了简单易用的setupteardown机制来帮助测试人员编写可靠的测试用例。但是,pytest相对于unittest更加灵活,可以通过fixture装饰器来定义setupteardown函数,同时也提供了更多的扩展性定制化选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值