Начните с заглушки функции/класса/компонента, который вы хотите разработать. Он должен компилироваться, но намеренно (пока) не делать то, что должен делать.
Например:
public int divideNumbers(int num1, int num2)
{
throw new NotImplementedException();
}
or
return -42;
Подумайте о предполагаемом поведении, рассматривая заглушку как интерфейс к черному ящику. Плевать на реализацию (пока). Подумайте о «контракте» интерфейса: X входит, Y выходит.
Определите стандартные случаи и важные случаи egde. Напишите для них тесты.
Для целочисленного деления (при условии, что мы напишем его с нуля) на самом деле нужно рассмотреть несколько случаев: с остатком и без остатка, n/1, n/0, 0/n, 0/0, отрицательные числа и т. д.
Assert.IsTrue(divideNumbers(4,4) == 1);
Assert.IsTrue(divideNumbers(4,3) == 1);
Assert.IsTrue(divideNumbers(4,2) == 2);
Assert.IsTrue(divideNumbers(4,1) == 4);
Assert.Throws<ArgumentException>(() => divideNumbers(4,0));
Assert.IsTrue(divideNumbers(0,4) == 0);
Assert.Throws<ArgumentException>(() => divideNumbers(0,0));
Assert.IsTrue(divideNumbers( 4,-2) == -2);
Assert.IsTrue(divideNumbers(-4, 2) == -2);
Assert.IsTrue(divideNumbers(-4,-2) == 2);
Assert.IsTrue(divideNumbers( 4,-3) == -1);
Assert.IsTrue(divideNumbers(-4, 3) == -1);
Assert.IsTrue(divideNumbers(-4,-3) == 1);
Скомпилируйте и запустите модульные тесты. Все ли они терпят неудачу? Если нет, то почему? Возможно, один из тестов не работает должным образом (тесты тоже могут глючить!).
Теперь приступайте к реализации до тех пор, пока ни один тест больше не будет давать сбоев.
person
Sebastian Negraszus
schedule
03.01.2013