Этот вопрос имеет несколько слоев;Я попытаюсь начать с того, чего я на самом деле пытаюсь достичь:)
Используя ginkgo
, часть моих тестов включает интеграционные тесты, которые запускают дополнительные процессы, которые создают свой собственный журнал. файлы. При сбое теста я хотел бы сбросить эти журналы на стандартный вывод. (Поскольку журналы создаются во временных каталогах, они очищаются после завершения тестов и поэтому недоступны для проверки).
Я думал написать новый ginkgo.Reporter
и подключиться к функции интерфейса SpecDidComplete
чтобы достичь этого.
Первая проблема заключалась в том, как передать местоположение файла журнала в Reporter
. (Журнал создается в вызове BeforeEach
). Кажется, не существует чистого пути, поэтому, поскольку SpecSummary
, переданный в функцию SpecDidComplete
, имеет поле CapturedOutput
, я подумал, что могу просто записать местоположение журнала в stdout
и затем обработать CapturedOutputчтобы очистить данные, которые я хотел.
К сожалению, однако, это поле всегда пусто. Почему это так?
Вот основной код моей установки:
Подключение Reporter в комплекте:
RunSpecsWithDefaultAndCustomReporters(t, "Integration Suite", []Reporter{NewGeodeLogReporter()})
Reporter только сейчас делает это:
func (this *GeodeLogReporter) SpecDidComplete(specSummary *types.SpecSummary) {
if specSummary.HasFailureState() {
fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
fmt.Println(specSummary.CapturedOutput)
fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
}
}
И в моих тестах все, что я сейчас делаю, это:
BeforeEach(func() {
fmt.Printf("{\"locator-log-path\": \"%s\"}\n", path.Join(cluster.ClusterConfig.ClusterDir, cluster.ClusterConfig.LocatorName))
fmt.Printf("{\"server-log-path\": \"%s\"}\n", path.Join(cluster.ClusterConfig.ClusterDir, cluster.ClusterConfig.ServerName))
err := cluster.Gfsh("create region --name=FOO --type=REPLICATE")
Expect(err).To(BeNil())
})
Describe("Fail", func() {
FIt("Always fails", func() {
fmt.Fprintln(os.Stdout, "--->>> Output from test on stdout")
fmt.Fprintln(os.Stderr, "--->>> Output from test on stderr")
Expect(true).To(BeFalse())
})
})