Как красиво вывести результаты тестирования кода go?

У меня есть код, который выполняет транслитерацию слова с английского на русский. У меня также есть JSON файл с массивом массивов, по которому происходит проверка работы транслитератора. Вот код теста:

func TestMain(t *testing.T) {

b, err := os.ReadFile("../json/testcases.json")
if err != nil {
    fmt.Println("Ошибка записи данных:", err)
}
var testTranslit [][]string
err = json.Unmarshal(b, &testTranslit)
if err != nil {
    fmt.Print("Ошибка десириализации файла")
}
for _, v := range testTranslit {
    assert.EqualValues(t, strings.ToLower(v[1]), mainTest(v[0]))
}

После завершения тестирования в терминале я получаю следующий результат:

                      expected: "мантра"
                      actual  : "мэнтра"
                      
                      Diff:
                      --- Expected
                      +++ Actual
                      @@ -1 +1 @@
                      -мантра
                      +мэнтра

Можно ли получить отформатированные результаты тестирования, оставив только значения expected и actual?


Ответы (1 шт):

Автор решения: Pak Uula

длинное сообщение с expected, actual и diff формирует используемая вами библоитека github.com/stretchr/testify/assert: assert.Equal

Внутри себя эта библиотека вызывает функцию t.Errorf, и это единственный метод testing.T, котоырй использует библиотека assert. Вы можете создать свой тип с нужной вам реализацией метода Errorf. Например, вот такой:

type FormatT struct {
    t *testing.T
}

func (ft FormatT) Errorf(format string, args ...interface{}) {
    msg := fmt.Sprintf(format, args...)
    lines := strings.Split(msg, "\n")
    errorTrace := ""
    errorDesc := ""
    expected := ""
    actual := ""
    for _, line := range lines {
        if strings.HasPrefix(strings.TrimLeft(line, "\t "), "Error Trace:") {
            errorTrace = line
        }
        if strings.HasPrefix(strings.TrimLeft(line, "\t "), "Error:") {
            errorDesc = line
        }
        if strings.HasPrefix(strings.TrimLeft(line, "\t "), "expected") {
            expected = line
        }
        if strings.HasPrefix(strings.TrimLeft(line, "\t "), "actual") {
            actual = line
        }
    }
    if expected != "" && actual != "" {
        ft.t.Logf("\n%s\n%s\n%s\n%s\n", errorTrace, errorDesc, expected, actual)
    } else {
        ft.t.Log(msg)
    }
    // ft.t.Errorf(format, args...)
}

Этот метод Errorf разбивает вывод на строки и ищет строки, начинающиеся на expected и actual. Если такие строки найдены, только они печатаются в лог.

Пример:

func TestMantra(t *testing.T) {
    expected := "мантра"
    actual := "мэнтра"
    assert.Equal(FormatT{t}, expected, actual, "Expected %s, got %s", expected, actual)
}

Результат

=== RUN   TestMantra
    some_test.go:37: 
                Error Trace:    C:/Users/User/Desktop/tmp/go/тест/some/some_test.go:47
                Error:          Not equal:
                                expected: "мантра"
                                actual  : "мэнтра"
--- PASS: TestMantra (0.00s)

Приведённый код только примерный. Например, он не будет работать для случаев, когда значения actual и expected занимают несколько строк.

Можете модифицировать под свои задачи самостоятельно.

→ Ссылка