pytest框架的安裝與使用
- 2020 年 7 月 13 日
- 筆記
- python中的pytest測試框架
pytest框架的安裝與使用
一,pytest了解
pytest是python的一種單元測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,效率更高。
優點:
1.第一個優點肯定是簡單,靈活,易上手
2.支援參數化,pytest直接使用@pytest.mark.parametrize裝飾器
3.能夠支援簡單的單元測試和複雜的功能測試,還可以用來做selenium/appnium等自動化測試、介面自動化測試(pytest+requests)
4.pytest有豐富的第三方插件庫,比如pytest-HTML、allure插件,專門用作與測試報告。pytest-selenium插件,集成測試。pytest-rerunfailures插件,用於失敗重跑。pytest-assume插件,多重效驗。pytest-ordering設定執行順序等實用插件。
5.pytest斷言直接在assert 後面接表達式
6.conftest.py 配置里可以實現數據共享,不需要import就能自動找到一些配置,可供多個py文件調用。
7.scope=”session” 以實現多個.py跨文件使用一個session來完成多個用例
二,安裝
1.安裝pytest
2種安裝方法。
1是直接通過pip安裝。安裝命令為:pip install pytest,
檢測是否安裝成功命令:pytest –version ,如果他顯示了版本名稱,就表示已經安裝成功。
2是通過官網直接下載然後放進python插件庫里。
下載地址://pypi.org/project/pytest/
2.安裝插件
安裝html插件命令:pip install pytest-html
除開 pytest-html插件外 ,pytest還具備豐富的插件庫,pytest插件匯總站點://plugincompat.herokuapp.com/
三,pytest執行測試需要遵循的規則(重要)
· .py測試文件必須以test_開頭或者_test結尾
· 測試類必須以Test開頭,並且不能有init方法
· 測試方法必須以test_開頭
· 測試斷言用assert
使用:
1,先創一個以test_開頭的文件
2,創建一個Test_code
3,創建測試方法
1 # -*- coding: utf-8 -*- 2 3 class Test_code: 4 def test_jian(self): 5 assert 520==520
執行有兩種方法:
1,是通過dos命令或者pycharm的命令窗口輸入pytest。
2是通過在主函數中用程式碼執行。需要導入pytest包。
可以在mian()中填上哪個用例方法就執行哪個。
# -*- coding: utf-8 -*- import pytest class Test_code: def test_jian(self): assert 520==520 if __name__ == '__main__': pytest.main()
四,全能的mark
1,標籤
我們在運行測試用例的時候,有時候不需要全部測試,那我們就可以通過給用例打標籤的方式來執行用例。
使用:
1,創建一個pytest.ini文件,在文件中按照以下格式添加標籤名:
2,我們通過 (@pytest.mark.標籤名) 這個程式碼放在用例上面來標明。一個用例可以用多個標籤來表示
冒號前是標籤名,冒號後面是注釋,方便明白標籤是什麼意思。
注意:這個文件中不能含任何中文。
[pytest] markers= smoke:smoke test demo:demo test
給用例賦予標籤,程式碼如下:
注意:可以給類賦予標籤,也可以給用例賦予標籤
# -*- coding: utf-8 -*- import pytest @pytest.mark.demo class Test_code: @pytest.mark.smoke def test_jian(self): assert 520==520
運行:dos命令 pytest -m 標籤名
或者
if __name__ == '__main__': pytest.main(['-m','demo'])
2,fifixture功能
# -*- coding: utf-8 -*- import pytest #把前置 @pytest.mark.demo class Test_code:
@pytest.mark.usefixtures("aa1") #把環境放在用例前,會在執行用例前執行這個環境aa1 @pytest.mark.smoke def test_jian(self): assert 520==520 @pytest.fixture() #聲明這是fixture函數, def aa(seif): print("先執行我,然後再執行用例方法") aa=1+1 yield aa1 # 類似分隔符號, yield 後面接變數名 再執行後可以輸出aa print("執行完用例後再執行我")
多個文件共享一個fixture
可以可以將fixture放在指定文件conftest.py中,來實現多個文件共享一個fixture(文件名不可更改)
import pytest @pytest.fixture() #聲明這個是fixture函數 def aa(seif): print("先執行我,然後再執行用例方法") aa=1+1 yield aa # 類似分隔符號, yield 後面接變數名 再執行後可以輸出aa print("執行完用例後再執行我")
3,參數化
pytest參數化 和unittest中的ddt相似。都是把數據放入用例中執行。
使用@pytest.mark.parametrize() 程式碼將數據代入用例中,括弧中必須聲明代入用例中的變數名,用引號引起,變數名必須一樣
list=([('741852963', '123456', '123456'),
('122886', '123456', '123456')])
@pytest.mark.parametrize('urer,passd,ex',list) # 代入數據程式碼 def test_shuju(self,urer,pwd,ex): #變數名要和parametrize裡面一樣 print('這個是用戶名'.format(urer)) print('這個是密碼{}'.format(pwd)) assert pwd==ex
4,失敗重跑
我們使用:pip3 install pytest-rerunfailures 程式碼來下載插件
使用:@pytest.mark.flaky() 程式碼放在用例前面
list=([('741852963', '123456', '123456'),
('122886', '123456', '123456')])
@pytest.mark.flaky(reruns=5, reruns_delay=1) # 如果失敗則延遲1s後重跑 最多跑五次 @pytest.mark.parametrize('urer,passd,ex',list) def test_shuju(self,urer,pwd,ex): print('這個是用戶名'.format(urer)) print('這個是密碼{}'.format(pwd)) assert pwd==ex