Pytest學習(一)- 入門及基礎

久曲健發表於2020-10-19

前言

十一也趕上自己剛出院,本想在十一放假前用假期刷完Pytest的,結果被希洛克神話吸引,再次迴歸毒奶粉,一直奮鬥到距離上班還有兩天,引導石刷沒了,就沒了智慧。

當然也沒出過神話,結果一怒之下解除安裝,開始收收心,準備學習,用了兩個下午時間看了下pytest的官方文件,全是英文的,用谷歌翻譯看的也是一知半解,基於理解產出文章兩篇。

十一節後上班,直到現在遲遲一直未更文學習。因為一些事,導致無法專心學習,但是刷完pytest這個事,我還是記得,畢竟2020年結束還有倆約,是時候在年底衝刺一波未完成的知識了。

一、關於環境搭建

可以參考文章《使用IDEA寫Python之pytest環境搭建及第一個程式編寫》

二、關於開發工具

作為一個java黨,對於IDEA的喜歡程度,不用我多說,相信每個java編碼的同學,都是愛不釋手的。

上篇文章提及到用IDEA進行Python的編碼,雖然能滿足簡單學習的需求,但IDEA支援也是作為一種外掛的存在,所以作為長久想學習Python的話,那我們還是“跟風”選擇pycharm吧。

三、為什麼要使用Pytest

就Python的測試框架而言,目前比較流行的就是pytest和unittest,unittest廣為人知,但就現在而言是老框架了,但是依舊有那麼多喜歡使用他來做自動化測試,我猜想大部分人都和我一樣,早期是從蟲師開始接觸和熟悉Python自動化的

pytest是基於unittest開發的另一款更高階更好用的單元測試框架,作為知識更新,也更該去學習新知識了,它就和Testng和junit一樣,無論從逼格和好用程度來看,都是完勝後者。

四、pytest特點

  • 非常容易上手,入門簡單,文件豐富,文件中有很多例項可以參考
  • 能夠支援簡單的單元測試和複雜的功能測試
  • 支援引數化
  • 執行測試過程中可以將某些測試跳過(skip),或者對某些預期失敗的case標記成失敗
  • 支援重複執行(rerun)失敗的 case
  • 支援執行由 nose, unittest 編寫的測試 case
  • 可生成 html 報告
  • 方便的和持續整合工具 jenkins 整合
  • 可支援執行部分用例
  • 具有很多第三方外掛,並且可以自定義擴充套件

五、快速入門

示例程式碼如下:

# -*- coding: utf-8 -*-
# @Time    : 2020/10/15 20:10
# @Author  : longrong.lang
# @FileName: test_demo.py
# @Software: PyCharm
# @Cnblogs :https://www.cnblogs.com/longronglang

def add(x):
    return x + 2;


class TestClass(object):
    # 測試是否相等
    def test_add(self):
        assert add(2) == 5

    # 測試包含
    def test_in(self):
        a = 'hello world'
        b = 'he'
        assert b in a

    # 測試不包含
    def test_not_in(self):
        a = 'Hello'
        b = 'hi'
        assert b not in a

1、執行

命令列當前檔案同級目錄下,輸入如下命令:

pytest

說明:

  • 只執行 pytest ,會查詢當前目錄及其子目錄下以 test_*.py 或 *_test.py 檔案,找到檔案後,在檔案中找到以 test 開頭函式並執行
  • 只想執行某個檔案,可以 pytest test_demo.py
  • 加上-q,就是顯示簡單的結果: pytest -q test_demo.py

用Pytest寫用例時候,一定要按照下面的規則去寫,否則不符合規則的測試用例是不會執行的

六、Pytest用例的設計原則

  1. 檔名以 test_.py 檔案和_test.py
  2. 以 test_ 開頭的函式
  3. 以 Test 開頭的類,不能包含 init 方法
  4. 以 test_ 開頭的類裡面的方法
  5. 所有的包 pakege 必項要有__init__.py 檔案

七、Pytest執行用例規則

下面以windows系統為例,使用命令來來執行pytest

1、指定目錄下的所有用例

pytest

2、執行某一個py檔案下用例

pytest 檔名.py

3、執行test_demo.py檔案中模組裡面的某個函式,或者某個類,某個類裡面的方法

說明:加v和不加-v都可以,加-v的話,列印的資訊更詳細

pytest -v test_demo.py::TestClass::test_add

pytest test_demo.py::TestClass::test_not_in

pytest test_demo.py::test_in

4、執行test_demo.py 模組裡面,測試類裡面的某個方法

pytest test_demo.py::test_in

5、-m 標記表示式(後面有詳解)

pytest -m login

將執行用 @pytest.mark.login 裝飾器修飾的所有測試,後面有詳解!

6、-q 簡單列印,只列印測試用例的執行結果

pytest -q test_demo.py

7、-s 詳細列印

pytest -s test_demo.py

8、-x 遇到錯誤時停止測試

pytest test_demo.py -x

9、—maxfail=num,當用例錯誤個數達到指定數量時,停止測試

pytest test_demo.py --maxfail=1

10、-k 匹配用例名稱

pytest -s -k _in test_demo.py

11、-k 根據用例名稱排除某些用例

pytest -s -k "not _in" test_demo.py

12、-k 同時匹配不同的用例名稱

pytest -s -k "add or _in" test_demo.py

八、使用Pycharm執行pytest

1、File->settings->python integrated tools->Testing下的default testrunner修改為Pytest

注意:

pytest相容unittest指令碼,所以不影響之前使用unittest編寫的指令碼

2、並不是修改完以上配置,就一定好用,如上面方法修改完仍不好用,參考下面方案:

  • 檢查pycharm中的python interpreter是否設定為Python安裝目錄下的Python.exe
  • pycharm設定為國內源,如豆瓣、清華、阿里雲等等!

3、如果和我一樣之前使用IDEA中pytest外掛編碼的話,在進行完以上兩步操作後,執行如下操作:

  • 開啟IDEA,將settings->python integrated tools->Testing下的default testrunner修改為Pytest
  • 你會在開啟的.py檔案右上角看到提示,提示你選擇Python的sdk路徑,選擇為Python安裝目錄下的Python.exe,確定後,會自動編譯更新,更新完你會發現使用IDEA可以使用pytest執行了
  • 再回頭檢視pycharm這時候也提示你選擇sdk的安裝目錄,同上選擇好Python安裝目錄,也會自動編譯更新,更新完後,你會發現使用pycharm也可以使用pytest執行了

系列參考文章:
https://www.cnblogs.com/poloyy/category/1690628.html

相關文章