- ВКонтакте
- РћРТвЂВВВВВВВВнокласснРСвЂВВВВВВВВРєРСвЂВВВВВВВВ
- РњРѕР№ Р В Р’В Р РЋРЎв„ўР В Р’В Р РЋРІР‚ВВВВВВВВРЎР‚
- Viber
- Skype
- Telegram
Как красиво вывести результаты тестирования кода 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 шт):
длинное сообщение с 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
занимают несколько строк.
Можете модифицировать под свои задачи самостоятельно.