Когда я запускаю этот тест, он терпит неудачу:

func TestCaseA(t *testing.T){
    t.Run("my name with spaces", func (t *testing.T){
        t.Error("some error message")
    })
}

Затем имя теста изменяется (пробелы заменяются подчеркиванием) в выводе:

--- FAIL: TestCaseA (0.00s)
    --- FAIL: TestCaseA/my_name_with_spaces (0.00s)
        main.go:10: some error message
FAIL

Почему он это делает?

Вот рабочий пример: https://play.golang.org/p/viZjC60Dazg

1
Ben Johnson 19 Сен 2018 в 19:56

2 ответа

Лучший ответ

Это объясняется в этом сообщении блога: https://blog.golang.org/subtests

Полное название подтеста или под-теста представляет собой список, разделенный косой чертой, состоящий из его имени и имен всех его родителей, начиная с верхнего уровня. Имя - это соответствующее имя функции для тестов верхнего уровня и тестов, а в противном случае - первый аргумент Run. Чтобы избежать проблем с отображением и синтаксическим анализом, имя очищается путем замены пробелов символами подчеркивания и экранирования непечатаемых символов. Такая же очистка применяется к регулярным выражениям, передаваемым с помощью флагов -run или -bench.

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

2
svsd 19 Сен 2018 в 19:29

Я нашел наиболее окончательный ответ, который мог, конечно, в самом коде. Комментарий функции rewrite гласит

rewrite перезаписывает имя, содержащее только печатаемые символы и без пробелов.

https://golang.org/src/testing/match.go#L133

А почему? Полагаю, JimB попал в точку своим комментарием:

Что касается того, почему, может быть, потому что легче ссылаться на имена без пробелов в cli?

Пробелы вредны для cli.

3
Flimzy 20 Сен 2018 в 05:37