我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Django进行测试驱动开发

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Django进行测试驱动开发

所谓测试驱动开发(TDD),就是先编写测试用例,然后编写代码来满足测试用例,具体包含以下步骤:

  • 编写测试用例。
  • 编写代码满足测试用例中的需求。
  • 运行测试用例。
  • 如果通过,说明代码满足了测试用例所定义的需求。
  • 如果未通过,则需要重构代码,直到通过。
  • 重复以上步骤,直到通过全部的测试用例。

通常情况下,我们都是先写代码,然后编写测试用例,因此测试驱动开发是反直觉的,那为什么还要这么做呢?基于以下几点原因:

  1. TDD 可以被认为是根据测试用例来说明需求。此后编写源代码,重点是满足这些要求。当测试最终通过时,你可以确信已满足要求。这种专注可以帮助开发人员避免范围蔓延。
  2. TDD 可以通过较短的开发周期提高开发效率。一次解决测试用例中的个别需求可以最大限度地减少干扰因素。重大更改将更容易跟踪和解决,减少了调试工作,提高了效率,并且将更多时间花在开发上。
  3. 编写测试时考虑到了需求。正因为如此,它们更有可能被写成明确的,可以理解的。这样的测试可以作为代码库的优质文档。
  4. 先编写测试用例可确保您的源代码始终具有可测试性,它还保证随着代码库的增长,测试覆盖率始终保持在合理的百分比。

然而,测试驱动开发也不是银弹,以下情形并不适合测试驱动开发:

  • 当需求不明确时,有时续期会随着开发的进行而逐渐明确,在这种情况下最初编写的任何测试可能会过时。
  • 开发的目的是为了证明某一概念时——例如在黑客马拉松期间,测试通常不是优先事项。

了解了测试驱动开发之后,我们用 Django 来演示一下测试驱动开发的过程。(Python 3.7 以上,Django 2.0 以上)

首先描述需求,我们要实现这样一个单位换算功能的 Web 应用,可以在厘米、米、英里直接互相转换,Web 界面如图所示:

创建项目

首先,我们创建一个名字叫 convert 的项目:


pip install django
django-admin startproject converter

此时 Django 已经为我们生成了 converter 目录及基本的项目文件:


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

然后,进入 converter 目录,创建一个名字叫 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')),
]

这样一个没有任何业务逻辑的项目就创建成功了,接下来编写测试用例:

编写测试用例

在 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 开发没什么两样,先编写一个 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>

然后编写最重要的视图函数 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})

执行测试

执行策四并不需要启动 django 的 runserver:

出现 OK 说明测试通过,启动 django:


python manage.py runserver

打开浏览器,访问 http://localhost:8000/length/convert/ 即可看到界面:

最后的话

本文分享了什么是测试驱动开发,并用测试驱动开发的方式 创建了一个简单的 Django 应用程序,用于长度转换。和一般开发的区别就是先写好测试用例,编码是为了让测试用例通过,这样的方式可以使得需求更明确,开发周期更短,增量可控,提高开发效率,保证测试覆盖率。

到此这篇关于使用 Django 进行测试驱动开发的文章就介绍到这了,更多相关Django测试驱动开发内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Django进行测试驱动开发

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用Django进行测试驱动开发

本篇内容介绍了“如何使用Django进行测试驱动开发”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!所谓测试驱动开发(TDD),就是先编写测试
2023-06-21

C++开发建议:如何进行C++测试驱动开发

C++是一种高效、可靠、可扩展性强的编程语言,适合用于开发各种类型的软件。在开发C++应用程序时,测试驱动开发(TDD)是一种可行的方法,可以确保代码的质量并提高开发效率。本文将介绍如何进行C++测试驱动开发。理解测试驱动开发测试驱动开发是
C++开发建议:如何进行C++测试驱动开发
2023-11-22

Golang开发经验分享:如何进行高效的测试驱动开发和单元测试

在Golang开发中,测试驱动开发和单元测试是非常重要的一环。测试驱动开发(TDD)是一种软件开发方法,其中测试在编写代码之前编写,并且在编写的代码通过测试之前也无法编译。而单元测试则是在代码编写完成后对代码某一小部分进行测试,以确保这一小
Golang开发经验分享:如何进行高效的测试驱动开发和单元测试
2023-11-22

Golang开发经验分享:如何进行高效的测试驱动开发

