|
Программирование >> Разработка устойчивых систем
Теперь можно реализовать часть класса Date, достаточную для прохождения тестов, а затем последовательно расширять ее функциональность до соблюдения всех требований. Предварительное написание тестов поможет вам лучше представить граничные случаи, которые могут нарушить будущую реализацию. Итоговая версия теста для класса Date могла бы выглядеть примерно так: : C02:SimpleDateTest2.cpp {L} Date #1ncl ude <1ostream> #include Date.h using namespace std: Механизм тестирования int nPass = 0, nFail = 0: void testCbool t) { if(t) nPass++: else nFail++: } int mainO { Date mybday(1951, 10. 1): Date today: Date myevebday( 19510930 ): Тестирование операторов test(mybday < today): test(mybday <= today): test(mybday != today): test(mybday == mybday): test(mybday >= mybday): test(mybday <= mybday) test(myevebday < mybday): test(mybday > myevebday): test(mybday >= myevebday): test(mybday != myevebday): Тестирование функций test(mybday.getYear() == 1951): test(mybday.getMonthО == 10): test(mybday.getDayО ==1): test(myevebday.getVearO == 1951); test(myevebday.getMonth() == 9): test(myevebday.getDayО == 30): test(mybday.toString() == 19511001 ): test(myevebday.toString() == 19510930 ); Тестирование промежутков времени Date d2(2003. 7. 4): Date::Duration dur = duration(mybday. d2): test(dur.years == 51): test(dur.months == 9): test(dur.days == 3): Вывод результатов: cout Passed: nPass . Failed: nFail endl; } III:- Этот тест можно было бы доработать; в частности, мы не проверяем правильность работы с длинными интервалами времени. Пока остановимся на этом, чтобы Наш класс Date также поддерживает расширенную кодировку символов (эта тема будет представлена в конце следующей главы). За дополнительной информацией обращайтесь по адресу http: sourceforge.net/projects/cppunit. Основной принцип экстремального программирования. вы поняли общую идею. Полная реализация класса Date содержится в файлах Date.h и Date.срр в приложении. Система TestSuite Некоторые автоматизированные средства модульного тестирования С++ (такие как CppUnit) свободно распространяются через Интернет. Наша задача - представить читателю тестовый механизм, который был бы не только прост в использовании, но в котором также можно было бы легко разобраться и даже изменить в случае необходимости. Итак, в соответствии с принципом: Сделайте самое простое, что может работать , мы разработали систему TestSuite - пространство имен TestSuite с двумя ключевыми классами Test и Suite. Класс Test представляет собой абстрактный базовый гсттасс, на основе которого создаются тестовые объекты. Он отслеживает количество успешно пройденных и неудачных тестов, и выводит текст любого сбойного условия. Вам остается лишь переопределить функцию гип(), которая в свою очередь должна вызвать макрос test () для каждого из определяемых логических условий теста. Чтобы определить комплекс тестов для класса Date с использованием системы TestSuite, мы объявляем класс, производный от Test, как показано в следующей программе: : C02:DateTest.h #ifndef DATE TEST H Idefine DATE TEST H #include Date.h finclude ../TestSuite/Test.h class DateTest : public TestSuite::Test { Date mybday: Date today: Date myevebday: public: DateTestO : mybday(1951. 10. 1). myevebdayC 19510930 ) { } void runO { testOpsO: testFunctionsO: testDurationO: void testOpsO { test (mybday < today): test (mybday <= today): test (mybday != today): test (mybday == mybday); test (mybday >= mybday); test (mybday <= mybday): test (myevebday < mybday); test (mybday > myevebday); test (mybday >= myevebday); test (mybday != myevebday): Конкретно используется функция name() класса typeinfo (см. главу 9). Если вы работаете с компилятором Microsoft Visual С++, необходимо задать ключ компиляции /GR; в противном случае во время выполнения произойдет ошибка доступа. При этом используется преобразование в строку (препроцессорный оператор #) и стандартные макросы FILE ё LINE . Код приводится далее в этой главе. void testFunctionsO { test (mybday.getYear() == 1951): test (mybday.getMonth() == 10): test (mybday.getDayО ==1): test (myevebday.getYear() == 1951): test (myevebday.getMonth0 == 9): test (myevebday.getDayО == 30): test (mybday.toString() == 19511001 ): test (myevebday.toString() == 19510930 ): void testDurationO { Date d2(2003. 7.4); Date::Duration dur = duration(mybday. d2): test (dur.years == 51); test ( dur. months ==9): test ( dur. days ==3): #endif III:- Запуск теста сводится к простому созданию объекта DateTest и вызову его функции run(): : С02:DateTest.срр Автоматизация тестирования {L} Date ../TestSuite/Test #incl ude <iostream> #include DateTest.h using namespace std; int mainO { DateTest test: test.runO: return test.reportO: /* Вывод: Test DateTest : Passed: 21. Failed: 0 */ III:- Функция Test::report() отображает приведенную выше сводку и возвращает количество сбоев, поэтому ее результат удобно использовать в качестве возвращаемого значения функции main(). Для получения имени класса, включаемого в отчет (в нашем примере - DateTest), класс Test использует механизм RTTI (RunTime Type Identification - идентификация типов в процессе исполнения). Также имеется функция setStream() на тот случай, если вы захотите отправить результаты теста в файл вместо стандартного выходного потока (по умолчанию). Реализация класса Test будет приведена позднее в этой главе. Макрос test () извлекает текст логического условия, не прошедшего проверку, вместе с именем файла и номером строки. Если вас интересует, что происходит
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |