1. 程式人生 > >Pytest學習(一)- 入門及基礎

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

### 前言 十一也趕上自己剛出院,本想在十一放假前用假期刷完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 整合 - 可支援執行部分用例 - 具有很多第三方外掛,並且可以自定義擴充套件 ### 五、快速入門 示例程式碼如下: ```python # -*- 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、執行 命令行當前檔案同級目錄下,輸入如下命令: ```shell pytest ``` ![](https://imgkr2.cn-bj.ufileos.com/c60ca6c7-cca8-4f5f-853c-325ae5cd606a.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=mR3ZhKEBVuTZaPm0b6QZn2W4K1E%253D&Expires=1603205076) #### 說明: - 只執行 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 ![](https://imgkr2.cn-bj.ufileos.com/ce1a620e-7971-49de-8e09-22f82983a23d.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=jEiRkGKaM90iUvaZoxIUSve8M7k%253D&Expires=1603205638) ##### 注意: 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/1690