最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用 Django 進行測試驅動開發(fā)

 更新時間:2021年11月30日 09:28:44   作者:somenzz  
本文分享了什么是測試驅動開發(fā),并用測試驅動開發(fā)的方式 創(chuàng)建了一個簡單的 Django 應用程序,感興趣的可以了解一下

所謂測試驅動開發(fā)(TDD),就是先編寫測試用例,然后編寫代碼來滿足測試用例,具體包含以下步驟:

  • 編寫測試用例。
  • 編寫代碼滿足測試用例中的需求。
  • 運行測試用例。
  • 如果通過,說明代碼滿足了測試用例所定義的需求。
  • 如果未通過,則需要重構代碼,直到通過。
  • 重復以上步驟,直到通過全部的測試用例。

通常情況下,我們都是先寫代碼,然后編寫測試用例,因此測試驅動開發(fā)是反直覺的,那為什么還要這么做呢?基于以下幾點原因:

  1. TDD 可以被認為是根據(jù)測試用例來說明需求。此后編寫源代碼,重點是滿足這些要求。當測試最終通過時,你可以確信已滿足要求。這種專注可以幫助開發(fā)人員避免范圍蔓延。
  2. TDD 可以通過較短的開發(fā)周期提高開發(fā)效率。一次解決測試用例中的個別需求可以最大限度地減少干擾因素。重大更改將更容易跟蹤和解決,減少了調試工作,提高了效率,并且將更多時間花在開發(fā)上。
  3. 編寫測試時考慮到了需求。正因為如此,它們更有可能被寫成明確的,可以理解的。這樣的測試可以作為代碼庫的優(yōu)質文檔。
  4. 先編寫測試用例可確保您的源代碼始終具有可測試性,它還保證隨著代碼庫的增長,測試覆蓋率始終保持在合理的百分比。

然而,測試驅動開發(fā)也不是銀彈,以下情形并不適合測試驅動開發(fā):

  • 當需求不明確時,有時續(xù)期會隨著開發(fā)的進行而逐漸明確,在這種情況下最初編寫的任何測試可能會過時。
  • 開發(fā)的目的是為了證明某一概念時——例如在黑客馬拉松期間,測試通常不是優(yōu)先事項。

了解了測試驅動開發(fā)之后,我們用 Django 來演示一下測試驅動開發(fā)的過程。(Python 3.7 以上,Django 2.0 以上)

首先描述需求,我們要實現(xiàn)這樣一個單位換算功能的 Web 應用,可以在厘米、米、英里直接互相轉換,Web 界面如圖所示:

創(chuàng)建項目

首先,我們創(chuàng)建一個名字叫 convert 的項目:

pip install django
django-admin startproject converter

此時 Django 已經(jīng)為我們生成了 converter 目錄及基本的項目文件:

converter/
    converter/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    manage.py

然后,進入 converter 目錄,創(chuàng)建一個名字叫 length 的 app:

cd converter
python manage.py startapp length

然后你會看到這樣的目錄結構:

converter/
    converter/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    length/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py
    manage.py

配置 app

修改 converter/settings.py,在 INSTALLED_APPS 里加入 lengh :

INSTALLED_APPS = [
    .
    .
    .
    'length',
]

然后在 length 目錄下新建 urls.py,寫入以下內容:

from django.urls import path

from length import views

app_name = 'length'
urlpatterns = [
    path('convert/', views.convert, name='convert'),
]

最后在 converter/urls.py 中指向 length/urls.py:

from django.contrib import admin
from django.urls import path, include
urlpatterns = [
    path('admin/', admin.site.urls),
    path('length/', include('length.urls')),
]

這樣一個沒有任何業(yè)務邏輯的項目就創(chuàng)建成功了,接下來編寫測試用例:

編寫測試用例

在 lengh 目錄下新建 tests.py,寫入以下內容:

from django.test import TestCase, Client
from django.urls import reverse


class TestLengthConversion(TestCase):
    """
    This class contains tests that convert measurements from one
    unit of measurement to another.
    """

    def setUp(self):
        """
        This method runs before the execution of each test case.
        """
        self.client = Client()
        self.url = reverse("length:convert")

    def test_centimetre_to_metre_conversion(self):
        """
        Tests conversion of centimetre measurements to metre.
        """
        data = {
            "input_unit": "centimetre",
            "output_unit": "metre",
            "input_value": 8096.894
        }
        response = self.client.get(self.url, data)
        self.assertContains(response, 80.96894)

    def test_centimetre_to_mile_conversion(self):
        data = {
            "input_unit": "centimetre",
            "output_unit": "mile",
            "input_value": round(985805791.3527409, 3)
        }
        response = self.client.get(self.url, data)
        self.assertContains(response, 6125.5113)

上述代碼有兩個測試用例,分別代表兩個需求。test_centimetre_to_metre_conversion 代表厘米轉米的需求,而 test_centimetre_to_mile_conversion 代表厘米轉英里的需求。

編寫代碼

這和 Django 開發(fā)沒什么兩樣,先編寫一個 forms.py,內容如下:

from django import forms

class LengthConverterForm(forms.Form):
    MEASUREMENTS = (
        ('centimetre', '厘米'),
        ('metre', '米'),
        ('mile', '英里')
    )
    input_unit = forms.ChoiceField(choices=MEASUREMENTS)
    input_value = forms.DecimalField(decimal_places=3)
    output_unit = forms.ChoiceField(choices=MEASUREMENTS)
    output_value = forms.DecimalField(decimal_places=3, required=False)

然后編寫 html,在 length 目錄下新建 templates/length.html,內容如下:

