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

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

Что такое настольные тесты?

Табличные тесты — отличный способ протестировать функции с различными входными данными и результатами. Идея табличных тестов заключается не в том, чтобы писать уникальную тестовую функцию для каждой комбинации входных и выходных данных, а в одной тестовой функции, которая может перебирать таблицу входных данных функции и проверять ожидаемые результаты.

Базовый встречающий

Чтобы лучше объяснить концепцию Table Tests, мы сначала создадим простой набор функций, которые выводят различные приветствия на разных языках.

Затем мы будем использовать тесты таблиц для повторения нескольких языков и ожидаемых приветствий.

// Config is used to configure a Greeter based on desired language parameters.
type Config struct {
 // Language is the language to use while greeting.
 Language string
}

// Greeting returns a greeting in the language specified by the Config.
type Greeter struct {
 language string
}

// New returns a new Greeter based on the provided Config.
func New(cfg Config) (*Greeter, error) {
 switch cfg.Language {
 case "en", "fr", "es", "de", "jp", "cn":
  return &Greeter{language: cfg.Language}, nil
 default:
  return nil, fmt.Errorf("unsupported language: %s", cfg.Language)
 }
}

// Greeting returns a greeting in the language specified by the Greeter.
func (g *Greeter) Greeting() string {
 switch g.language {
 case "en":
  return "Hello"
 case "fr":
  return "Bonjour"
 case "es":
  return "Hola"
 case "de":
  return "Hallo"
 case "jp":
  return "こんにちは"
 case "cn":
  return "你好"
 }
 return ""
}

Мы должны сначала взглянуть на функцию New(), чтобы понять пример кода. Эта функция принимает структуру Config, которая позволяет пользователям указывать…