『飞秋』测试驱动开发TDD系列(二)

TDD测试驱动开发 TDD概述 变红 ——> 变绿 ——> 重构 测试驱动开发(TDD)是一个依赖重复非常短的开发周期的软件开发过程:需求变成非 常具体的测试用例,然后软件只能通过新的测试。 既然是测试驱动,便是测试,测试用例先行; 首先编写好测试用例,期待值,实际值; 开发的目的是让测试运行通过; 开发围绕测试展开; 练习题 编写一个程序从1到100.当遇到数字为3的倍数的时候,点击“Fi... 阅读详情

引言

 

  今天我们来做一个TDD的小例子。通过一个栈的实现来体验一下TDD的过程。在本系列的代码示例中,使用VS2010作为IDE工具,NUnit作为测试辅助工具。关于NUnit的使用,在园子中已经有很多的文章。可以搜索参考一下。推荐几篇不错的:

  NUnit详细使用方法

  实践单元测试(3)-Using NUnit

 

正文

 

1、简介
  今天的任务就是实现一个栈,一个没有边界的栈。就是数据结构中的栈,对栈中的元素的数量没有限制。栈是一个LIFO(Last-Input-First-Out,后进先出)的数据结构,先进入栈的元素要最后出来,最后

进入栈的元素可以现出来。

  栈的操作包括:Push、Pop、Top、IsEmpty。

Push,入栈,将元素放入栈中。
Pop,出栈,从栈顶返回一个元素,并且在栈中删除它。
Top,获取栈顶元素,不从栈中删除元素。
IsEmpty,返回栈是否为空,是否没有元素。
2、任务列表
根据上面的功能,写出一个测试的列表

创建一个栈,验证IsEmpty是否为true。
Push一个元素,验证IsEmpty是否为false。
Push一个元素,然后进行Pop操作,验证IsEmpty是否为true。
Push一个元素,记录这个元素,进行Pop操作,看返回的元素和刚才记录的元素是否一致。
Push三个元素,记录他们,一个一个的进行Pop,验证他们Pop的顺序是否正确。
对一个没有元素的栈进行Pop操作。
Push一个元素,进行Top操作,验证IsEmpty是否为false。
Push一个元素,进行Top操作,看看返回的元素是否就是Push的那个元素。
对一个没有元素的栈进行Top操作。
3、创建测试用例
  针对任务列表中的每一条,建立一个测试用例。

创建一个栈,验证IsEmpty是否为true。
 

Push一个元素,验证IsEmpty是否为false。
Push一个元素,然后进行Pop操作,验证IsEmpty是否为true。
Push一个元素,记录这个元素,进行Pop操作,看返回的元素和刚才记录的元素是否一致。
Push三个元素,记录他们,一个一个的进行Pop,验证他们Pop的顺序是否正确。
对一个没有元素的栈进行Pop操作。
Push一个元素,进行Top操作,验证IsEmpty是否为false。
Push一个元素,进行Top操作,看看返回的元素是否就是Push的那个元素。
对一个没有元素的栈进行Top操作。
 

 

 

 

 

 

结论


   下面是用来测试的Stack类和测试类的源码。


using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace BeautyCode.TDD.ConApp{   public  class MyStack<T>    {       private List<T> elements = new List<T>();        public bool IsEmpty        {            get            {                return (elements.Count == 0);            }        }        public void Push(T element)        {            elements.Insert(0, element);        }        public T Pop()        {            T top = Top();            elements.RemoveAt(0);            return top;        }        public T Top()        {            if (IsEmpty)                throw new InvalidOperationException("Stack is Empty");            return elements[0];        }    }}  

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using BeautyCode.TDD.ConApp;

namespace BeautyCode.TDD.Test1
{
    [TestFixture]
    public class MyStackTest
    {
        private MyStack<string> _myStack = null;

        [SetUp]
        public void Init()
        {
             _myStack  = new MyStack<string >();
        }

