領取資料,咨詢答疑,請?wei:? June__Go
上一小節我們學習了使用allure生成html測試報告的方法,本小節我們講解一下pytest fixture測試夾具的使用方法。
前言
在做自動化的過程中,編寫用例時候需要用到用例的前置和用例的后置,其中pytest中有setup_class和teardown_class可以幫助我們完成這些,但是不夠完善而且靈活性不夠強。舉個簡單的例子,一個calss中有3條用例,其中2條需要登錄,1條不需要登錄,這個時候如果在用setup和teardown來做就有點不方便。這個時候就引入了新的知識點fixture。
fixture介紹
fixture是pytest精髓所在,就像unittest中的setup和teardown一樣,但相對之下它的功能更加強大和靈活。
fixture的作用
1.做測試前后的初始化設置,如測試數據準備,鏈接數據庫,打開瀏覽器等這些操作都可以使用fixture來實現
2.測試用例的前置條件可以使用fixture實現
3.支持經典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以實現unittest不能實現的功能,比如unittest中的測試用例和測試用例之間是無法傳遞參數和數據的,但是fixture卻可以解決這個問題
fixture的定義和源碼
我們使用@pytest.fixture()來定義fixture函數。fixture()即可無參數進行定義,也可以帶參數定義。
@pytest.fixture()無參數進行定義
import pytest
@pytest.fixture #fixture()未帶任何參數,聲明一個fixture函數
def fixture_demo():print("這個是一個fixture的demo演示")
def test_demo(fixture_demo): #調用fixture函數——fixture_demoprint("這是一個測試demo。")
@pytest.fixture()有參數的進行定義
import pytest
@pytest.fixture(params=[1,2,3]) #fixture()帶著parmas對ids()進行fixture函數的聲明
def ids(request):data=request.paramprint(f'獲取測試數據{data}')return data
def test_ids(ids): #調用fixture函數-ids()print(ids)
fixture源碼如下
def fixture( # noqa: F811fixture_function: Optional[_FixtureFunction] = None,*,scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",params: Optional[Iterable[object]] = None,autouse: bool = False,ids: Optional[Union[Iterable[Union[None, str, float, int, bool]],Callable[[Any], Optional[object]],]] = None,name: Optional[str] = None
) -> Union[FixtureFunctionMarker, _FixtureFunction]:fixture_marker = FixtureFunctionMarker(scope=scope, params=params, autouse=autouse, ids=ids, name=name,)# Direct decoration.if fixture_function:return fixture_marker(fixture_function)return fixture_marker
通過上述源碼可以看到,fixture中一共有5個參數分別是:
- scope:fixture的作用域,默認為function;
- params:fixture的參數
- autouse:默認:False,需要用例手動調用該fixture;如果是True,所有作用域內的測試用例都會自動調用該fixture;
- ids: fixture參數進行id化命名
- name:裝飾器的名稱,同一模塊的fixture相互調用建議寫不同的name。
fixture調用
調用fixture有三種方式
1、在測試用例中直接調用
將fixture名稱作為參數傳入測試用例,如果fixture有返回值,那么測試用例將會接收返回值。
import pytest@pytest.fixture()
def fixtureFunc():return 'fixtureFunc'def test_fixture(fixtureFunc):print('我調用了{}'.format(fixtureFunc))class TestFixture(object):def test_fixture_class(self, fixtureFunc):print('在類中使用fixture "{}"'.format(fixtureFunc))if __name__=='__main__':pytest.main(['-s', 'test_fixture.py'])
2、使用@pytest.mark.usefixtures('fixture')裝飾器
每個函數或者類前使用@pytest.mark.usefixtures('fixture')裝飾器裝飾
import pytest@pytest.fixture()
def fixtureFunc():print('\n fixture->fixtureFunc')@pytest.mark.usefixtures('fixtureFunc')
def test_fixture():print('in test_fixture')@pytest.mark.usefixtures('fixtureFunc')
class TestFixture(object):def test_fixture_class(self):print('in class with text_fixture_class')if __name__=='__main__':pytest.main(['-s', 'test_fixture.py'])
3、 使用autouse參數
指定fixture的參數autouse=True這樣每個測試用例會自動調用fixture(其實這里說的不是很準確,因為還涉及到fixture的作用范圍,那么我們這里默認是函數級別的,后面會具體說fixture的作用范圍)
import pytest
@pytest.fixture(autouse=True)
def fixtureFunc():print('\n fixture->fixtureFunc')def test_fixture():print('in test_fixture')class TestFixture(object):def test_fixture_class(self):print('in class with text_fixture_class')if __name__=='__main__':pytest.main(['-v', 'test_fixture.py'])
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走,希望可以幫助到大家!領取資料,咨詢答疑,請?wei:? June__Go