亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

flask 單元測(cè)試 (一)

syoya / 1417人閱讀

框架選擇:

根據(jù) https://blog.zengrong.net/pos...
得知:
flask項(xiàng)目本身使用的是pytest
nose是對(duì)標(biāo)準(zhǔn)庫(kù)unittest的封裝,現(xiàn)在比較流行,但文檔沒(méi)有pytest做的好,且近幾年一直處于維護(hù)狀態(tài)沒(méi)有更新。
Flask-Testing flask擴(kuò)展
最終選擇:pytest

pytest 特點(diǎn):

非常容易上手,入門簡(jiǎn)單,文檔豐富,文檔中有很多實(shí)例可以參考

能夠支持簡(jiǎn)單的單元測(cè)試和復(fù)雜的功能測(cè)試

支持參數(shù)化

執(zhí)行測(cè)試過(guò)程中可以將某些測(cè)試跳過(guò),或者對(duì)某些預(yù)期失敗的case標(biāo)記成失敗

支持重復(fù)執(zhí)行失敗的case

支持運(yùn)行由nose, unittest編寫的測(cè)試case

具有很多第三方插件,并且可以自定義擴(kuò)展

方便的和持續(xù)集成工具集成

在命令行輸入如下命令檢查pytest是否已安裝

py.test --version

如果沒(méi)有

pip install -U pytest
第一個(gè)例子:測(cè)試函數(shù)
# content of test_sample.py


def func(x):
    return x+1


def test_func():
    assert func(3) == 5

運(yùn)行:
執(zhí)行測(cè)試時(shí)需要下面幾步:

從命令行進(jìn)入測(cè)試文件所在目錄,pytest會(huì)在該目錄中尋找以test開(kāi)頭的文件

找到測(cè)試文件,進(jìn)入測(cè)試文件中尋找以test_開(kāi)頭的函數(shù)并執(zhí)行

測(cè)試函數(shù)以斷言assert結(jié)尾

$ 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 ===========================
第二個(gè)例子: 測(cè)試類
# 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")

運(yùn)行
下面的-q是 quiet的意思,就是忽略一些很細(xì)節(jié)的信息
使用測(cè)試類時(shí),注意下面幾點(diǎn):

測(cè)試類所在的文件以test_開(kāi)頭

測(cè)試類以Test開(kāi)頭,并且不能帶有__init__方法

類中測(cè)試函數(shù)以test_開(kāi)頭

測(cè)試函數(shù)以assert斷言結(jié)尾

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
第三個(gè)例子:參數(shù)化測(cè)試函數(shù)
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

運(yùn)行結(jié)果

$ 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

說(shuō)明:

params是要進(jìn)行測(cè)試的參數(shù)list,其中元素為tuple,每個(gè)tuple對(duì)應(yīng)一套參數(shù)

@pytest.mark.parametrize裝飾器的第一個(gè)參數(shù)是一個(gè)字符串,不過(guò)這個(gè)字符串其實(shí)是以逗號(hào)分隔的一組參數(shù),這個(gè)參數(shù)就是其所裝飾的函數(shù)的參數(shù)。

@pytest.mark.parametrize裝飾器將params中的參數(shù)一套一套拿出來(lái)放入其所裝飾的函數(shù)中執(zhí)行

第四個(gè)例子 fixture params
import pytest


@pytest.fixture(params=[1, 2, 3])
def test_data(request):
    return request.param


def test_not_2(test_data):
    assert test_data != 2

運(yùn)行結(jié)果:

$ 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

說(shuō)明:

把一個(gè)函數(shù)定用@pytest.fixture裝飾,那這個(gè)函數(shù)就是fixture函數(shù)

一個(gè)fixture函數(shù)可以被其他測(cè)試函數(shù)調(diào)用,將函數(shù)名當(dāng)作參數(shù)即可,fixture的返回值會(huì)當(dāng)作測(cè)試函數(shù)的參數(shù)

fixture函數(shù)中的params字段默認(rèn)為None,如果有值,則每個(gè)值都會(huì)調(diào)用執(zhí)行一次

在flask項(xiàng)目中使用pytest flask應(yīng)用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的測(cè)試代碼
from flaskr import app


