Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме GoВсе вопросы
GoMiddleКодинг

Что такое table-driven testing и почему это идиоматично для Go?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Table-driven tests — это срез структур с тест-кейсами, прокручиваемый в цикле с t.Run для именованных подтестов. Стандарт Go: уменьшает дублирование, упрощает добавление случаев и позволяет запускать конкретный подтест через -run.

Базовый пример

package math_test

import (
	"testing"
)

func Divide(a, b float64) (float64, error) {
	if b == 0 {
		return 0, fmt.Errorf("division by zero")
	}
	return a / b, nil
}

func TestDivide(t *testing.T) {
	tests := []struct {
		name    string
		a, b    float64
		want    float64
		wantErr bool
	}{
		{name: "positive", a: 10, b: 2, want: 5},
		{name: "negative divisor", a: 10, b: -2, want: -5},
		{name: "divide by zero", a: 5, b: 0, wantErr: true},
		{name: "zero numerator", a: 0, b: 3, want: 0},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := Divide(tt.a, tt.b)
			if (err != nil) != tt.wantErr {
				t.Errorf("Divide() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !tt.wantErr && got != tt.want {
				t.Errorf("Divide() = %v, want %v", got, tt.want)
			}
		})
	}
}

Table-driven tests в Go

Table-driven testing — идиоматический подход к тестированию в Go: тест-случаи описываются как срез структур (таблица), а единый цикл прогоняет каждый из них. Это уменьшает дублирование кода и упрощает добавление новых случаев.

Почему это идиоматично для Go

  • Стандартная библиотека Go использует этот паттерн повсеместно (см. strings, strconv, net/http).
  • t.Run создаёт именованный подтест, который можно запустить отдельно: go test -run TestDivide/divide_by_zero.
  • Каждый подтест изолирован: сбой одного не останавливает остальные.
  • Структура данных явно документирует контракт функции.

Параллельное выполнение

for _, tt := range tests {
	tt := tt // захват переменной цикла (обязательно до Go 1.22)
	t.Run(tt.name, func(t *testing.T) {
		t.Parallel() // подтесты выполняются параллельно
		// ...
	})
}

Запуск конкретного случая

go test -run TestDivide/positive ./...
go test -run TestDivide -v ./...   # показать все подтесты

Расширенный паттерн: setup и teardown

tests := []struct {
	name  string
	setup func() *DB
	input string
	want  int
}{
	{
		name:  "empty db",
		setup: func() *DB { return NewTestDB(t) },
		input: "query",
		want:  0,
	},
}
for _, tt := range tests {
	t.Run(tt.name, func(t *testing.T) {
		db := tt.setup()
		defer db.Close()
		// ...
	})
}

Подводные камни

  • До Go 1.22 захват переменной цикла (tt := tt) обязателен при использовании t.Parallel(); без него все горутины разделяют один tt и тестируют только последний случай.
  • Использование t.Fatal внутри горутины не останавливает тест — вызывает панику. В подтестах с t.Parallel() используйте t.Error.
  • Слишком общая таблица с десятками полей-флагов вместо отдельных тестовых функций — антипаттерн; дробите по смысловым группам.
  • Имена случаев с пробелами: t.Run заменяет пробелы на _ в выводе, поэтому фильтр -run нужно писать с _ или использовать regexp.
  • Тест не падает при добавлении нового случая, если забыли добавить поле в структуру: Go инициализирует пропущенные поля нулевыми значениями без ошибки компиляции.
  • Не смешивайте таблицу с глобальным состоянием: если тест-случаи зависят от порядка выполнения, таблица теряет смысл.

Типичные ошибки

  • Давать ответ про table-driven testing только на уровне определения, не показывая поведение в реальном приложении.
  • Игнорировать границы ответственности вокруг темы «table-driven testing»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
  • Не связывать table-driven testing с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.

Что проверяет интервьюер

  • Точно объясняет, что именно делает table-driven testing и где это используется в Go-коде.
  • Связывает table-driven testing с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
  • Не изобретает API и опирается на реальные контракты официальной документации.

Как вы знаете этот вопрос?

Проверить себя по теме Go →

Источники

  • https://go.dev/wiki/TableDrivenTests
  • https://pkg.go.dev/testing
←Предыдущий вопросВ чём разница между `sync.Mutex` и `sync.RWMutex`?Следующий вопрос→Как работает планировщик Go? Что такое модель многопоточности M:N (GOMAXPROCS)?

Связанные темы

Gomaintainabilitytest-designtesting

Вакансии с этим навыком

Go вакансии
  • Head of GTM Systems & Engineering
  • Staff Product Security Engineer
  • Staff Security Engineer - Calix Cloud
  • Sr Solutions Engineer - Public Sector (Singapore)
  • Principal Product Manager, International Ecommerce

Частые вопросы на собеседовании

  • Для каких задач Go (Golang) является сильным выбором, а где лучше честно выбрать другой язык?
  • Как писать unit-тесты в Go? Что такое пакет testing?
  • Что происходит при добавлении элементов за пределы ёмкости slice?
  • Как Go управляет пакетами и модулями? Что такое go.mod?