2013-10-10 4 views
2

Мой начальник на работе решил, что было бы неплохо написать модульные тесты для Java-программы, над которой я работал некоторое время. Программа - ваш довольно типичный беспорядок, но он не огромен. Я никогда не использовал или не писал никаких модульных тестов раньше, и из всего, что я читал по этому предмету, ранее существовавший проект - не лучшее место для начала. У меня действительно нет выбора, поэтому у меня есть некоторые вопросы.С чего начать писать модульные тесты

Мой главный вопрос: я много читал о том, что должны делать модульные тесты, каковы их масштабы, как написать производственный код в процессе TDD и т. Д. Мне еще нужно найти кого-либо, кто рассказывает о том, куда должен идти код. Я пишу свои тесты в самих классах производственного кода? Я помещаю их все в отдельный файл .java (или файлы)? Я помещаю их в свой собственный каталог в проекте? Если я использую один из последних вариантов, как мне получить доступ к частным объектам и методам, чтобы их проверить? Я чувствую, что это должен быть довольно очевидный вопрос, но я просто не знаю.

И вторичный вопрос: я видел много убедительных аргументов в пользу использования TDD, и я хотел бы попробовать его в моих личных проектах. Какой бы ответ на мой первый вопрос не был прав для запуска совершенно новых проектов? Или я буду выполнять отдельные тесты по-разному для ранее существовавших проектов, а не для новых?

+0

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

+0

У вас проблемы, разделение тестов - тривиальная проблема. Основная проблема заключается в том, что код не будет записан для тестирования, и для его проверки вам придется изменить его, и у вас нет модульных тестов, чтобы доказать, что изменения t = вы делаете для проверки, что они не сломались Это. Если он маленький, обработайте свой текущий код как Proof Of Concept, начните снова и сделайте это с помощью TDD, то есть правильно. –

+0

Все в порядке - отлично, даже - чтобы добавить тесты к уже существующим проектам. Это может показаться немного более трудным, потому что вам придется сделать начальный толчок, а не наращивать его постепенно. Вероятно, вы обнаружите, что в этом процессе вам придется реорганизовывать классы, чтобы сделать их более компактными и модульными, что даже может сделать код менее беспорядочным. – yshavit

ответ

3

Тесты не входят в производственный код. Вы можете поместить их в отдельный подкаталог. Если вы знаете о Maven, этот проект предусматривает стандартную структуру каталогов, где все происходит, поэтому ваш производственный код находится под src/main/java, ваши файлы свойств идут в src/main/resources, а тесты проходят под src/test/java и файлы, используемые java-кодом, идут под src/test/resources. Maven гарантирует, что ничто в src/test не попадет в артефакт, который он создает. (Домашние сборки, использующие муравьи, часто имеют проблему с этим, потому что вы должны действительно думать о том, что происходит, и прилагать усилия, чтобы держать тесты и код раздельными, или все сбрасывается вместе.)

Даже если вы можете 't использовать maven, стоит скопировать структуру каталогов только для того, чтобы следовать общей согласованной модели.

Вы должны быть способны проверить свои объекты, создав их в своих тестах и ​​называя их методы. Если вы написали много кода без тестов, вы, возможно, написали его так, как это трудно проверить, например, с одиночными. Возможно, вам придется переработать часть вашего существующего кода, чтобы сделать его более легко проверяемым.

+0

Я забыл слово в своем вопросе. Как мне получить доступ к классам и методам _private_? Мне также интересно: это общее соглашение одинаково для других языков (у меня есть частный проект, написанный на C#)? – DementedDr

+0

@DementedDr: короткий ответ: нет. на самом деле тесты, которые непосредственно получают доступ к данным о подобной реализации, могут быть проблемой, потому что, если ваша реализация меняется, вам приходится многократно перерабатывать свои тесты. одна из самых сложных вещей о написании тестов - это выяснить, как сделать их достаточно конкретными, чтобы быть полезными, сохраняя при этом их поддерживаемость. в то время как вещи, частные для реализации, которые достаточно сложны, чтобы стоить тестирование, могут быть реорганизованы в отдельный класс и выполняться отдельно. C# должен быть похож в принципе, хотя структуры каталогов могут отличаться. –

2

Я бы начал с ваших ошибок. Когда вы придете, чтобы исправить ошибку, напишите тест, который показывает ошибку. Когда вы исправляете ошибку, ваш тест должен пройти. Btw ожидает, что половина ошибок будет в ваших тестах.

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

0

Если вы никогда раньше не использовали TDD, вы найдете этот учебник очень полезно:

Junit Tutorial

0

Это никогда не слишком поздно, чтобы начать тестирование проекта, вы не должны беспокоиться об этом.

Вам необходимо изучить TestNG или JUnit 4 для java.

Вы должны создать отдельные java-файлы для своих тестов в отдельном каталоге. Имя тестового класса должно заканчиваться тестом, например: Для основного кода MyClass.java вы пишете тестовый класс MyClassTest.java.

Для других частей вас вопрос, пожалуйста, посетите: What is unit testing and how do you do it?

0

Путь добавить тесты к существующему унаследованного кода без каких-либо тестов, чтобы добавить их к какой-либо части, которые вы изменяете.

Даже если вы решите, что программа не может продолжаться без хорошего тестового покрытия, вы будете делать что-то вроде этого, поскольку оно идет от 0% покрытия до гораздо более высокой цифры. Просто помните, что система с 1 тестом имеет больше тестов, которые система с нулевыми тестами!

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

Хороший способ обойти это использовать издевается для имитации зависимостей частей, которые трудно разъединить

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