框架選擇:
根據 https://blog.zengrong.net/pos...
得知:
flask項目本身使用的是pytest
nose是對標準庫unittest的封裝,現在比較流行,但文檔沒有pytest做的好,且近幾年一直處于維護狀態沒有更新。
Flask-Testing flask擴展
最終選擇:pytest
非常容易上手,入門簡單,文檔豐富,文檔中有很多實例可以參考
能夠支持簡單的單元測試和復雜的功能測試
支持參數化
執行測試過程中可以將某些測試跳過,或者對某些預期失敗的case標記成失敗
支持重復執行失敗的case
支持運行由nose, unittest編寫的測試case
具有很多第三方插件,并且可以自定義擴展
方便的和持續集成工具集成
在命令行輸入如下命令檢查pytest是否已安裝
py.test --version
如果沒有
pip install -U pytest第一個例子:測試函數
# content of test_sample.py def func(x): return x+1 def test_func(): assert func(3) == 5
運行:
執行測試時需要下面幾步:
從命令行進入測試文件所在目錄,pytest會在該目錄中尋找以test開頭的文件
找到測試文件,進入測試文件中尋找以test_開頭的函數并執行
測試函數以斷言assert結尾
$ py.test ============================= test session starts ============================== platform darwin -- Python 3.5.1, pytest-2.8.1, py-1.4.30, pluggy-0.3.1 rootdir: /Users/fc/project/test/pytest_sample, inifile: collected 1 items test_sample.py F =================================== FAILURES =================================== __________________________________ test_func ___________________________________ def test_func(): > assert func(3) == 5 E assert 4 == 5 E + where 4 = func(3) test_sample.py:9: AssertionError =========================== 1 failed in 0.01 seconds ===========================第二個例子: 測試類
# content of test_class.py class TestClass(object): def test_one(self): x = "this" assert "h" in x def test_two(self): x = "hello" assert hasattr(x, "check")
運行
下面的-q是 quiet的意思,就是忽略一些很細節的信息
使用測試類時,注意下面幾點:
測試類所在的文件以test_開頭
測試類以Test開頭,并且不能帶有__init__方法
類中測試函數以test_開頭
測試函數以assert斷言結尾
bogon:pytest_sample fc$ py.test -q test_class.py .F =================================== FAILURES =================================== ______________________________ TestClass.test_two ______________________________ self =def test_two(self): x = "hello" > assert hasattr(x, "check") E assert hasattr("hello", "check") test_class.py:11: AssertionError 1 failed, 1 passed in 0.01 seconds
import pytest params = [ (2, 3, 5), (4, 5, 9), (6, 7, 12) ] @pytest.mark.parametrize("a, b, expected", params) def test_add(a, b, expected): assert a + b == expected
運行結果
$ py.test -q test_params.py ..F =================================== FAILURES =================================== _______________________________ test_add[6-7-12] _______________________________ a = 6, b = 7, expected = 12 @pytest.mark.parametrize("a, b, expected", params) def test_add(a, b, expected): > assert a + b == expected E assert (6 + 7) == 12 test_params.py:12: AssertionError 1 failed, 2 passed in 0.01 seconds
說明:
params是要進行測試的參數list,其中元素為tuple,每個tuple對應一套參數
@pytest.mark.parametrize裝飾器的第一個參數是一個字符串,不過這個字符串其實是以逗號分隔的一組參數,這個參數就是其所裝飾的函數的參數。
@pytest.mark.parametrize裝飾器將params中的參數一套一套拿出來放入其所裝飾的函數中執行
第四個例子 fixture paramsimport pytest @pytest.fixture(params=[1, 2, 3]) def test_data(request): return request.param def test_not_2(test_data): assert test_data != 2
運行結果:
$ py.test -q fixture_params.py .F. ======================================= FAILURES ======================================= ____________________________________ test_not_2[2] _____________________________________ test_data = 2 def test_not_2(test_data): > assert test_data != 2 E assert 2 != 2 fixture_params.py:10: AssertionError 1 failed, 2 passed in 0.01 seconds
說明:
把一個函數定用@pytest.fixture裝飾,那這個函數就是fixture函數
一個fixture函數可以被其他測試函數調用,將函數名當作參數即可,fixture的返回值會當作測試函數的參數
fixture函數中的params字段默認為None,如果有值,則每個值都會調用執行一次
在flask項目中使用pytest flask應用demo代碼from flask import Flask app = Flask(__name__) @app.route("/") def index(): return "hello" @app.route("/login") def login(): return "login" @app.route("/logout") def logout(): return "logout" @app.errorhandler(404) def page_not_found(): return "404" if __name__ == "__main__": app.run()flask demo的測試代碼
from flaskr import app class TestClass(object): def setup_class(self): """測試開始時候執行, 用來做準備工作,一般用來初始化資源。""" app.config["TESTING"] = True # 這將會使得處理請求時的錯誤捕捉失效,以便于 您在進行對應用發出請求的測試時獲得更好的錯誤反饋。 # 測試客戶端將會給我們一個通向應用的簡單接口,我們可以激發 對向應用發送請求的測試,并且此客戶端也會幫我們記錄 Cookie 的 動態。 self.app = app.test_client() def teardown_class(self): """測試結束時執行, 用來做收尾工作, 一般用來關閉資源""" pass def test_login(self): response = self.app.get("/login") assert b"login" == response.data def test_logout(self): response = self.app.get("logout") assert b"logout" == response.data def test_index(self): response = self.app.get("/") assert b"hello" == response.data
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41232.html
摘要:單元測試這個應用非常小以至于不需要太多的測試,但是作為示例會在示例中展示兩個簡單的測試定義。示例單元測試編寫好的測試使用的是來自于標準庫中標準的包。為了運行單元測試,可以在腳本中增加一個自定義的命令。 4、啟動腳本 頂層目錄中的manage.py文件用于啟動應用。這個腳本會在示例7-8中展示。 示例7-8. manage.py:啟動腳本 #!/usr/bin/env python im...
摘要:當功能越來越復雜的時候,你可能修改了一些東西,導致另外一個功能的不可用,而單元測試也能保證了原有功能被破壞后能被檢測出來。 showImg(https://segmentfault.com/img/remote/1460000017081749); 前言 前一篇講到了 TDD 測試驅動開發的相關概念和環境搭建,這篇就著手開始用TDD方式開發了。首先這篇需要編寫用戶相關的API接口,如...
摘要:認證管理新建數據庫需要的插件用來發送認證信息用于管理用于密碼加鹽表單對象創建渲染建立認證藍圖建立用戶模型權限分配權限等級設置直接新建一個對象來表示權限設置三種用戶角色角色權限描述只讀基礎權限只有一個修改評論權限多一個管理員權限建 認證管理 新建數據庫 create database `flasky` default character set utf8 collate utf8_gen...
摘要:從存儲的字符串表示中檢索原始對象的過程稱為。這稱為命名空間。如果需要八進制或十六進制表示,請使用內置函數或。和有什么區別返回對象,而返回列表,并使用相同的內存,無論范圍大小是多少。它提供了靈活性,并允許開發人員為他們的項目使用正確的工具。 ...
摘要:前置條件這不是一個入門課程。此課程為至少有六個月網站開發經驗的高級入門者設置。主題資源目標這部分結束,具備以下能力。。。第一部分完整代碼依賴第一部分依賴耗時一章需要幾個小時到一整天。空余大塊時間來完成一章,特別是,,這些較難的部分。 在第一部分, 你學到如何使用 Docker 來創建一個基于python, postgres, 和 flask web 框架的 RESTful API 可重...
閱讀 1239·2021-11-11 16:55
閱讀 1537·2021-10-08 10:16
閱讀 1188·2021-09-26 10:20
閱讀 3569·2021-09-01 10:47
閱讀 2451·2019-08-30 15:52
閱讀 2682·2019-08-30 13:18
閱讀 3194·2019-08-30 13:15
閱讀 1115·2019-08-30 10:55