Python测试驱动开发(TDD)

2023-10-31

Python测试驱动开发(TDD)

前言:TDD是一种敏捷开发模式,而不是测试方法
测试很难 ——- 难在坚持,一直做下去。
现在花时间编写的测试不会立即显出功效,要等到很久以后才有作用 ——- 或许几个月之后避免在重构过程中引入问题,或者升级依赖时捕获回归异常。或许测试会从一种很难衡量的方式回报你,促使你写出设计更好的代码,但你却误以为没有测试也能写出如此优雅的代码。

项目github地址

https://github.com/Tyrone-Zhao/Test-Driven-Development

目录

单元测试的好处

编程就像从井里打水

编程其实很难,我们的成功往往得益于自己的聪明才智。假如我们不那么聪明,TDD就能助我们一臂之力。Kent Beck(TDD理念基本就是他发明的)打了个比方。试想你用绳子从井里提一桶水,如果井不太深,而且桶不是很满,提起来很容易。就算提满满一桶水,刚开始也很容易。但要不了多久你就累了。TDD理念好比是一个棘轮,你可以使用它保存当前的进度,休息一会儿,而且能保证进度绝不倒退。这样你就没必要一直那么聪明了。Test All The Things!

细化测试每个函数的好处

程序变复杂后问题就来了,到时你就知道测试的重要性了。你要面临的危险是,复杂性逐渐靠近,而你可能没发觉,但不久之后你就会变成温水煮青蛙。
首先,写测试很简单,写起来不会花很长时间,所以,别抱怨,只管写就是了。
其次,占位测试很重要。先为简单的函数写好测试,当函数变复杂后,这道心理障碍就容易迈过去。你可能会在函数中添加一个if语句,几周后再添加一个for循环,不知不觉间就将其变成一个基于元类(meta-class)的多态树结构解析器了。因为从一开始你就编写了测试,每次修改都会自然而然地添加新测试,最终得到的是一个测试良好的函数。相反,如果你试图判断函数什么时候才复杂到需要编写测试的话,那就太主观了,而且情况会变得更糟,因为没有占位测试,此时开始编写测试需要投入很多精力,每次改动代码都冒着风险,你开始拖延,很快青蛙就煮熟了。

单元测试与功能测试的区别

单元测试和功能测试之间的界线有时不那么清晰。不过二者之间有个基本区别:功能测试站在用户角度从外部测试应用,单元测试则站在程序员的角度从内部测试应用。
采用的工作流程大致如下:
1)先写功能测试,从用户的角度描述应用的新功能
2)功能测试失败后,想办法编写代码让它通过(或者说至少让当前失败的测试通过)。此时,使用一个或多个单元测试定义希望代码实现的效果,保证为应用中的每一行代码(至少)编写一个单元测试
3)单元测试失败后,编写最少量的应用代码,刚好让单元测试通过。有时,要在第2步和第3步之间多次往复,直到我们觉得功能测试有一点进展为止。
4)然后,再次运行功能测试,看能否通过,或者有没有进展。这一步可能促使我们编写一些新的单元测试和代码等。

由此可以看出,在整个过程中,功能测试站在高层驱动开发,而单元测试从低层驱动我们做些什么。


功能测试代码, 测试主要功能(冒烟测试),数据有效性验证。详细代码可参见上面的github地址中的functional_test/

TDD的重要思想是必要时一次只做一件事。即每次只做必要的操作,让功能测试向前迈出一小步即可。


单元测试代码,视图逻辑测试,数据模型测试,模版表单测试。
Mock,参数校验:

from unittest.mock import patch, call
[...]
    @patch("accounts.views.auth")
    def test_calls_authenticate_with_uid_from_get_request(self, mock_auth):
        self.client.get("/accounts/login?token=abcd123")
        self.assertEqual(
            mock_auth.authenticate.call_args,
            call(uid="abcd123")
        )
  • 这里的patch mock了accounts.views.auth模块,而且把mock的范围限定在下面的测试函数范围内,测试函数执行完毕,mock即被取消
  • mock掉的auth模块中的所有属性和方法也同样是mock对象,通过在参数重传递mock对象为mock_auth来实现mock对象的调用
  • self.client.get()方法为django内置的模拟客户端,可以模拟客户端发送请求,示例中请求了”/accounts/login?token=abcd123”的url
  • 对应请求url的回调函数为auth模块中的authenticate方法,用mock对象的call_args属性获取其请求的参数,返回一个call(*args, **args)对象
  • 下面用mock模块中导入的call方法构建预期结果,使用TestCase类的assertEqual()方法断言结果,至此一个单元测试函数完毕
单元测试与集成测试的区别以及数据库

追求纯粹的人会告诉你,真正的单元测试绝不能设计数据库操作。不仅测试代码,而且还依赖于外部系统,如数据库的测试叫做集成测试更确切。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python测试驱动开发(TDD) 的相关文章

