Существует ли многопроцессная среда модульного тестирования / аддон junit? - PullRequest
6 голосов
/ 18 августа 2010

Представьте себе два сервера (каждый в своем собственном процессе jvm) , которые обмениваются сообщениями в той или иной форме (например, простой производитель / потребитель)

Я хотел бы написать модульные тесты,проверить поведение этих двух серверов.Мои вопросы:

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

  2. Существуют ли лучшие практики для такого рода испытаний?

  3. Если не существует подхода, подобного модульному тестированию, как бы вы протестировали такие вещи во время непрерывной интеграции?

Примечание:Я не хочу использовать потоки, потому что это может изменить поведение (если вы думаете о проблемах безопасности потоков)

Ответы [ 5 ]

6 голосов
/ 18 августа 2010

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

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

Другие уже указали на тот фактчто вы обычно высмеиваете или иным образом отправляете искусственно созданные методы потребителю и тестируете то, что производитель производит независимо, на уровне «модульного тестирования».

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

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

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

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

3 голосов
/ 12 марта 2011

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

со своей страницы:

"XHarness - системная система испытаний для Apache Ant. Это позволяет разработчикам описать свои тесты продукта / системы в форма XML как часть муравья создать файл, описывающий задачи и процессы, которые составляют контрольные примеры и каково их ожидаемое поведение. Имеет мощное управление процессами возможности, , которые расширяют существующие Задачи Ant процесса (exec, Java) для разрешить асинхронное выполнение Java и нативные процессы (например, для клиент-серверные тесты), синхронизация между несколькими процессами и сложными утверждения о выходе процесса и задачи (stdout / stderr, выходной файл, связанный с таймаутами и т. д.). «

1 голос
/ 18 августа 2010

То, что вы говорите в пункте 1, не является истинным сценарием модульного тестирования.В идеальном модульном тесте вы не будете беспокоиться о том, кто создает сообщения, а кто потребляет сообщения.Один из ваших тестовых примеров будет сконцентрирован на представлении (или издевательстве) о том, что вы получили разные сообщения от действительного производителя, а ваши тестовые примеры будут проверять, как они используются правильно.То, что вы ищете, больше похоже на интеграционное тестирование.В любом случае некоторые из сделанных мной заявлений могут быть субъективными.Вы можете использовать jMock, фреймворки easymock для ваших насмешливых нужд.

1 голос
/ 18 августа 2010

Это гораздо больше, чем юнит-тестирование и прочно внутри интеграционного тестирования.

Я бы порекомендовал протестировать то, что вы можете, смоделировав свой слой связи с каждым кусочком отдельно.прошлое в таких случаях - запуск отдельного потока в тесте, который запускает Mock Receiver / Sender.В основном тесте я делаю часть Отправитель / Получатель.На практике это означает, что здесь много задержек, чтобы убедиться, что все начинается в правильном порядке, и это становится невероятно медленным, поэтому вы просто хотите сделать это, чтобы проверить, что кусочки головоломки соответствуют, и выполнить как можно меньше функционального тестирования надit.

Я проверяю желаемое поведение и прекращаю работу вспомогательного потока перед выходом из теста.

Это может проверить много.Тестирование с использованием отдельных процессов (и хостов!) - это настоящая боль.занимает вечность, и я бы ограничил это ручным тестированием.

1 голос
/ 18 августа 2010

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

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

См. Mockito , jMock , EasyMock

...