Каждый модульный тест должен концентрироваться на тестировании отдельного поведения, поэтому охват кода одного модульного теста в идеале должен быть очень маленьким. Тогда, когда у вас есть сотни и тысячи таких очень сфокусированных тестов, их общий охват должен быть высоким.
Производительность не важна и важна.
Производительность не важна в том смысле, что не следует проводить микрооптимизацию. Вы должны прежде всего сосредоточиться на удобочитаемости тестов. Например, в книге «Чистый код» есть пример тестов, которые проверяли состояние температурного аварийного сигнала. Первоначально в каждом тесте было около пяти утверждений, проверяющих логические значения, такие как assertTrue(hw.heaterState())
, но затем утверждения были реорганизованы для сравнения одной строки assertEquals("HBchL", hw.getState())
, где верхний регистр означает включенный, а нижний регистр означает отключенный. Последний код имеет более низкую производительность из-за создания некоторых дополнительных строк и их сравнения, но его читаемость намного лучше, поэтому он лучше тестирует код.
Производительность важна в том смысле, что выполнение всех модульных тестов должно быть быстрым, сотни или тысячи тестов в секунду (я предпочитаю в среднем менее 1 мс на тест). Вы должны быть в состоянии выполнить все свои юнит-тесты в считанные секунды. Если тесты выполняются так долго, что вы не решаетесь их выполнять после внесения небольших изменений, и вместо этого вы запускаете их только тогда, когда собираетесь выпить больше кофе, тогда они занимают слишком много времени. Если тестовый набор медленный, вы должны разбить и смоделировать зависимости от других компонентов, чтобы тестируемая система была как можно меньше. В частности, модульные тесты не должны использовать базу данных, потому что это сделает их безнадежно медленными.
В дополнение к модульным тестам также необходимы интеграционные / приемочные тесты, которые тестируют систему в целом. Они играют различную роль в разработке как модульные тесты, поэтому приемлемо, чтобы набор приемочных тестов был медленным (без каламбура). Они должны запускаться сервером непрерывной интеграции не реже одного раза в день.