`

测试驱动开发TDD系列(二)

阅读更多

 

 

引言

 

  今天我们来做一个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类和测试类的源码。

<!--<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);
        }


    }
}

 


 

Technorati 标签: TDD,测试驱动开发

 

分享到:
评论

相关推荐

    code kata以及测试驱动开发TDD介绍实用PPT课件.pptx

    "Code Kata 和测试驱动开发(TDD)介绍实用 PPT课件" 本课程主要介绍了 Code Kata 和测试驱动开发(TDD)的概念和实践方法,并对软件设计的基本原则进行了详细的讲解。课程共计 13 页,涵盖了软件设计的九个原则,...

    测试驱动开发(TDD)入门讲解及代码实例

    测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个...

    TDD测试驱动开发.pptx

    "TDD测试驱动开发.pptx" TDD 测试驱动开发是一种软件开发方法,它强调通过编写自动化测试来驱动整个开发过程。TDD 是敏捷开发中的一个核心实践和技术,也是一种设计方法论。其主要包括两方面:测试先行和代码重构。...

    测试驱动开发TDD培训讲义

    测试驱动开发(Test Driven Development,简称TDD)是一种软件开发方法,强调在编写实际的生产代码之前,先编写能够失败的单元测试。TDD的核心理念是“先测试,后编码”,通过测试来驱动设计,确保软件的质量和可...

    测试驱动开发(TDD)深入浅出

    测试驱动开发 TDD ,将读者带入XP极限编程的神奇世界!

    测试驱动开发TDD(1-3)

    总结来说,测试驱动开发TDD是一种以测试为指导的开发模式,它通过编写测试来驱动功能代码的实现,强调代码的可测试性、可读性和可维护性。在实际应用中,TDD能够帮助开发者发现设计上的问题,提前预防错误,并提高...

    TDD 测试驱动开发 文档 详细

    测试驱动开发(Test-Driven Development, 简称TDD)是一种软件开发实践,强调在编写实际代码之前先编写测试用例。这种方法的核心理念是通过编写能够失败的测试来定义需求,然后编写足够的代码使测试通过,最后重构...

    TDD测试驱动开发

    文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在实际项目中应用...

    测试驱动开发(TDD)

    测试驱动开发(TDD)是一种先进的软件开发方法,它的核心理念是“先写测试,后写代码”。在TDD的流程中,开发人员首先编写测试用例,这些测试用例定义了所需功能的行为边界和预期结果。然后,他们会运行这些测试,...

    测试驱动开发的3项修炼:走出TDD丛林

    测试驱动开发(TDD)是一种敏捷软件开发技术,它要求开发者在编写功能代码之前先编写测试代码。这种方法提倡先写失败的单元测试,然后编写刚好足够使测试通过的代码,最后通过重构来提高代码的质量。王晓毅所著的...

    9、测试驱动开发(TDD)介绍1

    测试驱动开发(TDD)介绍 测试驱动开发(TDD)是一种开发流程,旨在通过编写测试代码来驱动开发过程。这种开发方法可以保证项目的健壮性,尽可能地排除未知的bug,并提高代码的可读性、可维护性和可扩展性。 TDD的...

    测试驱动编程 TDD 实例

    测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,它的核心思想是“先写测试,再写代码”。TDD强调在编写实际功能代码之前,先编写能够失败的单元测试,确保测试覆盖了预期的功能需求。这种...

    Visual Studio 2010 TDD 测试驱动开发 实战 视频及源码

    教程主题:Visual Studio 2010 TDD 测试驱动开发 实战 教程录制:柳永法 web:http://www.yongfa365.com/ 本教程旨在以最简单的hello world方式像您展示 Visual Studio 2010强大的TDD,推荐任何没接触过VS2010及TDD...

    测试驱动开发的艺术 epub电子书

    极限编程反其道而行之,主张采用测试驱动开发(TDD)的方法,即通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD通过不断地测试推动代码的开发,既简化了代码,又保证了软件质量。本书采用“手把手”...

    测试驱动开发.pdf测试驱动开发.pdf

    测试驱动开发(Test-Driven Development,简称TDD)是一种敏捷软件开发的技术,以测试作为开发过程的中心环节。它倡导在编写产品代码之前先编写测试代码,确保产品代码能够通过这些测试。这种方法与传统的开发方式...

    C-C++项目的测试驱动开发(TDD):从单元测试到集成测试.md

    在C/C++项目中应用测试驱动开发(TDD)的方法,从单元测试到集成测试,详尽介绍了测试的基础、框架选择、实际应用及最佳实践。文章首先阐述了TDD的核心理念及其优势,包括提升代码质量、减少错误和改进设计等。接着...

    code kata以及测试驱动开发TDD介绍实用PPT学习教案.pptx

    这份PPT教程主要介绍了两种软件开发实践:Code Kata和测试驱动开发(Test-Driven Development, TDD)。Code Kata是一种编程练习,旨在通过重复练习来提高技能和熟练度,类似于武术中的练习动作。而TDD是一种软件开发...

Global site tag (gtag.js) - Google Analytics