『飞秋』测试驱动开发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類和測試類的源碼。
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/
總結
以上是生活随笔為你收集整理的『飞秋』测试驱动开发TDD系列(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习模型
- 下一篇: 有监督回归:最小二乘学习法