随机推荐

  • 频繁FullGc排查思路

    现象 通过监控系统平台告警感知到 某应用某IP在某段时间内出现FullGC FullGC的过程伴随着STW 如果过于频繁 将会导致用户体验极具下降 FullGC的出现经常伴随老年代空间被打满的情况 可以通过监控视图来观测到 当前统一使用CM
  • cs186 学习笔记

    书籍准备利用数据库系统概念 用课程参考资料和题 课程网站 答案 HW0 主要是后面会用到的一些配置 Docker Git Box 课程建议说多备份 Box是本地备份 Git是远程的 都不太会 需要先把这些看完 HW1
  • ubuntu下查看软链接

    工作笔记 以python为例 以root用户进入 usr bin 目录 找到python 可以看到python被链接到python2 7这个执行程序上 建立新的软链接 ln s 源文件 目标文件 删除 rm rf 链接名 转载于 https
  • python求素数

    口求100内的素数 个数能被从2开始到自己的平发根的正整数整数整除 就是合数 import math n 100 for X in range 2 n for i in range 2 math ceil math sqrt x if x
  • 追梦路上—记这一年的自己

    这一年的文字 借这个总结的机会将自己的博客总结 2014年9月 2015年9月 看了一遍 既是在回顾总结 也是在看自己这一年的成长变化 B S系列 牛腩新闻发布系统 只写了一篇关于发布网站和分页的总结 现在回去看 感觉价值不是很大 贴了很详
  • 如何实现小型WEB搜索引擎(C#+SQL Server全文检索+Asp.net)

    1 引言 21世纪 中国互联网搜索引擎领域可谓群雄逐鹿 百度 Yahoo 中搜 搜狗等等都使出浑身解数吸引着网民的眼球 这些大网站可谓是各有所长 总的来说虽然他们搜索功能都很强 但是搜索得到的结果基本上是千篇一律 信息的冗余量很大 网民不得
  • jenkins持续集成源码管理选项为None,构建失败找不到git.exe解决办法

    我的jenkins版本为Jenkins ver 2 19 1 1 源码管理选项只有None的解决办法 在插件管理中心 搜索对应的源码管理插件这里以git为例 搜索git plugin点击右下角的安装方式 在线安装需要连接VPN你懂的 如下图
  • 查询按键控制数码管的显示

    一 仿真电路图 二 c语言代码 include at89x51 h unsigned int j unsigned char i k cz unsigned char code a 0x3f 0x06 0x5b 0x4f 0x66 0x6d
  • 10 个用于 Linux 的开源轻量级 Web 浏览器

    导语 在一些快速对比之后 本文发现了一些适用于 Linux 的轻量级 Web 浏览器 推荐给大家 希望大家有所裨益 不过需要注意的是 文章所提及的浏览器并没有做过任何基准测试 因此适用于 Linux 系统的东西可能不适用于其他系统 作者 M
  • 实际生产环境Apache RocketMQ消息体过大的解决方案

    前言 官方定义消息体默认大小为 4MB 普通顺序消息类型 事务 定时 延时类消息默认大小为64KB 如果超过限制则会抛出异常 但实际工作中 需要使用到MQ进行异步解耦 传输的业务消息偶尔会遇到超过4MB 尤其在业务复杂的系统中 那么我们应该
  • 牛客网笔试输入输出的一堆坑。。(Python)

    牛客网笔试的时候Python的输入输出是真的很坑 有时候线下自测案例是正常的 线上却怎么都调不过去 这里简单记录一下 一 常见输入输出的写法 1 input 直接使用input 读取回来的是字符串 比如输入为 abds n就为 abds n
  • Ubuntu 18.04 的安装及基础操作流程

    目录 一 Ubuntu 的安装及设置网络参数 1 Ubuntu 的安装 2 设置网络参数 二 将apt get源更换为清华源 1 备份原文件 输入sudo cp etc apt sources list etc apt sources li
  • 天天给 App 抓包,还不懂 HTTP 代理吗?

    一 序 今天来和大家一起聊聊 HTTP 代理 在 HTTP 协议中 最基础的就是请求和响应的报文 而报文又由报文头和报文实体组成 大多数 HTTP 协议的使用场景 都是依赖设置不同的 HTTP 请求 响应 的 Header 来实现的 既然要
  • CTO、技术总监和技术经理有啥区别?

    最近朋友圈上被CTO的故事刷的满屏都是 着实又火了一次 大概是某个C轮融资的医疗网站CTO被离职 而CTO是一个知乎大V和微信大号 此事一出 在微信群有支持也有反对之声 支持此CTO被离职的认为其在工作时没有Review程序 自己不写代码
  • 【零知ESP8266项目篇】1 OLED天气时钟

    引述 我们一起学了这么久的零知ESP8266的教程 是不是该检验一下自己了呢 在前面的分享中 有小伙伴留言 太简单 那我就顺水推舟 拔高一下 实践搞个小项目 天气时钟 到现在为止 作为一个基本的开发者 咱们已经对零知ESP8266有了最基本
  • Spring Boot项目中使用最新版HDFS Java API操作Hadoop 3.x详解

    1 在Spring Boot Spring Cloud项目中添加以下依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  • [附源码]JSP+ssm计算机毕业设计校园快递代取接单平台lnqu9【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • Java学习笔记之继承(1)

    提到继承 大家可能第一时间会想到继承遗产 Java里的继承虽然不是继承钱 但是也和继承遗产有相似之处 继承遗产一般是说子女辈获得了父辈留下的钱财 物品等 java里的继承是指子类获得了和父类一样的属性 1 类的继承格式 class 父类 q
  • 5个步骤实现目标检测

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 本文转自 磐创AI 导读 目标检测技术是当今计算机视觉领域的发展趋势 在场景图像和视频中 有许多方法被用来检测物体 在资源和执行时间方面 每种技术都有自己的优势和局限性
  • Python测试驱动开发(TDD)

    Python测试驱动开发 TDD 前言 TDD是一种敏捷开发模式 而不是测试方法 测试很难 难在坚持 一直做下去 现在花时间编写的测试不会立即显出功效 要等到很久以后才有作用 或许几个月之后避免在重构过程中引入问题 或者升级依赖时捕获回归异