Я делаю свои первые шаги с TDD.Проблема в том, что (как, вероятно, у всех, кто начинает с TDD), я никогда не очень хорошо знаю, какие юнит-тесты нужно делать, когда я начинаю работать в своих проектах.
Давайте предположим, что я хочу написать класс Stack сследующие методы (я выбрал это, поскольку это простой пример):
Stack<T>
- Push(element : T)
- Pop() : T
- Peek() : T
- Count : int
- IsEmpty : boolean
Как бы вы подошли к этому?Я никогда не понимал, заключается ли идея в том, чтобы протестировать несколько угловых вариантов для каждого метода класса Stack или начать с нескольких «вариантов использования» с классом, таких как добавление 10 элементов и удаление их.В чем идея?Чтобы код, который использует стек, был как можно ближе к тому, что я буду использовать в моем реальном коде?Или просто сделать простые модульные тесты «добавить один элемент», где я проверяю, были ли изменены IsEmpty и Count путем добавления этого элемента?
Как мне начать с этого?
EDIT
Вот реализация моих грубых тестов:
[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);
}
Есть какие-нибудь исправления / идеи по этому поводу?Спасибо