Тестирование сгенерированного Go кода без совместного размещения тестов - PullRequest
0 голосов
/ 20 марта 2020

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

Текущий макет этих файлов контролируется prototool поэтому у меня есть что-то вроде следующего:

/pkg/<other1>
/pkg/<other2>
/pkg/<name-generated>/v1/component_api.pb.go
/pkg/<name-generated>/v1/component_api.pb.gw.go
/pkg/<name-generated>/v1/component_api.pb.validate.go

*.validate.go происходит от envoyproxy / proto c -gen-validate, а *.pb.go & *.pb.gw.go - от protobuf и grp c библиотеки. other1 и other2 - это две вспомогательные библиотеки, которые мы включили вместе с сгенерированным кодом, чтобы упростить работу клиентских приложений. Серверная часть находится в отдельном репо и импортирует по мере необходимости.

Поскольку полезно иметь возможность удалить /pkg/<name> перед повторным запуском prototool, я поместил несколько тестов component_api (в основном для проверки правил проверки). генерируется автоматически) по пути:

/internal/pkg/<name>/v1/component_api_test.go

Хотя это работает для go test -v ./..., похоже, что он не работает должным образом при генерации покрытия с -coverpkg.

go test -coverpkg=./... -coverprofile=coverage/go/coverage.out -v ./...

go build <pkgname>/internal/pkg/<name>/v1: no non-test Go files in ....
<output from the tests in /internal/pkg/<name>/v1/component_api_test.go>
....
....
coverage: 10.5% of statements in ./...
ok      <pkgname>/internal/pkg/<name>/v1    0.014s  coverage: 10.5% of statements in ./...
FAIL    <pkgname>/pkg/other1 [build failed]
FAIL    <pkgname>/pkg/other2 [build failed]
?       <pkgname>/pkg/<name>/v1 [no test files]
FAIL
Coverage tests failed
Generated coverage/go/html/main.html

Причина использования -coverpkg заключается в том, что без него, кажется, нет ничего заметного, что какой-либо код в <pkgname>/pkg/<name>/v1 покрыт, и мы видим проблемы с тем, что он сообщает, что ранее не показывал реальный уровень покрытия, что решается с помощью -coverpkg:

go test -cover -coverprofile=coverage/go/coverage.out ./...
ok      <pkgname>internal/pkg/<name>/v1 0.007s  coverage: [no statements]
ok      <pkgname>/pkg/other1 0.005s coverage: 100.0% of statements
ok      <pkgname>/pkg/other2    0.177s  coverage: 100.0% of statements
?       <pkgname>/pkg/<name>/v1 [no test files]

Просмотр итогового покрытия / go / cover.out не содержит упоминания о чем-либо в <pkgname>/pkg/<name>/v1 Выполняется.

Я не привязан к текущему макету за исключением того, что <pkgname>/pkg/<name>/v1 автоматически управляется протоколом prototool, и его правила именования сгенерированных файлов. Хотелось бы убедиться, что другие наши модули могут быть экспортированы для использования в качестве вспомогательных библиотек, и я хотел бы иметь возможность добавлять тесты для <pkgname>/pkg/<name>/v1 без необходимости размещать их в том же каталоге, чтобы можно было легко удалять + воссоздавать сгенерированные файлы, в то же время получая разумные отчеты о покрытии.

Я попытался поиграться с пакетами, переданными в -coverpkg и заменив ./... в командной строке, и не смог придумать что-то такое, что работает. Возможно, я просто не знаком с правильным вызовом?

Кроме того, есть ли другой макет, который позаботится об этом для меня?

...