Я тоже сомневаюсь в том, как массы межплетений поддерживают разработку, основанную на тестах, на высоком уровне.Хотя это часто хорошая идея, я иногда думаю, что это мешает моему рабочему процессу, потому что портирование потоковых данных из сокета иногда может быть менее эффективным, чем доверие к тому, что мой последовательный порт действительно работает.Тем не менее, когда вы хотите выполнить тест-драйв, а не «тест-обеспечение» (написание модульных тестов впоследствии для предотвращения регрессии в рабочем коде), вот как это выглядит.
По сути, вот идея:
Написание sqrt
Сначала, когда вы осознаете необходимость в новой функции или функции вашего программного обеспечения, вы придумаете план.
" My,Я полагаю, что мне понадобится функция, которая принимает число, находит квадратный корень, а затем возвращает это"
Теперь в TDD вместо простого написания кода и проверки выхода чиселверно ... TDD'er говорит:
" Я напишу функцию, которая вызывает мою несуществующую функцию и сравнивает результаты с теми, что у меня в голове "
Итак, он пишет:
void testSqrt () {
if (sqrt(9.0) == 3.0) {
printf("ALL IS FINE AND DANDY HERE");
}
else {
printf("THE SYSTEM IS DOWN! THE SYSTEM IS DOWN!"); /* untz untz untz utnz */
}
}
Теперь его несуществующий sqrt
имеет цель в жизни ... убедиться, что он всегда возвращает 3 при кормлении 9!Идея состоит в том, что независимо от того, пишет ли он
float sqrt(float n) {
long i; float x, y;
const float f = 1.5;
x = n/2.0;
y = n;
i = *(long *)&y;
i = 0x5f3759df-(i >> 1);
y = *(float *) &i;
y = y*(f-(x*y*y));
y = y*(f-(x*y*y));
return n * y;
}
или
float sqrt(float n) {
float n_t = n/2.0;
int i = *(int*)&n;
i = 0x5f375a86 - (i>>1);
n = *(float*)&i;
n = n*(1.5f-n_t*n*n);
return n;
}
, он всегда может быть уверен, что 3 - это действительно 3, и он не съел коричневую кислоту.Я надеюсь, что это хорошее обобщение процесса мышления.