<html lang="en">
  <head>
    <title>Length Conversion</title>
  </head>
  <body>
    <form action={% url "length:convert" %} method="get">
      <div>
        {{ form.input_unit }}
        {{ form.input_value }}
      </div>
      <input type="submit" value="轉換為:"/>
      <div>
        {{ form.output_unit }}
        {{ form.output_value }}
      </div>
   </form>
  </body>
</html>

然后編寫最重要的視圖函數(shù) views.py,內容如下:

from django.shortcuts import render

from length.forms import LengthConverterForm

convert_to_metre = {
    "centimetre": 0.01,
    "metre": 1.0,
    "mile": 1609.34
}
convert_from_metre = {
    "centimetre": 100,
    "metre": 1.0,
    "mile": 0.000621371
}

# Create your views here.
def convert(request):
    form = LengthConverterForm()
    if request.GET:
        input_unit = request.GET['input_unit']
        input_value = request.GET['input_value']
        output_unit = request.GET['output_unit']
        metres = convert_to_metre[input_unit] * float(input_value)
        print(f"{metres = }, {input_value = }")
        output_value = metres * convert_from_metre[output_unit]
        data = {
            "input_unit": input_unit,
            "input_value": input_value,
            "output_unit": output_unit,
            "output_value": round(output_value,5)
        }
        form = LengthConverterForm(initial=data)
        return render(
            request, "length.html", context={"form": form})
    return render(
        request, "length.html", context={"form": form})

執(zhí)行測試

執(zhí)行策四并不需要啟動 django 的 runserver:

出現(xiàn) OK 說明測試通過,啟動 django:

python manage.py runserver

打開瀏覽器,訪問 http://localhost:8000/length/convert/ 即可看到界面:

最后的話

本文分享了什么是測試驅動開發(fā),并用測試驅動開發(fā)的方式 創(chuàng)建了一個簡單的 Django 應用程序,用于長度轉換。和一般開發(fā)的區(qū)別就是先寫好測試用例,編碼是為了讓測試用例通過,這樣的方式可以使得需求更明確,開發(fā)周期更短,增量可控,提高開發(fā)效率,保證測試覆蓋率。

到此這篇關于使用 Django 進行測試驅動開發(fā)的文章就介紹到這了,更多相關Django測試驅動開發(fā)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python 添加用戶設置密碼并發(fā)郵件給root用戶

    python 添加用戶設置密碼并發(fā)郵件給root用戶

    這篇文章主要介紹了python 添加用戶設置密碼并發(fā)郵件給root用戶的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Python flask框架定時任務apscheduler應用介紹

    Python flask框架定時任務apscheduler應用介紹

    Flask是Python社區(qū)非常流行的一個Web開發(fā)框架,本文將嘗試將介紹APScheduler應用于Flask之中實現(xiàn)定時任務,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • Seaborn數(shù)據(jù)分析NBA球員信息數(shù)據(jù)集

    Seaborn數(shù)據(jù)分析NBA球員信息數(shù)據(jù)集

    這篇文章主要為大家介紹了Seaborn數(shù)據(jù)分析處理NBA球員信息數(shù)據(jù)集案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Python使用requests模塊爬取百度翻譯

    Python使用requests模塊爬取百度翻譯

    這篇文章主要介紹了Python使用requests模塊爬取百度翻譯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Python后臺開發(fā)Django會話控制的實現(xiàn)

    Python后臺開發(fā)Django會話控制的實現(xiàn)

    這篇文章主要介紹了Python后臺開發(fā)Django會話控制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Python中字符串的處理技巧分享

    Python中字符串的處理技巧分享

    這篇文章給大家分享了Python中字符串的處理技巧,包括拆分含有多種分隔符的字符串、判斷字符串a(chǎn)是否以字符串b開頭或結尾、調整字符串中文本的格式已經(jīng)將多個小字符串拼接成一個大的字符串等,感興趣的朋友們可以通過閱讀下文來學習。
    2016-09-09
  • Pycharm中import torch報錯的快速解決方法

    Pycharm中import torch報錯的快速解決方法

    這篇文章主要介紹了Pycharm中import torch報錯的快速解決方法,很多朋友容易碰到這個問題,今天小編特此把解決方案分享到腳本之家平臺供大家參考,需要的朋友可以參考下
    2020-03-03
  • 使用python讀取csv文件快速插入數(shù)據(jù)庫的實例

    使用python讀取csv文件快速插入數(shù)據(jù)庫的實例

    今天小編就為大家分享一篇使用python讀取csv文件快速插入數(shù)據(jù)庫的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python基于xlrd模塊處理合并單元格

    Python基于xlrd模塊處理合并單元格

    這篇文章主要介紹了Python基于xlrd模塊處理合并單元格,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • K-means聚類算法介紹與利用python實現(xiàn)的代碼示例

    K-means聚類算法介紹與利用python實現(xiàn)的代碼示例

    K-means聚類算法(事先數(shù)據(jù)并沒有類別之分!所有的數(shù)據(jù)都是一樣的)是我們大家應該都聽過的一種算法,下面這篇文章主要給大家介紹了關于K-means聚類算法的基礎知識與利用python如何實現(xiàn)該算法的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11

最新評論

抚宁县| 达尔| 台东县| 东港市| 桐庐县| 嘉善县| 莱州市| 大洼县| 连南| 兴山县| 康乐县| 黄冈市| 河津市| 南江县| 张家川| 东平县| 察隅县| 五台县| 鹰潭市| 德昌县| 怀柔区| 河南省| 南宁市| 达孜县| 固安县| 长丰县| 新田县| 武汉市| 陆川县| 曲麻莱县| 栖霞市| 龙游县| 汶上县| 松桃| 定兴县| 东宁县| 新民市| 阿鲁科尔沁旗| 张家界市| 上虞市| 南皮县|