使用测试驱动开发实现堆栈

dev*_*ium 14 c# java tdd unit-testing

我正在用TDD做我的第一步.问题是(可能每个人都以TDD开头),当我开始在我的项目中工作时,我从来不知道要做什么样的单元测试.

让我们假设我想用以下方法编写一个Stack类(我选择它,因为它是一个简单的例子):

Stack<T>
 - Push(element : T)
 - Pop() : T
 - Peek() : T
 - Count : int
 - IsEmpty : boolean
Run Code Online (Sandbox Code Playgroud)

你怎么会这样?我从来没有理解这个想法是为Stack类的每个方法测试一些极端情况,还是从类中做一些"用例"开始,比如添加10个元素并删除它们.这个想法是什么?要使使用Stack的代码尽可能接近我在实际代码中使用的代码?或者只是简单地"添加一个元素"单元测试,我测试IsEmpty和Count是否通过添加该元素进行了测试?

我该如何开始呢?

编辑

这是我粗略测试的实现:

    [TestMethod]
    public void PushTests() {
        StackZ<string> stackz = new StackZ<string>();

        for (int i = 0; i < 5; ++i) {
            int oldSize = stackz.Size;
            stackz.Push(i.ToString());
            int newSize = stackz.Size;
            Assert.AreEqual(oldSize + 1, newSize);
            Assert.IsFalse(stackz.IsEmpty);
        }
    }

    [TestMethod, ExpectedException(typeof(InvalidOperationException))]
    public void PeekTestsWhenEmpty() {
        StackZ<double> stackz = new StackZ<double>();
        stackz.Peek();
    }

    [TestMethod]
    public void PeekTestsWhenNotEmpty() {
        StackZ<int> stackz = new StackZ<int>();
        stackz.Push(5);

        int firstPeekValue = stackz.Peek();

        for (int i = 0; i < 5; ++i) {
            Assert.AreEqual(stackz.Peek(), firstPeekValue);
        }
    }

    [TestMethod, ExpectedException(typeof(InvalidOperationException))]
    public void PopTestsWhenEmpty() {
        StackZ<float> stackz = new StackZ<float>();
        stackz.Pop();
    }

    [TestMethod]
    public void PopTestsWhenNotEmpty() {
        StackZ<int> stackz = new StackZ<int>();

        for (int i = 0; i < 5; ++i) {
            stackz.Push(i);
        }

        for (int i = 4; i >= 0; ++i) {
            int oldSize = stackz.Size;
            int popValue = stackz.Pop();
            Assert.AreEqual(popValue, i);
            int newSize = stackz.Size;
            Assert.AreEqual(oldSize, newSize + 1);
        }

        Assert.IsTrue(stackz.IsEmpty);
    }
Run Code Online (Sandbox Code Playgroud)

关于它的任何更正/想法?谢谢

Ste*_*hen 8

首先测试API的基本原理.

测试零元素.

  • 测试它是空的.
  • 数量为零.
  • Pop失败了.

测试一个元素:

  • 呼叫推送.
  • 测试它不是空的.
  • 测试计数为1.
  • 测试Pop返回元素.
  • 测试它现在是空的.
  • 测试计数现在为0.

测试> 1个元素:

  • 现在推2和测试计数是两个.
  • 弹出2并确保它们以LIFO顺序出现.
  • 检查空虚和重要性.

这些中的每一个都至少是一个测试用例.

例如(在Google的c ++单元测试框架中大致概述):

TEST(StackTest, TestEmpty) {
  Stack s;
  EXPECT_TRUE(s.empty());
  s.push(1);
  EXPECT_FALSE(s.empty());
  s.pop();
  EXPECT_TRUE(s.empty());
}

TEST(StackTest, TestCount) {
  Stack s;
  EXPECT_EQ(0, s.count());
  s.push(1);
  EXPECT_EQ(1, s.count());
  s.push(2);
  EXPECT_EQ(2, s.count());
  s.pop();
  EXPECT_EQ(1, s.count());
  s.pop();
  EXPECT_EQ(0, s.count());
}

TEST(StackTest, TestOneElement) {
  Stack s;
  s.push(1);
  EXPECT_EQ(1, s.pop());
}

TEST(StackTest, TestTwoElementsAreLifo) {
  Stack s;
  s.push(1);
  s.push(2);
  EXPECT_EQ(2, s.pop());
  EXPECT_EQ(1, s.pop());
}

TEST(StackTest, TestEmptyPop) {
  Stack s;
  EXPECT_EQ(NULL, s.pop());
}


TEST(StackTest, TestEmptyOnEmptyPop) {
 Stack s;
  EXPECT_TRUE(s.empty());
  s.pop();
  EXPECT_TRUE(s.empty());
}

TEST(StackTest, TestCountOnEmptyPop) {
  Stack s;
  EXPECT_EQ(0, s.count());
  s.pop();
  EXPECT_EQ(0, s.count());
}
Run Code Online (Sandbox Code Playgroud)