2015-02-05 3 views
9

Я пытаюсь использовать go test -cover для измерения тестового покрытия службы, которую я создаю. Это REST API, и я тестирую его, откручивая его, выполняя тестовые HTTP-запросы и просматривая ответы HTTP. Эти тесты не являются частью пакетов услуг, а go tool cover возвращает 0% тестового покрытия. Есть ли способ получить фактическое покрытие теста? Я бы ожидал, что сценарий с наилучшим сценарием на данной конечной точке будет охватывать не менее 30-50% кода для конкретного обработчика конечных точек и путем добавления дополнительных тестов для общей ошибки для дальнейшего улучшения.Как измерить покрытие интеграции интеграции Golang?

ответ

7

Я был указал на директиву -coverpkg, которая делает то, что мне нужно - измерять s охват тестирования в определенном пакете, даже если тесты, которые используют этот пакет, а не его часть. Например:

$ go test -cover -coverpkg mypackage ./src/api/... 
ok  /api 0.190s coverage: 50.8% of statements in mypackage 
ok  /api/mypackage 0.022s coverage: 0.7% of statements in mypackage 

по сравнению с

$ go test -cover ./src/api/... 
ok  /api 0.191s coverage: 71.0% of statements 
ok  /api/mypackage 0.023s coverage: 0.7% of statements 

В приведенном выше примере, у меня есть тесты в main_test.go которых находится в package main, что использует package mypackage. Меня больше всего интересует охват package mypackage, так как он содержит 99% бизнес-логики в проекте.

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

+0

Отлично! Я просто связываю этот [соответствующий поток golang-орехов] (https://groups.google.com/forum/#!topic/golang-nuts/fnDBPPUDdQ4). – Simon

+0

Спасибо, Саймон. Это действительно то, что я искал! –

1

Насколько я знаю, если вы хотите покрытия, вам нужно запустить go test -cover.

Однако достаточно просто добавить флаг, который вы можете передать, в который будут включены эти дополнительные тесты, чтобы вы могли сделать их частью своего набора тестов, но не запускаете их нормально.

Так что добавьте флаг командной строки в вашем whatever_test.go

var integrationTest = flag.Bool("integration-test", false, "Run the integration tests") 

Затем в каждом тесте сделать что-то вроде этого

func TestSomething(t *testing.T){ 
    if !*integrationTest { 
     t.Skip("Not running integration test") 
    } 
    // Do some integration testing 
} 

Затем запустить интеграционные тесты

go run -cover -integration-test 
+0

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

+0

@antonevangelatov Я понимаю, что вы имеете в виду! Я оставлю этот ответ на всякий случай, если кто-нибудь найдет его полезным, и я замечаю '-coverpkg' в вашем ответе, спасибо! –

Смежные вопросы