Как да тестваме твърдения?

Използвам рамка за тестване на единици, за да тествам библиотеките си. Имам доста твърдения в библиотеката, за да се уверя, че грешките на програмиста се улавят в компилациите за отстраняване на грешки. Сега искам да съм сигурен, че тествам за всички възможни програмни грешки.

напр. в клас таблица искам да съм сигурен, че пропуските на редове и колони не са по-големи от редовете и колоните, които таблицата има. Да приемем, че забравям да тествам за cols. Бих искал моите модулни тестове да извършат тест, при който твърдението трябва да се задейства, и ако не, да провалят теста. Това възможно ли е?


person Samaursa    schedule 12.06.2011    source източник
comment
Трябва да посочите каква моделна рамка за тестване използвате, тъй като отговорът зависи от това.   -  person David Rodríguez - dribeas    schedule 13.06.2011
comment
Страхотно, -1 без обяснение :) @David: Използвам рамка за тестване CATCH. Ще се придържам към предложението на wheates и ще преобразувам твърденията в изключения само за библиотеката за модулен тест и ще тествам без хвърляне.   -  person Samaursa    schedule 13.06.2011


Отговори (3)


Тогава въпросът е дали планирате да преработите кода си, така че ако възникне това условие, да хвърлите изключение, вместо да разчитате на <cassert> функционалност, за да ви насочи към проблем? Ако е така, можете просто да проверите дали изключението е хвърлено. Ако не, тогава ще бъде по-трудно да се тества твърдение за твърдение от <cassert>. Рамките за модулен тест като CUTE имат макрос ASSERT_THROWS само за тестване на изключения. Бих проверил вашата рамка.

Също така, в магазините, в които съм работил, се е случвало да се намръщват на assert и предпочитат изключения. Извикването на abort не помага за автоматизираното тестване. Всъщност го забранява. Само моите два цента.

person wheaties    schedule 12.06.2011
comment
Компилирам без изключения, така че мога да използвам само твърдения. Ще проучвам конвертирането на assert макроси в assertions само за проекта за модулен тест - person Samaursa; 13.06.2011

Има три възможни начина:

  • преобразуване на твърдения в изключения, или

  • стартиране на всеки тест на отделна програма, чийто изходен код вие (или по-скоро тестовата рамка) проверявате, или

  • нека едно твърдение, което се задейства, да напише информация за себе си, която след това тестовата рамка може да вземе.

Доколкото знам, никоя комерсиална или широко използвана рамка за тест на единица не поддържа последните два начина. Използвал съм проверка на кода за изход на процес за хоби програмиране, но само с малка лична рамка за тестване на модули, внедрена в Python и C++ („хоби програмиране“: това означава, че нямам добри данни за това колко добре се мащабира до широкомащабно програмиране). Основният случай за тестване на изходния код на процеса е, когато кодът има статични твърдения, които искате да сте сигурни, че са задействани, когато е предвидено да бъдат.

Обобщавайки, със съществуващите тестови рамки, преобразуването в изключение е AFAIK единствената ви опция.

Наздраве & hth.

person Cheers and hth. - Alf    schedule 12.06.2011
comment
Благодаря, превръщането им в изключения е това, което ще направя (+1) - person Samaursa; 13.06.2011

Отговорът зависи от конкретната тестова рамка, която използвате, и вероятно ще бъде намерен с много малко търсене в Google.

Първото попадение за „утвърждаване на теста на boost unittest“ сочи към този въпрос в StackOverflow: Тестване за assert в рамката Boost Test

Второто попадение за „cppunit test assert“ сочи към тази страница с документация: Изготвяне на твърдения

Опитайте да потърсите в интернет вашата конкретна рамка.

person David Rodríguez - dribeas    schedule 12.06.2011
comment
Опитах се да разчитам на търсенето на SO, но предполагам, че това беше лоша идея (много пъти се въвеждат и неправилни думи за търсене) - person Samaursa; 13.06.2011