单元测试之Fixture

声明:

作者:zhaojun  创建日期:2017-08-04  更新日期:2017-08-07

 

一、什么是Fixture,Fixture有什么作用,为什么需要使用Fixture

# 下载
pip install fixtures

Fixture就是打桩,就好比testunit中的setUp、tearDown,起到在测试用例执行前做一些准备和测试用例执行后做一些清理工作。那既然测试用例已经有了setUp、tearDown,为什么还需要Fixture呢?

  • 1、不同测试用例需要的资源不同,都在setUp中统一写不合理,有些资源准备耗时长会整体拉长测试用例执行时间,Fixture可以为每个测试用例个性化定制所需要的资源和清理工作;
  • 2、将准备工作、清理工作抽象出来可以实现代码复用;
  • 3、使用Fixture更灵活,需要的时候才使用。

Fixture表示一些状态或者资源,经常用在测试中,一个Fixture使用前必须调用setUp进行资源初始化,测试用例测试完后调用cleanUp进行资源清理(因为很多Fixture有一些比如临时目录等资源),调用reset方法可以起到调用cleanUp、setUp方法相同的效果并且可能会更快。

 

二、怎么开发自己的Fixture

在python的fixtures模块中有一个Fixture接口类,自定义Fixture需继承该类,并推荐覆写其中的_setup方法,覆盖setUp方法目前也支持。该类有几个核心方法:setUp、_setUp、addCleanup、reset、useFixture。

 

  1. 资源初始化、设置清理工作:setUp
  2. 主要需要进行覆写的方法,进行资源初始化:_setUp
  3. 会被测试框架自动调用,清理状态:clenaUp
  4. _setUp中需要调用的方法,添加tearDown执行后需执行的清理方法:addCleanup
  5. 重置Fixture、自动调用cleanUp、setUp:reset
  6. 在Fixture中使用其他Fixture:useFixture

 

三、别人是怎么开发Fixture的

在python的fixtures模块中有很多现有可以直接使用的fixture,选其中几个进行分析。

1、TempDir:创建临时目录

from fixtures import TempDir

在_setUp中创建临时目录,并调用addCleanup在测试用例测试完后删除临时目录。

 

 2、Timeout:指定时间后发送闹钟信号

from fixtures import Timeout

 在_setup中设置信号并调用addCleanup测试用例结束后设置回原先状态。

 

3、Database:指定时间后发送闹钟信号

 在setUp中创建库表,并调用addCleanup设置测试用例执行完后卸载库表

 

四、怎么使用Fixture

pip install WebTest

 

testtools.TestCase中封装了useFixture方法,用于启动Fixture,注册Fixture清理方法

复制代码
from testtools import TestCase
import webtest


class AlarmTests(TestCase):
    def setUp(self):
        super(AlarmTests, self).setUp()

        self.useFixture(database.Database())
        self.load_backends()

        self.public_app = webtest.TestApp(self.loadapp('cloundmanager'))
        self.allCleanup(delattr, self, 'public_app')
复制代码

 

 五、怎么开发url请求测试用例

  • Test Case需要派生于 testtools.TestCase 类
  • 如果需要自定义Fixtures, 需要派生于 fixtures.Fixture类, 并覆写父类的setUp/cleanUp方法
复制代码
import fixtures
import testtools
 
class MyFixture(fixtures.Fixture):  # 定义fixtrues
    def setUp(self):
        super(MyFixture,self).setUp()
        self.frobnozzle = 42
        
    def cleanUp(self):
        super(MyFixture,self).cleanUp()

           
class MyTestCase(testtools.TestCase):  # 在单元测试中使用useFixture去调用上面定义的fixtrue

    def setUp(self):
        super(MyTestCase, self).setUp()
        self.my_fixture = self.useFixture(MyFixture())
        
    def test_case_1(self):
        self.assertEqual(42, self.my_fixture.frobnozzle)
        self.addCleanup(delattr, self, 'my_fixture')  # 调用cleanUp进行清理工作
复制代码

 

六、官方文档

https://pypi.org/project/fixtures/

 

posted @   我用python写Bug  阅读(1296)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示