Golang是一种非常流行的编程语言,其在Web开发、云计算和互联网领域具有广泛的应用。而测试驱动开发(Test Driven Development,简称TDD)则是一种开发方式,它可以帮助我们在开发过程中更高效、更精确地编写代码。那么,
Golang开发经验分享:如何进行高效的测试驱动开发
2023-11-22

Android测试驱动开发实践

在Android应用开发中,相信很少有人在坚持先由设计人员做完整的概要设计 、详细设计,然后交给程序员进行编码实现了。通常是在有一个大体框架的情况下,开始进行具体编码开发了。在这种情形下,开发速度可以有很大的提高,但是终代码质量却不可避免的
2022-06-06

Android测试驱动开发实践2

在实际项目开发过程中,一般先实现核心功能,后再做辅助性功能,这样可以尽快验证Idea的正确性,同时有助于让老板、投资人或客户看到可运行的产品,从而对产品充满信心,加大对项目的支持。但是对于我们这个项目而言,我们首先需要得到一个Android
2022-06-06

Android测试驱动开发实践3

至此,一个基于MVC的基本Android应用程序已经初步形成了。下面我们来实现一个具有TabHost的布局的典型Android应用,由于我们基本上可以不考虑Android 4.x以前的版本,因此我对TabHost布局的实现将采用Fragme
2022-06-06

Android测试驱动开发实践1

在正式进行Android测试驱动开发之前,不得不先提一下Android应用架构问题。在传统软件开发中,MVC架构得到了广泛的应用,然而在Android开发中,很少见应用采用了MVC架构(不要说Android及Widget全部采用的是MVC架
2022-06-06

C#开发建议:测试驱动开发与单元测试实践

C#(C Sharp)是一种通用、面向对象的编程语言,它在软件开发领域得到了广泛的应用。对于C#开发者来说,掌握一些开发建议是非常有益的,可以提高代码的质量和开发效率。本文将介绍测试驱动开发(TDD)和单元测试在C#开发中的实践,并分享一些
C#开发建议:测试驱动开发与单元测试实践
2023-11-22

如何进行RK3399 camera驱动开发

如何进行RK3399 camera驱动开发,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android camera驱动开发概述目前板子上有两路mipi rx,
2023-06-05

Go函数性能优化:测试驱动开发与自动化测试

在 go 中优化函数性能的关键方法是:测试驱动开发 (tdd):通过编写测试先于代码来促进健壮、可维护的代码。自动化测试:自动化单元测试以在每次代码更改时确保代码质量。实战案例:优化读取文件功能,通过 tdd 和自动化测试,确保其性能和正确
Go函数性能优化:测试驱动开发与自动化测试
2024-04-30

Android中使用JUnit进行自动测试

假设你正在编写Android服务代码,而且,又要时不时的重构代码,那么,有效的方式是添加自动测试用例。在写过一个简单的sample以后,发现确实很容易,下面我google的一些资料,关于如何在Android上自动测试类,通常是下面的服务类。
2022-06-06

JavaScript Jest 之路:让测试驱动你的开发

JavaScript 中的 Jest 框架提供了全面的测试支持,让开发者可以采用测试驱动开发 (TDD) 方法来构建可靠且健壮的应用程序。
JavaScript Jest 之路:让测试驱动你的开发
2024-02-17

PHP设计模式:测试驱动开发实践

tdd用于编写高质量php代码,步骤包括:编写测试用例,描述预期功能并使其失败。编写代码,仅使测试用例通过,无需过分优化或详细设计。测试用例通过后,优化和重构代码以提高可读性、可维护性和可扩展性。PHP 设计模式:利用测试驱动开发 (TDD
PHP设计模式:测试驱动开发实践
2024-05-14

PHP 框架中的测试驱动开发策略

php 框架中的测试驱动开发 (tdd) 策略包括:设置测试环境(安装测试框架、配置环境)编写测试用例(测试代码预期输出)编写源代码(实现测试中描述的功能)运行测试(验证源代码运行情况)重构和调试(修复失败测试并重写代码)实战案例:sumn
PHP 框架中的测试驱动开发策略
2024-05-23

JavaScript Jest 探秘:揭开测试驱动的开发秘密

探索 JavaScript Jest,一种强大的测试框架,它可以让开发者在每次进行代码改动时都能够对他们的代码进行快速可靠的测试。本文将深入探讨 Jest 的功能、优势和最佳实践,帮助开发者掌握测试驱动的开发方法。
JavaScript Jest 探秘:揭开测试驱动的开发秘密
2024-02-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录