引言
今天我们来做一个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/ (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|