        [Test]
        public void Empty()
        {
            Assert.IsTrue(_myStack .IsEmpty);
        }

        [Test]
        public void PushOne()
        {
            _myStack.Push("first element");
            Assert.IsFalse(_myStack.IsEmpty,
                "After Push, IsEmpty should be false");
        }

        [Test]
        public void Pop()
        {
            _myStack.Push("first element");
            _myStack.Pop();
            Assert.IsTrue(_myStack.IsEmpty,
                "After Push - Pop, IsEmpty should be true");
        }

        [Test]
        public void PushPopContentCheck()
        {
            string  expected = "1234";
            _myStack.Push(expected);
            string  actual = _myStack.Pop();
            Assert.AreEqual(expected, actual);
        }

        [Test]
        public void PushPopMultipleElements()
        {
            string pushed1 = "1";
            _myStack.Push(pushed1);
            string pushed2 = "2";
            _myStack.Push(pushed2);
            string pushed3 = "3";
            _myStack.Push(pushed3);

            string popped = (string)_myStack.Pop();
            Assert.AreEqual(pushed3, popped);
            popped = (string)_myStack.Pop();
            Assert.AreEqual(pushed2, popped);
            popped = (string)_myStack.Pop();
            Assert.AreEqual(pushed1, popped);
        }

        [Test]
        [ExpectedException(typeof(InvalidOperationException))]
        public void PopEmpty_myStack()
        {
            _myStack.Pop();
        }

        [Test]
        public void PushTop()
        {
            _myStack.Push("42");
            _myStack.Top();
            Assert.IsFalse(_myStack.IsEmpty);
        }

        [Test]
        public void PushTopContentCheckOneElement()
        {
            string pushed = "42";
            _myStack.Push(pushed);
            string topped = (string)_myStack.Top();
            Assert.AreEqual(pushed, topped);
        }

        [Test]
        public void PushTopContentCheckMultiples()
        {
            string pushed3 = "3";
            _myStack.Push(pushed3);
            string pushed4 = "4";
            _myStack.Push(pushed4);
            string pushed5 = "5";
            _myStack.Push(pushed5);

            string topped = (string)_myStack.Top();
            Assert.AreEqual(pushed5, topped);
        }

        [Test]
        public void PushTopNo_myStackStateChange()
        {
            string pushed = "44";
            _myStack.Push(pushed);

            for (int index = 0; index < 10; index++)
            {
                string topped = (string)_myStack.Top();
                Assert.AreEqual(pushed, topped);
            }
        }

        [Test]
        [ExpectedException(typeof(InvalidOperationException))]
        public void TopEmpty_myStack()
        {
            _myStack.Top();
        }

        [Test]
        public void PushNull()
        {
            _myStack.Push(null);
            Assert.IsFalse(_myStack.IsEmpty);
        }

        [Test]
        public void PushNullCheckPop()
        {
            _myStack.Push(null);
            Assert.IsNull(_myStack.Pop());
            Assert.IsTrue(_myStack.IsEmpty);
        }

        [Test]
        public void PushNullCheckTop()
        {
            _myStack.Push(null);
            Assert.IsNull(_myStack.Top());
            Assert.IsFalse(_myStack.IsEmpty);
        }


    }
}

 

飞秋官网:http://www.freeeim.com/

Java 测试驱动开发(TDD):让你的代码更健壮 TDD 是一种科学、高效的开发方法,不仅能帮助你写出更健壮的代码,还能减少 Bug 和返工。当然,TDD 不是万能的,它更适合逻辑性强、需求清晰的模块开发。所以,别只埋头写代码,尝试用 TDD 先写测试,用一种“未雨绸缪”的心态开发项目,你会发现它的妙处。现在,试试 TDD 吧! 阅读详情

相关推荐

TDD(测试驱动)调研

