Pytest系列(6) - conftest.py的詳細講解

2021-03-02 小菠蘿測試筆記

什麼是conftest.py

可以理解成一個專門存放fixture的配置文件

實際開發場景

多個測試用例文件(test_*.py)的所有用例都需要用登錄功能來作為前置操作,那就不能把登錄功能寫到某個用例文件中去了

 

如何解決上述場景問題?

conftest.py的出現,就是為了解決上述問題,單獨管理一些全局的fixture

 

conftest.py配置fixture注意事項

pytest會默認讀取conftest.py裡面的所有fixture

conftest.py 文件名稱是固定的,不能改動

conftest.py只對同一個package下的所有測試用例生效

不同目錄可以有自己的conftest.py,一個項目中可以有多個conftest.py

測試用例文件中不需要手動import conftest.py,pytest會自動查找

 

實際項目中的小案例

這是一個目錄

 

06conftest目錄下conftest.py代碼最頂層的conftest,一般寫全局的fixture,在Web UI自動化中,可能會初始化driver

"""__title__ =__Time__ = 2020-04-08 21:22__Author__ = 小菠蘿測試筆記__Blog__ = https://www.cnblogs.com/poloyy/"""import pytest
@pytest.fixture(scope="session")def login(): print("====登錄功能,返回帳號,token===") name = "testyy" token = "npoi213bn4" yield name, token print("====退出登錄!!!====")

@pytest.fixture(autouse=True)def get_info(login): name, token = login print(f"== 每個用例都調用的外層fixture:列印用戶token:{token} ==")

 

test_1.py代碼同級目錄下的第一條測試用例
def test_get_info(login):    name, token = login    print("***基礎用例:獲取用戶個人信息***")    print(f"用戶名:{name}, token:{token}")

 

06_run.py代碼運行06conftest目錄下所有測試用例
import pytest
if __name__ == '__main__':    pytest.main(["-s", "../06conftest/"])

test_51job目錄下conftest.py代碼配置一些針對51job這個網站的測試用例獨有的fixture,譬如:打開51job網站
import pytest
@pytest.fixture(scope="module")def open_51(login):name, token = loginprint(f"###用戶 {name} 打開51job網站###")

test_case1.py代碼某個功能模塊下的測試用例
def test_case2_01(open_51):    print("51job,列出所有職位用例")

def test_case2_02(open_51):    print("51job,找出所有python崗位")

test_toutiao目錄下test_case1.py代碼

包沒有__init__.py文件也沒有conftest.py文件

def test_no_fixture(login):    print("==沒有__init__測試用例,我進入頭條了==", login)

test_weibo目錄下conftest.py代碼配置一些針對weibo這個網站的測試用例獨有的fixture,譬如:打開weibo網站
import pytest
@pytest.fixture(scope="function")def open_weibo(login): name, token = login    print(f"&&& 用戶 {name} 返回微博首頁 &&&")

test_case1.py代碼某個功能模塊下的測試用例
class TestWeibo:    def test_case1_01(self, open_weibo):        print("查看微博熱搜")
def test_case1_02(self, open_weibo):        print("查看微博範冰冰")

運行06_run.py的結果

 

