Использование gocheck для тестирования кода go (golang), как работает функция suite?

#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 функций не разрешены).