测试驱动开发(Test Driven Development, 简称TDD)是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写测试用例代码,测试代码确定需要编写什么产品代码。TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。可以帮助我们增量式的构建系统,也能保证代码在任何时刻都不会错的离谱。

专注技术;java、架构、项目交付流程... 1869

C++ 测试驱动开发 TDD(一)

文章目录TDD 介绍Soundex 算法示例介绍增加Soundex 算法测例1增加Soundex 算法测例2Soundex 算法测例1 、2重构增加Soundex 算法测例 3 最近阅读了《C++程序设计实践与技巧:测试驱动开发》,也算是第一次系统的了解到 TDD 的概念吧,因为整个调试的过程太细了,想要一次性说明白着实需要一点功力,这里权当一些读后感分享,有兴趣的读者可以自己找到这本书来读读看。 虽然不能说可以立马有所了解,或者就可以在实际业务代码中就用上了,但是总得先有这么一个了解过程嘛。 TDD 介绍

Chris_zhangrx的博客 1862

为什么TDD能让你的FastAPI开发飞起来?

迭代式开发不是“一次性写完所有功能”,而是把接口拆成多个小周期:每个周期只解决一个具体问题(比如“实现用户创建”→“加密码哈希”→“加邮箱唯一性校验”),每个周期都遵循“定义契约→写测试→实现功能→重构”的闭环。这种方式的好处是风险可控——每一步都能验证功能正确性,避免最后发现“全盘错误”的情况。TDD的第一步是“写失败的测试”,但在FastAPI中,我们需要先明确接口的“契约”——用Pydantic定义请求和响应模型。这一步的核心是:*先和前端/客户端约定“数据格式”,再写测试验证这个约定是否被遵守。

https://blog.cmdragon.cn/ 1069

TDD-测试驱动开发的一般原则!

这些年来,我喜欢下面三条简单的规则来描述测试驱动开发: 除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码。 只允许编写刚好能够导致失败的单元测试。 (编译失败也属于一种失败) 只允许编写刚好能够导致一个单元测试失败的产品代码。 对于任何功能,一定要从编写它的单元测试开始;但是到了原则2,你就不能再为那个单元测试写更多内容。只要一出现该单

4117

Java测试驱动开发(TDD)实践指南

在TDD中,开发者首先编写一个失败的测试用例,然后编写足够的代码来满足测试用例的要求,最后进行重构以提高代码质量。而测试驱动开发(TDD)是一种被广泛应用的开发方法论,它强调在编写代码之前先编写测试用例,并通过测试用例来驱动代码的开发。在实践TDD时,我们需要选择合适的测试框架,编写测试用例,运行测试用例,编写足够的代码,并进行代码的重构。在编写完测试用例后,我们需要运行测试用例来验证代码的正确性。运行测试用例后,我们可以看到测试结果的输出,如果测试通过,则会显示绿色的通过标志,否则会显示红色的失败标志。

C891106的博客 1511

什么是测试驱动开发(TDD)?

测试驱动开发(TDD)是一种软件开发方法,它的核心思想是:​​先写测试,再写代码​​。但这并不是说让你一开始就写好所有测试,而是按照"红-绿-重构"的循环来开发。

跟佟格湾一起学习计算机知识吧~ 1410

测试驱动开发(TDD)实战小例子 (转)

我们知道,测试驱动开发(TDD)的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。再循环进行添加其他功能,直到完全部功能的开发 最近,在公司一个支付系统的接口开发中,我按照上述方法进行了一次TDD的开发尝试。具体实现的功能是:解析渠道商返回的业务参数。首先,我整理出了TODO

i am me,haha,么么哒。。。 1242

测试驱动(TDD)开发的简单计算器程序

测试驱动(TDD)开发的简单计算器程序 C++语言实现,有较高的参考价值。

测试驱动开发(TDD)实践与技巧