class TestClass(object):
    def setup_class(self):
        """測(cè)試開(kāi)始時(shí)候執(zhí)行, 用來(lái)做準(zhǔn)備工作,一般用來(lái)初始化資源。"""
        app.config["TESTING"] = True  # 這將會(huì)使得處理請(qǐng)求時(shí)的錯(cuò)誤捕捉失效,以便于 您在進(jìn)行對(duì)應(yīng)用發(fā)出請(qǐng)求的測(cè)試時(shí)獲得更好的錯(cuò)誤反饋。
        # 測(cè)試客戶端將會(huì)給我們一個(gè)通向應(yīng)用的簡(jiǎn)單接口,我們可以激發(fā) 對(duì)向應(yīng)用發(fā)送請(qǐng)求的測(cè)試,并且此客戶端也會(huì)幫我們記錄 Cookie 的 動(dòng)態(tài)。
        self.app = app.test_client()

    def teardown_class(self):
        """測(cè)試結(jié)束時(shí)執(zhí)行, 用來(lái)做收尾工作, 一般用來(lái)關(guān)閉資源"""
        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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41232.html

相關(guān)文章

  • Flask Web Development —— 大型應(yīng)用程序結(jié)構(gòu)(下)

    摘要:?jiǎn)卧獪y(cè)試這個(gè)應(yīng)用非常小以至于不需要太多的測(cè)試,但是作為示例會(huì)在示例中展示兩個(gè)簡(jiǎn)單的測(cè)試定義。示例單元測(cè)試編寫好的測(cè)試使用的是來(lái)自于標(biāo)準(zhǔn)庫(kù)中標(biāo)準(zhǔn)的包。為了運(yùn)行單元測(cè)試,可以在腳本中增加一個(gè)自定義的命令。 4、啟動(dòng)腳本 頂層目錄中的manage.py文件用于啟動(dòng)應(yīng)用。這個(gè)腳本會(huì)在示例7-8中展示。 示例7-8. manage.py:?jiǎn)?dòng)腳本 #!/usr/bin/env python im...

    whidy 評(píng)論0 收藏0
  • Flask Web 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)最佳實(shí)踐之 Flask 實(shí)例

    摘要:當(dāng)功能越來(lái)越復(fù)雜的時(shí)候,你可能修改了一些東西,導(dǎo)致另外一個(gè)功能的不可用,而單元測(cè)試也能保證了原有功能被破壞后能被檢測(cè)出來(lái)。 showImg(https://segmentfault.com/img/remote/1460000017081749); 前言 前一篇講到了 TDD 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的相關(guān)概念和環(huán)境搭建,這篇就著手開(kāi)始用TDD方式開(kāi)發(fā)了。首先這篇需要編寫用戶相關(guān)的API接口,如...

    wuyangnju 評(píng)論0 收藏0
  • 02-Flask-用戶認(rèn)證和角色管理-數(shù)據(jù)庫(kù)設(shè)計(jì)

    摘要:認(rèn)證管理新建數(shù)據(jù)庫(kù)需要的插件用來(lái)發(fā)送認(rèn)證信息用于管理用于密碼加鹽表單對(duì)象創(chuàng)建渲染建立認(rèn)證藍(lán)圖建立用戶模型權(quán)限分配權(quán)限等級(jí)設(shè)置直接新建一個(gè)對(duì)象來(lái)表示權(quán)限設(shè)置三種用戶角色角色權(quán)限描述只讀基礎(chǔ)權(quán)限只有一個(gè)修改評(píng)論權(quán)限多一個(gè)管理員權(quán)限建 認(rèn)證管理 新建數(shù)據(jù)庫(kù) create database `flasky` default character set utf8 collate utf8_gen...

    noONE 評(píng)論0 收藏0
  • 精選50道Python面試題,快來(lái)看看你已經(jīng)掌握了多少道吧

    摘要:從存儲(chǔ)的字符串表示中檢索原始對(duì)象的過(guò)程稱為。這稱為命名空間。如果需要八進(jìn)制或十六進(jìn)制表示,請(qǐng)使用內(nèi)置函數(shù)或。和有什么區(qū)別返回對(duì)象,而返回列表,并使用相同的內(nèi)存,無(wú)論范圍大小是多少。它提供了靈活性,并允許開(kāi)發(fā)人員為他們的項(xiàng)目使用正確的工具。 ...

    zzir 評(píng)論0 收藏0
  • microservices-with-docker-flask-and-react 簡(jiǎn)介

    摘要:前置條件這不是一個(gè)入門課程。此課程為至少有六個(gè)月網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn)的高級(jí)入門者設(shè)置。主題資源目標(biāo)這部分結(jié)束,具備以下能力。。。第一部分完整代碼依賴第一部分依賴耗時(shí)一章需要幾個(gè)小時(shí)到一整天??沼啻髩K時(shí)間來(lái)完成一章,特別是,,這些較難的部分。 在第一部分, 你學(xué)到如何使用 Docker 來(lái)創(chuàng)建一個(gè)基于python, postgres, 和 flask web 框架的 RESTful API 可重...

    lily_wang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<