Эффективные юнит тесты. Часть II

Реализация алгоритма, описанного в первой части. В принципе исходный код говорит сам за себя. Остановлюсь на некоторых деталях.

Каждый элементарный тест описывается структурой:

struct Test
{
    const char* name;
    unsigned type;
    unsigned mask;
    bool positive;
    bool (* tearUp)();
    void (* tearDown)();
};

Константы TEST_XXX представляют собой битовую маску, где каждому биту соотвествует свой тип теста. В процессе выбора очередного теста список выбранных тестов сопоставляется с маской совместимых тестов:

    if (
        ((mask & i->type) == 0) &&
        ((mask & ~(i->type | i->mask)) == 0))
    {

Тест будет выбран только если тест еще не был выбран (первое условие), а также совместим с уже выбранными тестами. (второе условие).

В примере тесты групируются по категориям (или «вариантам»). Основной признак для такой группировки – в одну категорию попадают тесты, которые не могут входить ни в одну тестовую комбинацию одновременно.

comments powered by Disqus