引言 测试驱动开发,英文全称 Test-Driven Development,简称 TDD,是一种不同于传统软件开发流程的开发方法。 在《程序员的职业素养》第五章,我第一次看到有关 TDD 内容,当时Bob大叔向我展示了一种不可思议的编程开发方法,这种方法颠覆了我的认知。Bob 大叔列举了 TDD 很多好处,例如确定性、降低代码缺陷、方便代码重构、测试单元文档化,更优秀的代码设计等等。并强力安利读者们尝试 TDD,因为 TDD 是专业人士的选择。 在 Bob 大叔的洗脑下,我决定去尝试学习如何使用 TDD。

记录学习的过程 1万+

Vivado ILA抓不到低频信号?试试Capture Control模式,保姆级配置教程(附PWM调试实例)

本文详细解析了Vivado ILA的Capture Control模式在低频信号捕获中的应用,特别针对PWM调试等场景提供保姆级配置教程。通过条件采样和时间拉伸技术,有效解决传统ILA采样在低频信号调试中的存储深度不足、关键信号丢失等问题,并附赠呼吸灯PWM的完整调试实例,帮助FPGA开发者提升调试效率。

weixin_42549451的博客 350

存储关键技术·RAID技术·RAID2.0·华为RAID2.0+·华为服务器·云计算

一.RAID基本概念 常见的RAID级别组合RAID级别 二.RAID的数据组织形式 三.RAID的数据保护功能 方法一:镜像方法二:奇偶校验算法(XOR) 四.RAID热备和重构 1.热备(Hot Spare)的定义2.热备的分类3.热备的工作原理 五.RAID 2.0技术 1.RAID 2.02.RAID 2.0+3.华为RAID 2.0+ 六.RAID 2.0+块虚拟化技术 1.什么会出现RAID 2.0+技术?2.什么是RAID 2.0?3.RAID 2.0+的原理是什么?

qq_47480932的博客 3320

【TDD】深度解读 - TDD(测试驱动开发)

有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(广义的 TDD 是ATDD),包括BDD)和等。本文所说的 TDD 指狭义上的 TDD,也就是「TDD是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,。。

qq_43331089的博客 2万+

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

先测试再开发?TDD测试驱动开发了解一下?

1、什么是TDD 我第一次接触TDD这个概念,是在<<代码整洁之道>>中,作者鲍勃大叔在书中,写了一些关于测试代码的代码规范,其实就提到了有关TDD三定律: - 定律一: 在编写不能通过的单元测试前,不可编写生产代码 - 定律二: 只可编写刚好无法通过的单元测试,不能编译也算不能通过 - 定律三:只可编写刚好足以通过当前失败测试的生存代码 我第一次读到这三个定律时,不能说是毫无头绪,只能说是一脸懵逼。 完全不知道作者想表达啥意思,也没有案例代码。 对此,我不得不网上查阅的很多相关

优秀的程序员不应该是CRUD 7290

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1084

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例文件注释--olaFlow-算例1- baseWaveFlume

ou_no的博客 3642

测试驱动开发(TDD)学习分享-上篇

测试驱动开发(TDD)是一种增量式软件开发技术。简单地说,就是在没有失败的单元测试的前提下不可以写产品代码。这些测试要很小,而且要自动化。用测试来驱动其实很合理。相对于直接写产品代码,TDD的实践者们会先用测试来表达他们希望产品代码会有什么样的行为。然后这个测试显然会失败。只有在这时,他们才开始写产品代码;以便让测试通过。在测试驱动开发LightScheduler时,测试夹具通过截获对TimeServeice和LightController的调用来校验LightScheduler的行为是否正确。

u010467490的博客 3286

数字图像处理 基于matlab、opencv计算图像的梯度方向和梯度幅值

图像可以被视为标量场(即二维函数)。通过微分将标量场转换为矢量场。梯度是一个向量,描述了在x或y方向上移动时,图像变化的速度。我们使用导数来回答这样的问题,图像梯度的大小告诉图像变化的速度,而梯度的方向告诉图像变化最快的方向。因为梯度有方向和大小,所以将这些信息编码为向量是很自然的。该向量的长度提供了梯度的大小,而其方向提供了梯度方向。因为梯度在每个位置可能不同,所以我们在每个图像位置用不同的向量来表示它。

