Ошибка против фатальной в тестах

#go

#Вперед

Вопрос:

Я разрабатываю веб-службу JSON, используя Go-Json-Rest. Я пишу тесты.

 ...
recorded = test.RunRequest(t, amp;api.Handler,
    test.MakeSimpleRequest("POST", "http://localhost/api/products",
        product))
recorded.CodeIs(201)
recorded.ContentTypeIsJson()

var newProduct Product
err := recorded.DecodeJsonPayload(amp;newProduct)
if err != nil {
    t.Fatal(err)
}
...
  

Я использую, Fatal поскольку я пришел из мира Python, где assert немедленно остановил бы выполнение метода тестового примера. И это имеет смысл: зачем пытаться декодировать данные, если это не JSON?

Но recorded.CodeIs(201) , recorded.ContentTypeIsJson() и другие тесты, которые я видел, используют Error , которые не останавливают выполнение теста.

Что я должен использовать в тестах? Error или Fatal ?

Ответ №1:

Я думаю, что вы используете Error до тех пор, пока продолжение выполнения теста не сможет дать вам больше информации, полезной при отладке, тогда вы используете Fatal . И если вы не уверены (например, если вы пишете учитывающий метод, подобный CodeIs , для использования в контексте множества различных тестов), используйте Error , поскольку вы обычно не причиняете вреда, продолжая выполнять тест.

По этим критериям для вас имеет смысл Fatal при неудачном декодировании JSON, после которого, как вы говорите, ничего интересного не произойдет. И это понятно, CodeIs и ContentTypeIsJson use Error , потому что это методы, которые будут использоваться в разных тестах.

Другой пример может лучше проиллюстрировать, почему использовать Error , пока вы не знаете, что больше ничего интересного не произойдет: допустим, вы хотите проверить работоспособность нескольких разных параметров ответа JSON, и любое их подмножество может быть неправильным. (Например, ваш product API может возвращать данные, price используя неправильный тип, или он может не возвращать пустые description значения, когда вы этого не хотите, или …) Использование Error вместо Fatal для каждой проверки означает, что ваш тест всегда будет запускать их все и сообщать, какие из них завершились неудачей.