首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过一个简单的例子学习TDD

TDD 学习示例:通过一个简单的例子学习TDD

在学习 TDD(测试驱动开发)时,我们将通过一个简单的例子来了解如何编写测试用例,并基于代码的单元测试来开发。在这个例子中,我们将构建一个简单的 Web 应用程序,该应用程序允许用户搜索并查看一些动物的信息。

测试驱动开发 (TDD)

TDD 是一种编程方法,要求先编写测试用例,然后编写实现,最后再对代码进行重构。这种方法有助于确保代码符合预期,并且易于维护。

测试用例

在编写测试用例时,我们需要考虑如何对代码进行测试。在这个例子中,我们将编写一个测试用例,用于验证从应用程序中获取动物信息,并检查返回的动物信息是否正确。

代码语言:python
代码运行次数:0
复制
def test_get_animal_info():
    animal_info = get_animal_info("Bear")
    assert animal_info["name"] == "Bear"
    assert animal_info["classification"] == "Mammal"
    assert animal_info["habitat"] == "Forest"

在这个测试用例中,我们通过调用 get_animal_info 函数并传入 "Bear" 作为参数,来获取动物的详细信息。然后,我们使用 assert 语句来验证返回的动物信息是否正确。

实现

在编写实现时,我们需要根据测试用例来编写代码。在这个例子中,我们需要实现 get_animal_info 函数,该函数将根据动物的名称来获取动物的详细信息。

代码语言:python
代码运行次数:0
复制
def get_animal_info(animal_name):
    animal_info = {"name": animal_name, "classification": "Mammal", "habitat": "Forest"}
    return animal_info

在这个实现中,我们使用一个字典来存储动物的详细信息,并将其作为函数的返回值。然后,我们使用 assert 语句来验证返回的动物信息是否正确。

重构

在重构代码时,我们需要确保代码的可读性和可维护性。在这个例子中,我们可以考虑重构代码,以使其更易于理解和维护。

代码语言:python
代码运行次数:0
复制
def get_animal_info(animal_name):
    animal_info = {"name": animal_name, "classification": "Mammal", "habitat": "Forest"}
    return animal_info

def get_animal_classification(animal_info):
    classification = animal_info.get("classification")
    if classification == "Mammal":
        return "Mammal"
    elif classification == "Bird":
        return "Bird"
    else:
        return "Other"

def get_animal_habitat(animal_info):
    habitat = animal_info.get("habitat")
    if habitat == "Forest":
        return "Forest"
    elif habitat == "Water":
        return "Water"
    else:
        return "Other"

在这个重构后的代码中,我们使用 get 方法来获取字典中的值,这样代码更易于理解和维护。我们还定义了两个新的函数 get_animal_classificationget_animal_habitat,用于获取动物的详细分类和栖息地信息。

结束语

通过这个简单的例子,我们学习了如何使用测试驱动开发来编写单元测试,并基于代码的单元测试来开发。在这个过程中,我们学会了如何编写测试用例,如何编写实现,以及如何重构代码,使其更易于理解和维护。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TDD 一个简单例子

我们按照 TDD1个准备步骤+关键5步来看做一个例子。 需求: 假设我有一个叫Dollarclass, 那它有个方法叫做Times. 我现在目的是要实现这个Times方法。...准备步骤1: 基于需求,准备一个Test List,什么是 test list我在前面(TDD( 测试驱动开发) Overview)讲过,比方说这个是抛开代码实现detail想出来一些需要测试东西...下面看一下关键5步,我们先测test list中一个吧,测试先后顺序一般是 先挑最简单测 然后再挑难点 1....对开发代码做很小修改,目的就是让新加测试通过 (注意这里目的) 目的是用最简单方法让第一个test case 通过,那代码肯定很简单         //method to be tested...本来准备讲 怎么实现第四需求,由于本人准备由这个例子 带出TDD怎么让你Program to interface和在没有用interface情况下怎么测试, 写文章时间可能比较长,准备还是在下篇中讲吧

81280

一个非教条式TDD例子

TDD不太提倡在开始前不做任何设计,恰恰它提倡做一些简单且必要程序接口设计 —— 非教条主义 通过对象建模分析,我设计了两个简单对象,一个是BatchDivider,另一个是Range,UML如下:...所以,为了在学习TDD时更好自控,就有了这样一个教条 —— 新增测试一定得是挂。...教条:通过测试唯快不破 TDD循环圈强调要以最快速度、最简单丑陋方式让测试快速通过,你这写多了啊? 这个教条跟上一个是紧密相关,在上一条后半部分也在解释这个。...我认为学习TDD也是一样道理,实际项目中确实业务和架构复杂得多,但这不该成为你拒绝以简单案例入手去练习基本功理由。再复杂案例,元能力是类似的。...写在最后 我接触TDD有7年多时间了,至今未通透,仍在努力学习中。

32430

通过一个例子简单几种委托使用及事件

