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