1. 程式人生 > 實用技巧 >pytest--學習日記1

pytest--學習日記1

一、pytest的簡介及簡單使用

1. pytest與unittest一樣,也是python的單元測試框架,但比unittest更靈活。

2. pytest簡單使用:

1⃣️ 編寫pytest測試用例注意事項:首先.py檔名必須以test_開頭或_test結尾;其次測試類名必須以Test開頭、測試用例方法名必須以est_開頭或_test結尾;測試用例可以直接定義也可以寫在測試類中。

在示例專案中新建test_sample_1.py檔案,在檔案中定義一個test_sample()函式和TestSample類及兩個方法test_sample_2()和hello_pytest(),開啟終端,輸入命令“pytest -v”,便開始類了用例的收集執行。

從圖中可見:執行命令後,輸出了命令執行的根目錄,以及在根目錄下收集到的測試用例條數、測試用例執行的結果

===> 可以得出以下結論:

1⃣️ pytest命令執行的目錄,即為收集用例的根目錄,pytest會自己下該目錄及其子目錄下搜尋符合命名規範的測試用例,不符合的不會被收集到

2⃣️ 測試用例的執行順序為:先搜尋到的先執行,即先搜尋到的.py檔案先執行,同一檔案內部,按照程式碼書寫順序執行。

在示例專案中新建test_sample_2.py檔案,在檔案中定義兩個測試用例函式,開啟終端,輸入命令“pytest -v”,檢視執行順序

二、pytest與unittest的異同

1⃣️ 在用例收集載入上:unittest必須通過testsuite以及loader來主動收集測試用例;pytest會在執行時自動收集測試用例

2⃣️ 在測試用例編寫上:unittest必須import unittest,定義繼承unittest.TestCase的測試類,然後在測試類裡定義測試用例方法;pytest無需引入pytest,也不需要繼承任何,測試用例可以是符合命名規範的.py檔案裡符合用例命名規範的函式也可以是符合命名規範的測試類中的方法。

3⃣️ 在測試用例的執行上:unittest可以通過命令列執行,也可以通過py檔案來執行;pytest只能命令列執行即在根路徑下通過“pytest -v”命令來執行,如果非要以py檔案執行,則需要新建一個py檔案,引入pytest,然後呼叫pytest的main()函式

4⃣️ 在篩選用例執行上:unittest本身不具備篩選功能,但可以通過測試用例命名,載入測試用例上來間接實現篩選;pytest具備篩選用例功能即通過給用例打標記的方式來實現用例篩選

5⃣️ 在用例斷言上:unittest有多種斷言方法assertXXX();pytest使用assert + 斷言表示式來斷言

6⃣️ 在資料驅動的支援上:unittest -> ddt ,pytest -> 引數化(pytest有自己的實現資料驅動的方式即引數化,故不支援ddt,是不能相容使用的)@pytest.mark.parametrize(“引數名”, 引數列表)

7⃣️ 在測試用例執行報告上:unittest只有HTMLTestRunner,沒有三方庫;pytest有豐富的三方庫(900+)

8⃣️ 在用例執行失敗重試機制上:unittest沒有此機制;pytest自帶用例失敗重試機制

====> 說完這些差異後,這或許/大概/可能/也許/就是pytest越來越火爆的原因吧!!!!

三、pytest的前置後置:fixture這個小機靈鬼~

1. 眾所周知unittest的前置後置是固定的setUp() tearDown() setUpClass() TearDownClass(),那麼pytest是怎麼實現測試用例的前置後置的呢?是的沒錯,就是fixture這個小機靈鬼啦~

2. 前置後置函式的定義:

====> 通過裝飾器的方式即@pytest.fixture()來識別該函式是前置後置函式;

====> 一個函式既包含前置也包含後置,那麼是怎麼區分開前置與後置的呢?答案就是 yield 這個楚河漢界

====> 函式有返回值該怎麼返回呢?答案就是 跟在yield後面就好啦~ 返回值型別可以自定義,元祖/字典...

3. fixture的級別:

