Я учусь идти и работаю над простым сервисом, который получает некоторые данные из очереди и помещает их в базу данных. Он также запускает веб-сервер, чтобы разрешить очистку данных. Сейчас у меня есть два файла go (для краткости опущен текст):
func main() {
parseConfig()
s := &Service{ServiceConfig: config}
err := s.Run()
if err != nil {
panic(err)
}
}
А потом определение сервиса (опять же опущены некоторые кусочки для краткости):
func (s *Service) Run() error {
if err := s.validate(); err != nil {
return err
}
if err := s.initDB(); err != nil {
return err
}
defer s.db.Close()
// Same pattern with health check library (init, start, close)
// Same pattern starting queue consumer (init, start, close)
s.mux = http.NewServeMux()
s.registerHandlers(s.mux)
http.ListenAndServe(":8080", s.mux)
return nil
}
И структура
type Service struct {
Config // Hold db connection info
db *sql.DB
hc *health
}
Я могу нормально тестировать отдельные части (например, initDB
или validate
), но мне неясно, как можно протестировать функцию Run
, потому что http.ListenAndServe блокирует. Я в конечном итоге тайм-аут. Раньше я использовал httpTest и делал тестовый сервер, но это было тогда, когда main
запускал сервер (поначалу приложение было более простым).
Некоторые вещи, которые я бы протестировал:
То, что я могу попасть в конечную точку метрики после запуска.
Что я могу достичь конечной точки здоровья после того, как начал.
То, что я могу отправить сообщение в очередь, и оно получено после запуска.
Это Run
на самом деле начинается без паники.
Некоторые примечания: я использую докер для раскрутки очереди и базы данных. Смысл тестирования функции Run
заключается в том, чтобы убедиться, что начальная загрузка работает и приложение может успешно работать. В конце концов я захочу протолкнуть данные через очередь и утверждать, что они были обработаны правильно.
Вопрос: Как мне протестировать это или реорганизовать его так, чтобы его было легче тестировать сквозным?