聲明:
作者: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。
- 資源初始化、設置清理工作:setUp
- 主要需要進行覆寫的方法,進行資源初始化:_setUp
- 會被測試框架自動調用,清理狀態:clenaUp
- _setUp中需要調用的方法,添加tearDown執行后需執行的清理方法:addCleanup
- 重置Fixture、自動調用cleanUp、setUp:reset
- 在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/