- 浏览: 496585 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
引言 |
今天我们来做一个TDD的小例子。通过一个栈的实现来体验一下TDD的过程。在本系列的代码示例中,使用VS2010作为IDE工具,NUnit作为测试辅助工具。关于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类和测试类的源码。
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->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];
}
}
}
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->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);
}
}
}
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);
}
}
}
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 548如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 673组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 530本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5965 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 617前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 840企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 626首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 596概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 999概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 807我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8431 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9721、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 779引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 653oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 607经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 636今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 684我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 700今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 673题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
"Code Kata 和测试驱动开发(TDD)介绍实用 PPT课件" 本课程主要介绍了 Code Kata 和测试驱动开发(TDD)的概念和实践方法,并对软件设计的基本原则进行了详细的讲解。课程共计 13 页,涵盖了软件设计的九个原则,...
测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个...
"TDD测试驱动开发.pptx" TDD 测试驱动开发是一种软件开发方法,它强调通过编写自动化测试来驱动整个开发过程。TDD 是敏捷开发中的一个核心实践和技术,也是一种设计方法论。其主要包括两方面:测试先行和代码重构。...
测试驱动开发(Test Driven Development,简称TDD)是一种软件开发方法,强调在编写实际的生产代码之前,先编写能够失败的单元测试。TDD的核心理念是“先测试,后编码”,通过测试来驱动设计,确保软件的质量和可...
测试驱动开发 TDD ,将读者带入XP极限编程的神奇世界!
总结来说,测试驱动开发TDD是一种以测试为指导的开发模式,它通过编写测试来驱动功能代码的实现,强调代码的可测试性、可读性和可维护性。在实际应用中,TDD能够帮助开发者发现设计上的问题,提前预防错误,并提高...
测试驱动开发(Test-Driven Development, 简称TDD)是一种软件开发实践,强调在编写实际代码之前先编写测试用例。这种方法的核心理念是通过编写能够失败的测试来定义需求,然后编写足够的代码使测试通过,最后重构...
文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在实际项目中应用...
测试驱动开发(TDD)是一种先进的软件开发方法,它的核心理念是“先写测试,后写代码”。在TDD的流程中,开发人员首先编写测试用例,这些测试用例定义了所需功能的行为边界和预期结果。然后,他们会运行这些测试,...
测试驱动开发(TDD)是一种敏捷软件开发技术,它要求开发者在编写功能代码之前先编写测试代码。这种方法提倡先写失败的单元测试,然后编写刚好足够使测试通过的代码,最后通过重构来提高代码的质量。王晓毅所著的...
测试驱动开发(TDD)介绍 测试驱动开发(TDD)是一种开发流程,旨在通过编写测试代码来驱动开发过程。这种开发方法可以保证项目的健壮性,尽可能地排除未知的bug,并提高代码的可读性、可维护性和可扩展性。 TDD的...
测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,它的核心思想是“先写测试,再写代码”。TDD强调在编写实际功能代码之前,先编写能够失败的单元测试,确保测试覆盖了预期的功能需求。这种...
教程主题:Visual Studio 2010 TDD 测试驱动开发 实战 教程录制:柳永法 web:http://www.yongfa365.com/ 本教程旨在以最简单的hello world方式像您展示 Visual Studio 2010强大的TDD,推荐任何没接触过VS2010及TDD...
极限编程反其道而行之,主张采用测试驱动开发(TDD)的方法,即通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD通过不断地测试推动代码的开发,既简化了代码,又保证了软件质量。本书采用“手把手”...
测试驱动开发(Test-Driven Development,简称TDD)是一种敏捷软件开发的技术,以测试作为开发过程的中心环节。它倡导在编写产品代码之前先编写测试代码,确保产品代码能够通过这些测试。这种方法与传统的开发方式...
在C/C++项目中应用测试驱动开发(TDD)的方法,从单元测试到集成测试,详尽介绍了测试的基础、框架选择、实际应用及最佳实践。文章首先阐述了TDD的核心理念及其优势,包括提升代码质量、减少错误和改进设计等。接着...
这份PPT教程主要介绍了两种软件开发实践:Code Kata和测试驱动开发(Test-Driven Development, TDD)。Code Kata是一种编程练习,旨在通过重复练习来提高技能和熟练度,类似于武术中的练习动作。而TDD是一种软件开发...