Тестирование почтового сервера в тестах clojure

Мне нужно протестировать наш почтовый сервер в проекте clojure. Для этого я подумал, что открою макет сервера и отправлю электронные письма, используя этот макет сервера, и проверю, отправлены ли они. Для этого я нашел, например, этот сервер.

Чтобы иметь возможность выполнять

lein test

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

Мои подходы, которые я думал, следующие:

1 — я пишу bash-скрипт, который запускает (макет) почтовый сервер, запускает lein test, а затем выключает сервер. (Здесь я теряю простоту выполнения теста Лейна в среде IDE)

2- Я мог бы проверить, запущен ли сервер, и запустить его, если нет. Однако после завершения теста сервер все еще будет работать, что нежелательно.

Как правильно решить эту проблему?

Могу ли я заказать тесты в clojure таким образом, чтобы последний тестовый файл отключал почтовый сервер?


person M.C.    schedule 02.09.2018    source источник
comment
Все ли тесты находятся в одном пространстве имен? Какую тестовую среду вы используете?   -  person Lee    schedule 02.09.2018
comment
Они написаны примерно в 30 различных пространствах имен. clojure.test — это фреймворк, который мы используем.   -  person M.C.    schedule 02.09.2018


Ответы (1)


Одним из решений является использование библиотеки Java GreenMail. Это позволяет вам запускать почтовый сервер SMPT в вашей JVM, что упрощает запуск, остановку и проверку.

Вот несколько фрагментов моего тестирования с помощью GreenMail. Сначала вы создаете почтовый сервер:

(def mail-setup (ServerSetup. ServerSetup/PORT_SMTP nil ServerSetup/PROTOCOL_SMTP))
(def green-mail (GreenMail. mail-setup))
(.start green-mail)
; Now the server listens on localhosts SMPT port for emails. Run your test code
; Run the code under test. Then you can receive the emails
(doseq [m (.getReceivedMessages green-mail)]
   ; Verify the emails etc
   (println "Subject: " (.getSubject m)
               " TO: " (str/join "," (.getRecipients m Message$RecipientType/TO)))
 )
; When done
(.stop green-mail)

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

Ознакомьтесь с документацией GreMail для получения более подробной информации. Он поддерживает множество сценариев.

person Gamlor    schedule 03.09.2018
comment
Спасибо, это намного чище, и теперь мы будем использовать его в качестве приспособления перед тестами, использующими почтовый клиент. - person M.C.; 04.09.2018