第一章: 第一种,通过new 关键字创建对象  特别注意:这种方式必须要先有根据委托创建方法与之关联,否则不能使用。 ...或者直接让委托变量直接指向某个具体方法(前提是方法要存在) 格式为:同一命名空间下 public delegate void One();//无参数也无返回值 class...string[] args) { One objOne0= new One(其中必须有方法作为参数); One objOne00=必须方法...} }  泛型集合lambda表达式: 1.首先创建泛型集合类并初始化 List List = new List(){1,2,3,4,5,6,7}; 2,使用lambda表达式删除集合中元素...list.RemoveAll(n=>n>4); 运行结果为1,2,3,4 第二章:事件 事件由来 1.什么是事件?

39820

通过一个简单例子理解JavaScript闭包和this对象

同样,this也是一个很抽象概念,它往往和闭包一起出现。 我们通过一个例子,并做一些后续改造,来说说,到底,闭包是什么?this又是如何指定? 1....当运行abc函数时,返回值为一个函数,这个函数,就是一个闭包函数。...答:被调用时,保留其定义时候作用域执行环境。 回头看例子,abc()执行完之后,返回foo函数(一个闭包函数)。...简单来说,谁调用了函数,那么,函数内部this就是这个调用者(注意:如果用new关键字调用函数,那么,this默认指向这个新对象)。...其实,this如何绑定,还有其他方法,比如call, apply, bind,这里就不展开讲了。 小结: 当查看一个函数时,要注意,它是如何访问变量?!

34520

通过简单例子上手客户端 HMR API

