Давайте в качестве примера рассмотрим простой фрагмент кода:
def square(a):
return a*a;
Тесты, направленные на поиск ошибок в этой функции в отдельности, являются юнит-тестами. Это не зависит от того, как вы на самом деле их реализуете: если вы просто напишите оператор if
, например if (square(3) != 9)
, и поднимите AssertionError
, как вы говорите, тогда это модульный тест. Если вместо этого вы реализуете тот же тест, используя unittest
, вызывая assertEqual
, то это также является юнит-тестом.
Другими словами, используете ли вы (так называемый) юнит-тест Framework не является критерием того, являются ли ваши тесты юнит-тестами или нет. Фактически, несмотря на названия структур ('unittest' в Python, 'JUnit' в Java, ...), эти инфраструктуры могут использоваться для модульных тестов, а также для других тестов, таких как интеграция. тесты. Поэтому названия этих фреймворков немного вводят в заблуждение.
Так много для первоначального вопроса о разнице между юнит-тестами и обычными тестами. В одном из комментариев вы поясняете, что на самом деле хотите знать, что лучше: использовать или не использовать тестовую среду. И ответ ясен: определенно go для тестового фреймворка.
После написания только нескольких тестов «вручную», то есть без тестового фреймворка, вы увидите, что существует много дублирование в вашем тестовом коде: вы сравниваете результаты с if
- это не так уж отличается. Но затем, в случае успеха вы пишете какое-то «пройденное» сообщение с именем теста, в случае неудачи вы пишете «неудачные» сообщения, опять же с именем теста и в этом случае также с некоторой дополнительной информацией о том, что было на самом деле и каков был ожидаемый результат. И - вы думали о том, что тестируемый код завершается с исключением? Итак, вам также нужно обернуть его блоком try / catch, чтобы непредвиденные исключения приводили к «неудачному» результату, опять же с некоторой полезной информацией о диагностике c.
И так далее ... Все Об этом и многом другом заботятся тестовые рамки для вас.