SetUp против конструктора в тестовом приспособлении - программирование
Подтвердить что ты не робот

SetUp против конструктора в тестовом приспособлении

Почему у тестового прибора есть метод SetUp в Google Test? Разве конструктор не работает то же самое? Аналогично для метода TearDown. Вызовы как для SetUp, так и для Constructor, а также для TearDown и Destructor совместимы с TestEventListeners: OnTestStart и OnTestEnd.

4b9b3361

Ответ 1

ответ на этот вопрос в ЧаВо:

Должен ли я использовать конструктор/деструктор тестового прибора или функцию настройки/срыва?

Первое, что нужно помнить, - это то, что Google Test не использует повторно один и тот же объект для тестирования на нескольких тестах. Для каждого TEST_F, Google Test создаст новый объект для тестирования, немедленно вызовите SetUp(), запустите тестовое тело, вызовите TearDown(), а затем немедленно удалите объект test fixture.

Когда вам нужно написать индивидуальную логику тестирования и отторжения, у вас есть выбор между использованием конструктора/деструктора тестового приспособления или SetUp()/TearDown(). Первый обычно предпочтительнее, поскольку он имеет следующие преимущества:

  • Инициализируя переменную-член в конструкторе, мы имеем возможность сделать это const, что помогает предотвратить случайные изменения его ценность и делает тесты более правильными. * В случае, если мы необходимо подклассифицировать класс test fixture, конструктор подкласса гарантированно сначала вызвать конструктор базового класса, а деструктор подкласса гарантированно вызывает деструктор базового класса после этого. С SetUp()/TearDown() подкласс может сделать ошибку забыть вызвать базовый класс SetUp()/TearDown() или позвонить они не в тот момент.

Вы все еще можете использовать SetUp()/TearDown() в следующих редких случаев:

  • Если операция срывания может вызвать исключение, вы должен использовать TearDown() в отличие от деструктора, так как бросать деструктор приводит к поведению undefined и обычно убьет вас программа сразу. Обратите внимание, что многие стандартные библиотеки (например, STL) могут когда в компиляторе включены исключения. Поэтому вы следует предпочесть TearDown(), если вы хотите написать переносные тесты, которые работать с или без исключения.

  • Макросы утверждения вызывают исключение, если указан флаг --gtest_throw_on_failure. Поэтому вы не должны использовать утверждения Google Test в деструкторе, если вы планируете выполнять свои тесты с помощью этого флага.

  • В конструкторе или деструктор, вы не можете совершить виртуальный вызов функции на этом объекте. (Вы можете вызвать метод, объявленный как виртуальный, но он будет статически поэтому. Если вам нужно вызвать метод, который будет переопределен в производном классе вы должны использовать SetUp()/TearDown().