”,通过 hot 接口定义,我们能大概了解到 HMR API 数量以及基本参数。...首先我们通过 pnpm create vite hmr-app -- --template vanilla 快速创建一个纯 JavaScript 项目,启动后进入我们 DEMO 演示环节: import.meta.hot.accept...我们通过一个例子来说明,上面 import.meta.hot.dispose 例子中,热更之后数字都是从 1 开始计数,如果我们希望 count.js 计数即使在热更之后也能持续叠加怎么做呢?...(() => { // 清理副作用 clearInterval(timer) }) } 上述 count.js 代码在上一个例子基础上加了 import.meta.hot.data.getCount...通过简明例子上手 HMR 客户端 API 使用,能够帮助我们在客户端中更好地使用热更新技能,同时也能帮助我们写出易用,体验更好插件。

1K10

一个例子简单学习gcc、makefile、程序执行过程

只执行第一个行程目标文件依赖方法 在makefile中,hello是目标文件,第一行main.c 和test.c 为目标文件依赖文件(依赖对象),hello:main.c test.c 为二者依赖关系...,gcc main.c test.c -o hello为依赖方法 倒数第二行中,clean:也为一个依赖关系,依赖关系是可以没有依赖对象,这个就没有。....PHONY为makefile里一个关键字,作用是使后面的方法“总是被执行” 每个文件都有三个时间:ACM时间 A(ACCESS):访问时间(读取时间)。...三个时间在系统下显示顺序是A、M、C,指令stat 文件查看文件信息: 一定是源文件先存在,然后通过编译,形成可执行程序,因此源文件M时间一定早于可执行程序M时间。...-c test.s 此处“目标文件”含义和上面makefile中“目标文件”含义不同,makefile中含义是目标要形成文件,而此处名字就叫做”目标文件“ (与库文件)链接形成 -out可执行程序

23120

通过一个“时髦”例子学 Babel 插件

通过简单 代码感受两种写法差异: import HelloWorld from 'HelloWorld' export default { name: 'App', components...这里也要建立一个假设:假设我们 this 是访问存在 props、data、computed、methods 下 key。一些特殊情况,比如 vue2 中通过 this....:在遍历 properties 时,识别对哪些 key 做了处理,做一个简单 property 到方法映射,最终通过 template 生成 AST,塞到 bodyContent 中。...但仅仅是例子需求!实际使用还有很多很多功能需要实现,很多细节需要补充!感兴趣童鞋可以 fork 源码[14] 玩玩哦!...本文通过从 vue2 options api 组件写法到 vue3.2 setup 写法,开发体验真的提高了很多。确实是时候去学习和使用了!

37820

简单SpringAOP例子

说AOP之前需要先了解一些AOP概念,然后通过一个例子来吸收。 方面(Aspect):一个关注点模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好横切关注点例子。...其中包括了“around”、“before”和“after”等不同类型通知。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心拦截器链。...切入点(Pointcut):指定一个通知将被引发一系列连接点集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。 引入(Introduction):添加方法或字段到被通知类。...Spring允许引入新接口到任何被通知对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。...概念知道后,来看例子例子使用两个通知,前置通知(before advice),后置通知(after advice) 一个Dao接口: ? 一个PersonDao实现类: ?

1.5K31

WebRTC:一个视频聊天简单例子

一、相关API简介 在前面的章节中,已经对WebRTC相关重要知识点进行了介绍,包括涉及网络协议、会话描述协议、如何进行网络穿透等,剩下就是WebRTCAPI了。...详细代码参考文章末尾,也可以在 笔者Github 上找到,欢迎留言交流。 二、信令交换 信令交换是WebRTC通信中关键环节,交换信息包括编解码器、网络协议、候选地址等。...,通过 addTrack 进行添加,发送给远端。...mediaStream.getTracks().forEach(track => { localPeer.addTrack(track, mediaStream); }); 远端可以通过监听 ontrack...onTrack 会触发两次 // 实际上两次触发时,evt.streams[0] 指向同一个mediaStream引用 // 这个行为有点奇怪,github issue 也有提到 https://github.com

2.9K30

一个通过BackgroundWorker实现WinForm异步操作例子

在最近一个Smart Client项目中,为了演示异步操作实现,写了一个基于BackgorundWorker例子。...一、场景描述 下面是程序运行时截图。本程序模拟这样一个场景:有两组相互独立数据需要逐条获取和显示,左边和右边两个groupbox分别代表基于这两组数据操作,由于他们完全独立,因此可以并行执行。...此外通过点击Stop按钮,可以中止掉当前操作。当操作被中止后,ProgressBar和Label反映中止那一刻状态。...之所以要将这两个参数传入RetrieveData()方法,是因为该方法是为两个BackgroundWorker服务,需要通过参数来区别当前是哪个BackgroundWorker。...所以制定一个KeyValuePair对象作为第二个参数。其中Key为当前记录数,Value是一个Guid,代表取出数据。

52810

服务器-Nginx-一个简单例子

服务器-Nginx-一个简单例子 直接贴一个几经磨难简单例子吧,虽然简单,但是有些不理解地方,就出了很多错,但是因为这些错误,在对nginx理解稍微深刻了那么一点点同时,对Linux操作好像也有了一点进步啊...才知道为什么大家命令都那么长,而我总是一步步慢慢来了,一方面不熟,另一方面确实操作不够多啊。...出现问题分析 root目录位置: 原来root目录虽然写是/var/myweb,但是实际发现位置是 在/usr/share/nginx下面,所以需要拷过去,具体这个位置是在哪里设置,因为已经把所有其他...include都关掉了,所以可能是ubuntu下安装之后默认目录,就像默认监听80端口页面其实在var/www/html下面一样。...另一个就是关于config文件格式,一定要仔细写,需要加分号,然后就是最后/,对于nginx配置来说,是意义重大,后面可能会说到这个问题,但是现在还是要写上。

81910

常用nginx配置项详解(一个简单例子

核心提示:Nginx ("engine x") 是一个高性能 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。...Nginx ("engine x") 是一个高性能 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。...access_log logs/www.hahaer.com.access.log main; #如果访问 /img/*, /js/*, /css/* 资源,则直接取本地文件,不通过squid...#如果这些文件较多,不推荐这种方式,因为通过squid缓存效果更好 location ~ ^/(img|js|css)/ { root /data3/Html; expires 24h; }...$ { deny all; //禁止这些文件下载,大家可以根据自己环境来配置 第一行表示目前活跃连接数 第三行第三个数字表示Nginx运行到当前时间接受到总请求数,如果快达到了上限

37210

一个关于遗传算法优化简单例子

在课程上学了一些关于遗传算法思想,想用这个思想来写一个简单例子。...先来说遗传算法思想:遗传算法是模拟生物遗传、变异、选择、进化来对问题解进行优化,可以理解为将一组初始解看成是“基因”,在求解开始设置一个过滤器,对“基因”进行筛选,通过如果目前生成“基因”暂不满足上述条件...,那么“基因”就要开始“变异”,在迭代过程中通过产生随机数,对“基因”进行更改,达到“变异”目的,也就是”遗传“给了下一代。...,可以使之尽量小,从而避免在遗传变异中错过最优值 9 xi=[] #通过下x,y来记录迭代点坐标,方便画图 10 yi=[] 11 while(count<100000): #迭代代数,可以自己设置...Python小程序,虽然简单,但整个算法基本步骤基本都包含了,适合复习时浏览一下。

47620

用好cBioportal数据库(一个简单例子

这是我们分享多次论文,其中涉及基因组学生信分析,就是用cBioPortal数据库进行机制探究。比较简单,但是在进行基因组学探究时,这些分析有时就足够了。 ?...oncomine、HPA和km plotter等数据库使用方法,主要是分析差异表达和存活率。cBioPortal数据库是探索肿瘤基因组学特征,是从DNA水平进行,是对机制进一步研究。...免疫浸润分析属于交叉,算是表型式解释,就是用现象解释现象,但其实并没有涉及具体机制。 在完成差异分析、临床意义问题之后,作者利用cBioportal数据库,进一步探讨可能分子机制。...基因突变、删除和扩增等都是可能原因,尽管实际情况是,突变可能与肿瘤发生关系有限(比例比较低),但是为我们生信分析提供了角度,值得做。 ?...基因组学探究,有基因家族组学改变比例总体展示(A),单个基因组学变化展示(B),各个基因表达之间相关性(C)和与基因改变密切相关top50临近基因相互作用图(D)。

1.2K30
领券