#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
для каждой проверки означает, что ваш тест всегда будет запускать их все и сообщать, какие из них завершились неудачей.