相關焦點

  • Pytest中conftest.py共享fixture(五)
    在pytest中通過conftest.py來共享fixture,如果希望多個測試文件共同使用一個fixture時候,可以在該目錄下創建conftest.py文件,但是切記該文件絕對不能倒入使用,這點一定要注意,創建conftest.py文件後,把需要的fixture加入到裡面,就可以使用了。
  • pytest(8):fixture與conftest.py結合使用
    上一篇介紹了fixture scope的幾種使用方式,除了直接寫入到用例頁,也可以使用conftest.py文件達到同樣的效果。  1.conftest.py名稱是固定的,必須是這個不能變。  2.與要調用的包在一個目錄下,並且這個包下要有__init__.py   3.使用的時候不需要導入 conftest.py,pytest 會自動識別到這個文件  4.放到項目的根目錄下可以全局調用,放到某個 package 下,就在這個 package 內有效。
  • pytest「conftest、pytest參數化、重運行、出測試報告」
    文章總覽圖一、conftest問題整理:1.這個conftest.py分路徑嗎?如果在TestCases下建這個包可以直接用嗎?TestCases這裡有ModeA和ModeB,想在ModeA或ModeB下面用這個conftest.py裡面的,一樣全部都可以用。
  • 手把手教你pytest測試框架(7)-fixture裝飾器
    測試框架(1)-初識框架手把手教你pytest測試框架(2)-參數講解手把手教你pytest測試框架(3)-用例失敗重跑手把手教你pytest測試框架(4)-前置和後置手把手教你pytest測試框架(5)-mark標記裝飾器概念fixture用來完成那些需要多次重複執行的用例
  • 人人都能看懂的 Pytest 簡易上手指南!
    使用 pytest test_sample.py 運行測試用例:# pytest test_sample.py========================================================================================================= test
  • python pytest接口自動化框架搭建
    pytest2.編寫單測用例在pytest框架中,有如下約束:所有的單測文件名都需要滿足test_*.py格式或*_test.py格式。import pytest# content of test_sample.pydef func(x): return x + 1def test_answer(): assert func(3) == 5運行 pytest  或 指定特定文件 pytest -q test_sample.py
  • Python測試框架Pytest的常用插件測試報告
    一、pytest-html 生成 html 測試報告要求:Python 3.6+安裝:pip install pytest-html文檔:https://github.com/pytest-dev/pytest-html、https://www.cnblogs.com
  • pytest hook - 我的用例我做主
    pytest除了強大的用例發現、收集、執行和報告輸出之外,還提供了豐富的函數hook可以自定義插件或者框架行為,只需在項目目錄/conftest.py文件中實現對應hook名稱的函數,即可完成hook函數的註冊。
  • 基於Pytest框架的自動化測試開發實踐(萬字長文入門篇)
    接下來,通過開發一個API自動化測試項目,詳細介紹以上這些功能是如何使用的。創建測試項目先創建一個測試項目目錄api_pytest,為這個項目創建虛擬環境。關於虛擬環境的創建,可以參考這篇文章《利用pyenv和pipenv管理多個相互獨立的Python虛擬開發環境》。
  • pytest系列——Hook函數的使用
    pytest_itemcollected(item: Item) 我們剛剛收集了一個測試項目。pytest_collectreport(report: CollectReport) 收集器完成收集。pytest_deselected(items: Sequence[Item]) 要求取消選擇的測試項目,例如按關鍵字。pytest_report_header(config: Config, startdir: py.
  • Pytest進階:Hook函數的使用技巧
    pytest實際上提供了整個測試運行時、用例、配置等對象的聲明周期,這裡我們擴展解讀一下(由於沒有官方文檔,此處有很多屬於個人經驗下的猜測),同時也高亮一下常用的Hook函數。這些Hook函數,可以在_pytest.hookspec.py文件中找到。【引導階段】pytest測試進程在執行之前的階段。【
  • 實戰 | 接口自動化測試框架開發(Pytest+Allure+AIOHTTP+用例自動生成)
    認可的測試用例首先說明下 pytest 的運行機制,pytest 首先會在當前目錄下找 conftest.py 文件,如果找到了,則先運行它,然後根據命令行參數去指定的目錄下找 test 開頭或結尾的 .py 文件,如果找到了,如果找到了,再分析 fixture,如果有 session 或 module 類型的,並且參數 autotest=True 或標記了 pytest.mark.usefixtures
  • Pytest之命令行執行
    但是隨著業務的擴張,就會有很多的集群,每個集群都是需要被測試和驗證(後續在文章中詳細的介紹SAAS化集群的容量規劃,調度,計算和存儲的驗證思路),考慮到每個集群都是需要被驗證,那麼測試代碼只有一套,不可能說面對多個集群而有多套代碼,這樣從成本來說它是非常不合理的。
  • 乾貨 | 一文搞定 pytest 自動化測試框架(一)
    >運行 test_add.py 文件,在命令行進入到這個文件所在的路徑,可以直接使用 pytest 命令運行,pytest 會找當前目錄以及遞查找子目錄下所有的 test_*.py 或 *_test.py 的文件,把其當作測試文件。
  • Pytest的基本應用(一)
    但是前提是需要安裝pytest,它是屬於第三方的庫,安裝的命令為:                   pip  install pytest          在這裡先寫一個函數的測試代碼,來說明pytest的應用,創建f.py的模塊,在裡面編寫以test開頭的測試代碼,然後在該目錄下執行pytest,發現測試代碼並沒有執行,見如下截圖
  • Pytest測試用例之setup與teardown方法(二)
    " in p def test_002(self): print("正在執行第二條用例") p = 'test' assert 't' in p if __name__ == '__main__': pytest.main(['-s', 'test_fixtclass.py'])
  • pytest文檔42-fixture參數化params
    The name of the fixture function can later be referenced to cause its invocation ahead of running tests: test modules or classes can use the ``pytest.mark.usefixtures(fixturename)`` marker.
  • Pytest之並發執行(十四)
    (a,b,result): t.sleep(1) assert add(a,b)==result執行命令:pytest -v test_time.py執行後,輸出的結果信息顯示執行時間為9秒多,如下圖所示:     下面結合插件pytest-xdist來執行,執行的時候指定一定運行的處理器進程數
  • pytest---setup和teardown簡單用法
    print('用例01')def test02():    print('用例02')if __name__ == '__main__':    pytest.main(['-s','test_02.py'])
  • Pytest丨如何使用全功能的Python測試框架?小白必看
    pytest斷言前面說到pytest的斷言比較強大,它直接可以使用python自帶的斷言內容,當然不止而已,pytest還有一個重要的功能是可以重寫assert關鍵字,pytest會截斷對python中自帶的assert的調用然後替換成自己定位的assert,從而可以獲取更多的錯誤信息,讓我們知道具體哪裡出現了問題