#unit-testing #testing #go
#модульное тестирование #тестирование #Вперед
Вопрос:
Я пытался использовать gocheck для тестирования моего кода go. Я руководствовался следующим примером (аналогичным тому, который предоставлен их веб-сайтом):
package hello_test
import (
"testing"
gocheck "gopkg.in/check.v1"
)
// Hook up gocheck into the "go test" runner.
func Test(t *testing.T) {
gocheck.TestingT(t)
}
type MySuite struct{} //<==== Does the struct have to be named that way, what if we have multiple of these and register them, is it a problem?
var _ = gocheck.Suite(amp;MySuite{}) // <==== What does this line do?
func (s *MySuite) TestHelloWorld(c *gocheck.C) {
c.Assert(42, gocheck.Equals, "42")
c.Check(42, gocheck.Equals, 42)
}
Однако есть некоторые строки, которые я не уверен, что понимаю, даже после прочтения документации. Зачем type MySuite struct{}
нужна строка и даже более интересная строка, зачем var _ = gocheck.Suite(amp;MySuite{})
она нужна? Во-первых, легко сделать вывод, что, вероятно, сначала нужно объявить эту структуру и создать функции, которые будут запускать тесты, если они реализованы с сигнатурой, как показано. Однако вторая строка превосходит меня. Я буквально понятия не имею, зачем это нужно. В документации говорится:
Suite регистрирует заданное значение как набор тестов для запуска. Любые методы, начинающиеся с префикса Test в заданном значении, будут рассматриваться как метод тестирования.
Однако я не уверен во многих вещах. Например, есть ли проблема, если я запускаю эту функцию с несколькими структурами MySuite в одном файле? Есть ли что-то особенное в этом типе MySuite struct
? Может ли пакет тестирования gocheck работать даже при регистрации какой-либо другой структуры? В принципе, сколько раз мы можем зарегистрировать структуру в одном файле и будет ли она по-прежнему работать?
Ответ №1:
gocheck.Suite
Побочным эффектом функции является регистрация заданного значения набора в пакете gocheck. Внутренне он просто добавляет набор к фрагменту зарегистрированных наборов тестов. Вы могли бы получить тот же эффект с:
func init() {
gocheck.Suite(amp;MySuite{})
}
Любая форма должна работать, так что это просто вопрос стиля.
Тесты в зарегистрированных наборах тестов выполняются при вызове gocheck.TestingT
. Вы делаете это в своем вызываемом тесте Test
, который будет подхвачен платформой тестирования Go. Именно так тесты gocheck интегрируются в платформу тестирования. Обратите внимание, что вам нужен только один вызов TestingT
для запуска всех наборов тестов: не по одному для каждого набора тестов.
Комментарии:
1. подождите, так init — это специальная функция в go? Кроме того, вызывается ли каждый набор тестов в фрагменте в любом определенном порядке? Если все наборы тестов находятся в разных файлах, мешают ли они друг другу?
2. Да: golang.org/ref/spec#Package_initialization (хотя, похоже, я ошибался насчет того, что несколько
init
функций не разрешены).