====> 1⃣️ session級別:即測試會話級別, 執行順序為 前置-->所有測試用例-->後置,全域性只執行一次,可以將引數autoUse的值置為True,一般用在介面自動化中資料庫的連線(全域性只連線一次,所有測試用例執行完畢後,關閉連線)。

====> 2⃣️ .py級別:即module模組級別,執行順序為 前置-->該模組中測試類、測試用例-->後置,在哪一行呼叫,則該行之後的測試類/測試用例均適用。呼叫位置影響fixture的執行

====> 3⃣️ class級別:即測試類級別,執行順序為 前置-->該類中的所有測試用例-->後置,作用類似unittest的setUpClass()和tearDownClass()

====> 4⃣️ function級別:即測試用例級別,執行順序為 前置-->某一測試用例-->後置,作用類似unittest的setUp()和tearDown()

4. fixture的引數:

====> 1⃣️ scope:指定fixture的級別,預設是function級別,可以指定為session、module、class

====> 2⃣️ antouse:指定fixture是否自動使用,預設是False

5. 前置後置函式與測試用例的關聯:

通過主動呼叫來實現前置後置函式與測試用例的關聯,即在測試用例函式上使用@pytest.mark.usefixtures("前置後置函式名")即可實現呼叫。注意⚠️:呼叫時,級別應一一對應。

6. 前置後置函式有返回值時,測試用例怎麼接收返回值?

====> 在測試函式中用同名形參來接收,如下:

定義一個前置後置函式:

@pytest.fixture
def init_func():
    driver = webdriver.Chrome()
    driver.get(url)
    yield driver
    driver.quit()

呼叫前置後置函式:

@pytest.mark.userfixtures("init_func")
def test_case_1(init_func):
    pass

7. conftest.py --> 實現前置後置函式的共享

注意⚠️ 前置後置函式可以和測試用例寫在同一個.py檔案裡,也可以提取出來放在單獨的檔案裡,用於共享;前置後置函式是可以定義多個的,根據測試用例的需要來呼叫。

1⃣️ 為什麼要實現前置後置函式的共享?====> 節省程式碼量,將共同的前置後置函式放在固定的conftest.py檔案,需要使用則直接呼叫,無需引入,方便簡介又高效

2⃣️ conftest.py檔案放在哪個目錄下?====> 一般在testcase目錄下,新建一個conftest.py檔案,名字是固定的!!!

3⃣️ conftest.py檔案的作用:

====>conftest.py檔案是專門用來定義共享的前置後置函式的

====>conftest.py檔案作用域:所在目錄及其子目錄,即conftest.py檔案所在目錄中的測試類/測試用例和其子目錄中的測試類/測試用例均可直接呼叫conftest.py檔案中定義的前置後置函式

4⃣️ 子目錄中conftest.py檔案中定義的fixture與父目錄中conftest.py檔案中定義的fixture重名時怎麼辦?====> 就近原則,即先找到先執行。(優先使用子目錄中的fixture)

4⃣️ fixture的內部繼承:即一個fixture繼承另一個fixture

在conftest.py中定義一個fixture,如下:

@pytest.fixnture
def init():
    driver = webdriver.Chrom()
    driver.get(url)
    yield driver
    driver.quit()

在conftest.py中定義另一個fixture來繼承上面定義的fixture,如下:

@pytest.fixture
def login(init):  
    LoginPage(init).login(xxx)
    yield init   # 用同名變數來返回繼承的fixture的返回值

繼承之後的執行順序為:

==== 父fixture的前置 ====

==== 子fixture的前置 ====

***** 測試用例執行 ******

==== 子fixture的後置 ====

==== 父fixture的後置 ====

四、pytest的引數化

在unittest中有ddt實現資料驅動,那麼對應的 pytest的引數化。====> @pytest.mark.parametrize(“引數名”, 引數列表)

示例:

@pytest.mark.parametrize("data", test_data_list)
def test_case_1(data, fixture名):   # 測試用例方法中的形參名必須與裝飾器中的引數名一致
    pass

總結:以上就是pytest的簡單使用 以及 fixture的簡單使用 以及 pytest的引數化使用