Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Тестовые утверждение против утверждения
В моем самом C++ проекте я активно использовал оператор ASSERTION следующим образом:
int doWonderfulThings(const int* fantasticData)
{
ASSERT(fantasticData);
if(!fantasticData)
return -1;
// ,,,
return WOW_VALUE;
}
Но сообщество TDD, похоже, любит делать что-то подобное:
int doMoreWonderfulThings(const int* fantasticData)
{
if(!fantasticData)
return ERROR_VALUE;
// ...
return AHA_VALUE;
}
TEST(TDD_Enjoy)
{
ASSERT_EQ(ERROR_VALUE, doMoreWonderfulThings(0L));
ASSERT_EQ(AHA_VALUE, doMoreWonderfulThings("Foo"));
}
Просто с моим опытом первые подходы позволили мне удалить так много тонких ошибок. Но подходы TDD-это очень умная идея для обработки устаревших кодов.
"Google"-они сравнивают "FIRST METHOD" с "ходить по берегу со спасательным жилетом, плавать по океану без всякого безопасного охранника".
Какой из них лучше? Какой из них делает программное обеспечение надежным?
По моему (ограниченному) опыту, первый вариант довольно безопасен. В тестовом случае вы проверяете только предопределенные входные данные и сравниваете результат, это хорошо работает до тех пор, пока каждый возможный крайний случай был проверен. Первый вариант просто проверяет все входные данные и таким образом проверяет значения 'live', он очень быстро отфильтровывает ошибки, однако он поставляется со штрафом за производительность.
В Code Complete Steve McConnell учит нас, что первый метод может быть успешно использован для фильтрации ошибок в отладочной сборке. В сборке выпуска вы можете отфильтровать все утверждения (например, с флагом компилятора), чтобы получить дополнительную производительность.
На мой взгляд лучше всего использовать оба метода:
Метод 1 для перехвата незаконных значений
int doWonderfulThings(const int* fantasticData)
{
ASSERT(fantasticData);
ASSERTNOTEQUAL(0, fantasticData)
return WOW_VALUE / fantasticData;
}
и Метод 2 для проверки крайних случаев алгоритма.
int doMoreWonderfulThings(const int fantasticNumber)
{
int count = 100;
for(int i = 0; i < fantasticNumber; ++i) {
count += 10 * fantasticNumber;
}
return count;
}
TEST(TDD_Enjoy)
{
// Test lower edge
ASSERT_EQ(0, doMoreWonderfulThings(-1));
ASSERT_EQ(0, doMoreWonderfulThings(0));
ASSERT_EQ(110, doMoreWonderfulThings(1));
//Test some random values
ASSERT_EQ(350, doMoreWonderfulThings(5));
ASSERT_EQ(2350, doMoreWonderfulThings(15));
ASSERT_EQ(225100, doMoreWonderfulThings(150));
}
Оба механизма имеют ценность. Любой приличный тестовый фреймворк все равно поймает стандартный assert(), поэтому тестовый запуск, который вызывает сбой assert, приведет к неудачному тесту.
Обычно у меня есть ряд утверждений в начале каждого метода c++ с комментарием "/ / предварительные условия"; это просто проверка на вменяемость состояния, которое я ожидаю от объекта при вызове метода. Они прекрасно вписываются в любой фреймворк TDD, потому что они не только работают во время выполнения, когда вы тестируете функциональность, но и работают во время тестирования.
В C++ я предпочитаю Метод 2 при использовании большинства платформ тестирования. Обычно это облегчает понимание отчетов о неудачах. Это бесценно, когда тест проходит от нескольких месяцев до нескольких лет после написания теста.
Моя причина заключается в том, что большинство платформ тестирования C++ будут печатать файл и номер строки, где произошло утверждение, без какой-либо информации о стеке trace. Поэтому большую часть времени вы будете получать номер строки отчета внутри функции или метода, а не внутри тестового набора.
Даже если утверждение перехвачено и повторно утверждено от вызывающего объекта, строка отчета будет иметь оператор catch и не может быть где-либо близко к строке тестового случая, которая вызвала метод или функцию, которая утверждала. Это может быть действительно раздражающим, когда функция, которая утверждала, возможно, была использована несколько раз в тестовом случае.
Но есть и исключения. Например, у тестовой платформы Google есть оператор scoped trace, который будет печататься как часть trace, если возникнет исключение. Таким образом, вы можете обернуть вызов обобщенной тестовой функции с областью видимости trace и легко сказать, в пределах одной или двух строк, какая строка в точном тестовом случае не удалась.