В общих чертах испытательным приспособлением или испытательным контекстом является совокупность одного или нескольких из следующих элементов, необходимых для проведения испытания:
- предварительные условия
- Особые состояния испытываемых единиц
- Необходимые процедуры очистки
Несмотря на то, что эти задачи встречаются во многих, если не во всех тест-кейсах, то, что отличает испытательный прибор, так это повторение. В тех случаях, когда обычная реализация тестового корпуса выполняет все подготовительные и очистительные работы сама по себе, испытательный прибор позволяет реализовать его в отдельном многоразовом блоке.
С введением eXтреморРРограммирование (XP), стиль тестирования, который требует повторения установки / очистки теста, стал еще более популярным. Одиночные тестовые модули, принятые XP, могут содержать сотни единичных тестовых случаев, многие из которых требуют очень похожей настройки / очистки. Это проблема, которую предназначен для решения испытательный прибор.
На практике испытательный прибор обычно представляет собой комбинацию<setup
>и<teardown
>функций, связанных с тестовым случаем. Первый служит целям тестирования. Последующее посвящено задачам уборки. В идеале мы хотели бы, чтобы автор тестового модуля мог определять переменные, используемые в креплениях на стеке, и в то же время ссылаться на них непосредственно в тестовом случае.
Важно понимать, что C++ обеспечивает способ реализации простого решения для тестирования, которое почти соответствует нашим требованиям без дополнительной поддержки со стороны тестовой системы. Вот как может выглядеть простой тестовый модуль с таким приспособлением:
struct MyFixture {
MyFixture() { i = new int; *i = 0 }
~MyFixture() { delete i; }
int* i;
};
BOOST_AUTO_TEST_CASE
( test_case1 )
{
MyFixture f;
}
BOOST_AUTO_TEST_CASE
( test_case2 )
{
MyFixture f;
}
Это универсальное решение, которое может быть использовано для реализации любого типа общей установки или процедуры очистки. Тем не менее, есть несколько более или менее незначительных практических проблем с этим чистым решением на основе C++:
- Мы должны добавить заявление о фиксации в каждый тестовый случай вручную.
- Объекты, определенные в фиксации, являются ссылками с префиксом<
<fixture-instance-name>
>.
- Нет места для выполненияглобальногокрепления, которое выполняетглобальныепроцедуры установки / очистки до и после тестирования.
Unit Test Frameworkпозволяет вам определить фиксацию в соответствии снесколькими общими интерфейсамии, таким образом, помогает вам выполнять следующие задачи:
- Определить общие процедуры установки/вывода для одного или группы тестовых случаев
- Определить процедуры установки/запуска, которые выполняются один раз в наборе тестов
- Определить глобальные процедуры установки/запуска, которые выполняются один раз в тестовом модуле