четверг, 17 января 2019 г.

C++, тестирование: моки

Не так просто найти хороший материал по мокам и стабам (используются в юнит-тестировании). Либо что-то очень запутанное попадается, либо про Google Mock (а мне хочется посмотреть, как самому писать заглушки и объекты-имитации).

Наконец нашлось кое-что вразумительное. Статья Mock objects в блоге Clean C++. 

Моки в этой статье рассказываются на достаточно простом примере. Пусть имеется класс play_time, который показывает геймеру, сколько времени он просидел за игрой. Этот класс нужно протестировать - проверить, что он действительно показывает правильное время. Стратегия тут простая - запустили таймер в play_time, затем вызвали sleep() на несколько секунд, остановили таймер, прочитали время из play_time. 

Проблема в том, что тестировать таким образом неудобно. Придется ждать, пока закончится время сна. Таким образом, наш класс play_time зависит от функционала системы, и эту зависимость предлагается сделать явной. Для этой создается класс-интерфейс second_clock, 
экземпляр этого класса нужно будет передавать в конструктор play_time. В этом самом second_clock и будет спрятан ход времени.

Нормальные системные часы будут реализованы как класс system_clock, наследник клаcса second_clock. Для нормальной работы класса play_time в его конструктор нужно подсунуть именно system_clock.

А вот для тестирования создаются "поддельные" часы - класс mock_clock, которые тоже наследуются от second_clock (вот и появился мок). В подделке часы не тикают - их устанавливают вручную.

И схема тестирования теперь выглядит следующим образом. Создаем объект-таймер типа  play_time, в конструктор передаем часы-мок. Запускаем таймер, продвигаем "поддельные" часы вручную (просто делаем set_time), останавливаем таймер. Теперь можно проверять время. На этот раз обошлись без ожидания в течение реального промежутка времени.




Комментариев нет: