2009-07-16 3 views
7

Я работаю над сравнительно большой системой самостоятельно, и это мой первый опыт работы с большой системой (имея дело с 200 + каналами информации одновременно). Я знаю, как использовать Junit для тестирования каждого метода и как проверить граничные условия. Но, тем не менее, для системного теста мне нужно протестировать все интерфейсы и, возможно, так сделать некоторые стресс-тесты (возможно, есть другие вещи, но я не знаю, что это такое). Я совершенно новичок в мире тестирования, и, пожалуйста, дайте мне несколько советов или укажите мне некоторую информацию о том, как хороший тестер кода будет выполнять системное тестирование.Как лучше всего проверить Java-код?

PS: 2 конкретных вопроса у меня есть: как проверить частные функции? как тестировать интерфейсы и избегать побочных эффектов?

ответ

6

Вот два веб-сайтов, которые могут помочь:

Первый список open source Java tools. Многие из этих инструментов являются дополнениями к JUnit, которые позволяют либо более простое тестирование, либо тестирование на более высоком уровне интеграции.

В зависимости от вашей системы иногда JUnit будет работать для системных тестов, но структура теста может быть разной.

Что касается частных методов, отметьте this question (и вопрос, на который он ссылается).

Вы не можете протестировать интерфейсы (так как нет никакого поведения), но вы можете создать абстрактные базовые тестовые классы для тестирования того, что реализации интерфейса следуют его контракту.

EDIT: Кроме того, если у вас еще нет модульных тестов, проверьте Working Effectivly with Legacy Code; это необходимо для тестирования кода, который не настроен для тестирования.

+0

+1 для справочника по перьям. –

+0

Я заказал книгу только сейчас. Благодарю. – Lily

3

Mocking - хороший способ смоделировать системные тесты при единичном тестировании; заменяя (издеваясь) ресурсы, от которых зависит другой компонент, вы можете выполнить модульное тестирование в «системной» среде без необходимости создания всей системы для ее создания.

Что касается ваших конкретных вопросов: как правило, вы не должны использовать модульное тестирование для проверки частных функций; если они частные, то они относятся к частным. Если вам нужно что-то протестировать, протестируйте общедоступный метод, который использует этот частный метод для чего-то. Избежать побочных эффектов, которые могут быть потенциально проблематичными, лучше всего сделать, используя либо полную тестовую среду (которую можно легко стереть обратно в «девственное» состояние), либо используя насмешку, как описано выше. И тестирование интерфейсов осуществляется путем тестирования методов интерфейса.

2

Частные функции будут проверяться при выполнении публичных функций, которые их называют. Тестирование публичной функции касается только того, что возвращаемый результат верен.

При обращении к API (к другим пакетам или URL-адресам или даже к файлу/сети/базе данных) вы должны их высмеять. Хороший единичный тест должен выполняться через несколько миллисекунд не в секундах. Смысл - единственный способ сделать это. Это означает, что ошибки между пакетами могут быть решены намного проще, чем логические ошибки на функциональном уровне. Для Java easymock - очень хорошая насмешливая структура.

3

Во-первых, если у вас уже есть большая система, которая не имеет каких-либо модульных тестов, и вы планируете добавить ее, то позвольте мне предложить общий совет.

От поддержания системы и работы с ней вы, вероятно, уже знаете области системы, которые имеют тенденцию быть самыми простыми, которые часто меняются и которые не очень сильно меняются. Если вы этого не сделаете, вы всегда можете просмотреть журналы управления версиями (вы используете источник управления, верно?), Чтобы узнать, где сосредоточена большая часть исправлений и изменений ошибок. Сосредоточьте свои усилия по тестированию на этих классах и методах. Существует общее правило, называемое правилом 80/20, которое применимо к целому ряду вещей, являющихся одним из них.

В нем говорится, что примерно в среднем вы должны будете покрыть 80 процентов случаев оскорбления, выполнив всего 20% работы. То есть, написав тесты всего на 20% кода, вы, вероятно, поймаете 80% ошибок и регрессий. Это связано с тем, что большая часть хрупкого кода, обычно измененного кода и наихудшего кода, составляет всего 20% от кодовой базы. На самом деле это может быть еще меньше.

Вы должны использовать junit для этого, и вы должны использовать что-то вроде JMock или какую-то другую насмешливую библиотеку, чтобы убедиться, что вы тестируете изолированно. Для тестирования системы/тестирования интеграции, то есть, тестируя вещи, пока они работают вместе, я могу порекомендовать FitNesse. У меня был хороший опыт с ним в прошлом.Это позволяет вам написать свой тест в веб-браузере, используя простые табличные макеты, где вы можете легко определить свои входы и ожидаемые результаты. Все, что вам нужно сделать, это написать небольшой класс поддержки, называемый Fixture, который обрабатывает создание компонентов.

1

Вы можете взглянуть на этот список: Tools for regression testing/test automation of database centric java application? для получения списка интересных инструментов.

Как вы, кажется, уже используют JUnit широко это означает, что вы уже «тест инфицированных», что является хорошей точкой ...

В моем личном опыте, самое трудное для управления представляют собой данные. Я имею в виду, очень тщательно контролируя данные agaisnt, которые тестируются.

0

Полезны списки инструментов, приведенных ранее. Из личного опыта это инструменты, которые я нахожу полезными:

Mocking - Mockito - отличная реализация и имеет умные приемы, позволяющие вам только высмеять методы, которые вам действительно интересны.

Проверка базы данных - DBunit является незаменимым для настройки тестовых данных и проверки взаимодействия с базами данных.

Стресс-тестирование - Jmeter - после того, как вы видите пройденный слегка неуклюжий gui, это очень надежный инструмент для создания сценариев и стресс-тестов.

Что касается общего подхода, попробуйте запустить тесты для обычных «счастливых путей» через ваше приложение, они могут стать основой для тестирования регрессии и тестирования производительности. Как только это будет завершено, вы можете начать смотреть на крайние случаи и сценарии ошибок.

Хотя этот уровень тестирования должен быть вторичным для хорошего модульного тестирования.

Удачи вам!

Смежные вопросы