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。

  我這是通過pytest 地址 指定搜索的目錄下的文件,直接執行文件中所有的用例,也可以精確到類,某個用例。
  還可以通過輸入pytest直接所搜用例並執行。會在默認從當前目錄中搜索用例,即在哪個目錄下運行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功能  

  在執行測試用例前往往需要進行環境的準備,在執行完用例,將環境銷毀。在unittest中一般通過 setUp與tearDown來進行用例前的環境準備和用例後的環境銷毀。而在pytest中還有另外一種方式——fifixture。與setup和teardown相比,fifixture使用起來更加靈活,更加方便。
  

  Fixture的使用
  這是fixture在頁面中程式碼使用方法
  使用@pytest.mark.usefixtures(“環境方法名”) 程式碼放在用例或者類前,放在類前就是這個類裡面的用例都會先執行環境。
 
# -*- 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