学以致用 知行合一 3203

测试驱动开发(TDD)方法详解

在软件开发过程中,质量和效率始终是开发团队追求的目标。传统的开发方法常常先编写代码,再进行测试,这种方式在发现问题时常常为时已晚。为了更早地发现和解决问题,测试驱动开发(Test-Driven Development,简称TDD)应运而生。TDD是一种强调测试先行的开发方法,它不仅可以提高代码质量,还能提高开发效率。本文将详细介绍TDD的定义、开发流程、常用工具和框架,并探讨其在实际项目中的应用。

cooldream2009的博客 3602

特别章节-0.1 SolidWorks导出机械臂的URDF模型各个关节坐标系设置

通过Solidworks导出机械臂的URDF模型文件,建立机械臂的各个关节坐标系的规则以及注意点,详细步骤

六眼飞鱼的博客 1万+

SAP ERP 系统订单行项目中的计划行(Scheduled Line)详解

*计划行(Scheduled Line)**是SAP系统中订单行项目(如采购订单、生产订单、销售订单等)的细分单元,用于记录和管理物料的供应或需求计划。每个订单行项目可以包含一个或多个计划行,每个计划行对应具体的交货日期、数量、需求类型(如采购申请、生产订单、库存调拨等)以及相关的物流控制参数。简单来说,计划行是系统对某一物料在特定时间点的供需状态的详细规划,它将订单分解为更细粒度的执行步骤,确保供应链各环节(如采购、生产、仓储)能够按计划协同工作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3392

Python测试驱动开发(TDD)

Python测试驱动开发(TDD) 前言:TDD是一种敏捷开发模式,而不是测试方法。 目录 Python测试驱动开发(TDD) 目录 单元测试与功能测试的区别 “单元测试/编写代码“循环 遵守不测试常量规则 有用的TDD概念 不要预先做大量的设计 确保出现回归测试 如何测试设计和布局 别忘了重构 尽早合并代码 要判断何时应该编写测试确认我们没有犯错 单元测试需要一个断言框架和...

羊同学 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

测试驱动开发(TDD)

测试驱动开发是一种迭代开发方法,强调在编写代码之前先编写测试用例。这些测试用例定义了预期的功能和行为,然后开发人员编写足够的代码来满足这些测试。TDD的核心理念是“红-绿-重构”,即先编写失败的测试(红),然后编写代码使其通过测试(绿),最后进行代码重构以保持代码质量。

qq_39431405的博客 2152

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

浅谈测试驱动开发TDD

测试驱动开发(TDD)是一种软件开发方法,强调在编写功能代码之前先编写自动化测试用例。TDD的核心步骤包括:编写测试用例、运行失败的测试、编写最少量的代码使测试通过、运行测试、重构优化代码,并迭代这一过程。TDD的目标是通过自动化测试确保代码质量、可维护性和稳定性,同时降低后期修复缺陷的成本。TDD与传统开发相比,具有更高的需求明确性和代码质量,且调试成本较低。在TDD中,单元测试和集成测试分别关注单个组件和多个组件的组合,两者结合使用可全面提升代码质量和系统可靠性。TDD特别适用于复杂业务逻辑或对稳定性要

红军不怕远征难,万水千山只等闲 1221

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深度解读 - TDD(测试驱动开发)

转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD为什么要 TDD怎么 TDDFAQ学习路径延伸阅读 什么是 TDD TDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driven Development)。广义的 TDD 是 ATDD(Acceptance Test D

stepup 8760
上一篇: 『飞秋』在ASP.NET服务器端过程中使用WebBrowser的注意事项
下一篇: 【飞秋】Android开发——NDK开发入门
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值