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插件庫里。
下載地址:https://pypi.org/project/pytest/
2.安裝插件
安裝html插件命令:pip install pytest-html
除開 pytest-html插件外 ,pytest還具備豐富的插件庫,pytest插件匯總站點:http://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,fixture功能
# -*- 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