pytest之fixture


pytest 相較於 unittest 最為跳躍的一點應該就是 fixture 機制

對於unittest來說,每個用例的類中都需要去寫入setUp和tearDown。也就是我們所說的前置和后置,

而不可避免的,很多用例的前置和后置都是一樣(例如很多用例都需要前置登錄,后置退出),於是我們需要重復的復制粘貼,這樣導致工作量增加,代碼量也增加,界面也顯得冗雜。

所以此時pytest中fixture機制便要閃亮登場了。

通俗的講: fixture = 前置+后置

而方便的是:如果很多用例都有同樣的前置和后置,那么我就只實現一個,然后需要的用例就去調用就好了。

1.機制:與測試用例同級,或者是測試用例的父級,創建一個conftest.py文件。

2.conftest.py文件里:放所有的前置和后置。 不需要用例.py文件主動引入conftest文件。

3.定義一個函數:包含前置操作+后置操作。

4.把函數聲明為fixture :在函數前面加上 @pytest.fixture(作用級別=默認為function)

5.fixture的定義。

  如果有返回值,那么寫在yield后面。(yield的作用就相當於return)

    在測試用例當中,調用有返回值的fixture函數時,函數名稱就是代表返回值。

    在測試用例當中,函數名稱作為用例的參數即可。

 1. 如下: 定義一個函數名叫open_url的fixture前后置,前置為打開鏈接,后置為退出瀏覽器

  @pytest.fixture(scope="class") #定義scope的范圍

  def open_url():

    # 前置
driver = webdriver.Chrome()
driver.get(url) #url為鏈接地址
yield driver #yield之前代碼是前置,之后的代碼就是后置。
# 后置
driver.quit()
這樣我們就定義了一個叫做 open_url 的 fixture
2.在我們要用這個前后置的類前面 我們用
@pytest.mark.usefixtures(fixture函數名)
就可以直接調用上面定義好的這個前后置
可以看到 在TestLogin 這個類中 我們不再去編寫setup 和 teardown. 直接寫我們的中間過程就可以了。是不是很方便了?
3.進階方法:conftest中定義多個fixture,一個fixture可以是另一個fixture的前后置,期間還是用field隔開前后置
如上圖中可以看到我class中另外還引用了一個名為refresh_page的fixture,直接上代碼:
# 刷新頁面 - 定義的第二個fixture
@pytest.fixture
def refresh_page(open_url):
yield
open_url.refresh()
直接將open_url作為了另一個fixture的前置引用進來,用yield隔開,當用例中執行完open_url前后置后,再執行了一次refresh的后置。
執行順序: open_url yield 之前代碼 -- 用例代碼 -- open_url yield 之后代碼 --》 refresh_page yield 之后代碼
是不是很妙,可以解決許多用例流程環環相扣時的麻煩。

4.說到上面的多個fixture調用,很多人就會疑惑,會不會fixture之間相互沖突。
當然是不會了,fixture在conftest.py當中就已經決定了他的用例域,他會主動去區分你這個fixture是作用在哪個用例域。
首先我們看一下框架中對於fixture函數的定義:

 

scope便是定義用例域的范圍:
function:默認范圍,每一個函數或方法都會調用,不填寫時便是它
class:每一個類調用一次
module: 每一個.py文件調用一次,文件中可以有多個function和class
session:多個文件調用一次,可以跨文件,如在.py文件中,每一個.py文件就是module
范圍:
session > module > class > function

所以在調用時各個fixture之間並不會相互沖突。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM