Как лучше всего протестировать код Java? - PullRequest
7 голосов
/ 16 июля 2009

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

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

Ответы [ 6 ]

6 голосов
/ 16 июля 2009

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

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

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

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

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

РЕДАКТИРОВАТЬ: Кроме того, если у вас еще нет модульных тестов, проверьте Эффективная работа с устаревшим кодом ; это необходимо для тестирования кода, который плохо настроен для тестирования.

3 голосов
/ 16 июля 2009

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

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

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

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

3 голосов
/ 16 июля 2009

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

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

2 голосов
/ 16 июля 2009

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

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

1 голос
/ 16 июля 2009

Вы можете посмотреть этот список: Инструменты для регрессионного тестирования / автоматизации тестирования Java-приложения, ориентированного на базу данных? для получения списка интересных инструментов.

Поскольку вы, похоже, уже широко используете Junit, это означает, что вы уже "заражены тестом", и это хороший момент ...

По моему личному опыту, самое сложное в управлении - это данные. Я имею в виду очень острый контроль данных, которые запускаются в тестах.

0 голосов
/ 17 июля 2009

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

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

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

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

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

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...