Table-driven-тесты в Go

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

Запускаются такие тесты через t.Run в цикле.

В PHP аналог этих тестов это использование аннотаций `@dataProvider addProvider`.

Рассмотрим реальный пример:

package main

import (
    "testing"
)

func TestMultiplicationTable(t *testing.T) {
    table := []struct {
        a,
        b,
        expected int
    }{
        {2, 3, 6},
        {4, 5, 20},
        {6, 7, 42},
    }

    for _, test := range table {
        t.Run(fmt.Sprintf("Multiply %d by %d", test.a, test.b), func(t * testing.T) {
                result := multiply(test.a, test.b) 
                
                if result != test.expected {
                    t.Errorf("Expected %d, got %d", test.expected,
                        result)
                }
            })
    }
}

func multiply(a, b int) int {
    return a * b
}

Выполним тест go test -v и увидим результаты выполнения:

=== RUN TestMultiplicationTable
=== RUN TestMultiplicationTable/Multiply_2_by_3
       --- PASS: TestMultiplicationTable/Multiply_2_by_3 (0.00s) 
=== RUN TestMultiplicationTable/Multiply_4_by_5
       --- PASS: TestMultiplicationTable/Multiply_4_by_5 (0.00s) 
=== RUN TestMultiplicationTable/Multiply_6_by_7
       --- PASS: TestMultiplicationTable/Multiply_6_by_7 (0.00s)
       --- PASS: TestMultiplicationTable (0.00s)
PASS
ok      my/package      0.03s

Таким образом, table-driven-тест — это тест, который перебирает slice и выполняет тесты с заданными значениями, проверяя результаты. Это делает код короче, расширяемее и удобнее для CI-report.


Андрей Писаревский

Автор: Андрей Писаревский 

PHP Team Lead.
Коммерческий опыт в программировании с 2010 года и экспертиза в полном цикле веб разработки: Frontend, Backend, QA, CI/CD, управление крупными командами и Enterprise проектами.

А так-же открыт к предложениям о работе со стеком PHP/Golang.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *