2009-11-23 4 views
1

Я только начинаю использовать CxxTest и хотел бы проверить правильность сортировки std :: vector. Вот мой тест до сих пор:Могу ли я писать пользовательские утверждения в CxxTest?

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    for (unsigned int i = 0; i < vec.size() - 1; ++i) { 
    TS_ASSERT(vec[i] <= vec[i + 1]); 
    } 
} 

Очевидно, что CxxTest не дает TS_ASSERT_SORTED утверждения, но есть способ, чтобы написать свои утверждения? Это позволило бы мне сделать это:

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    TS_ASSERT_SORTED(vec); 
} 

Это значительно легче увидеть намерение теста, когда оно написано именно так.

Я просмотрел CxxTest user's guide, но не мог понять, можете ли вы писать такие собственные утверждения, как это. В качестве альтернативы я мог бы написать класс IsSorted и реализовать его operator(). Затем я мог бы написать тест следующим образом:

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    TS_ASSERT_PREDICATE(IsSorted, vec); 
} 

Я предполагаю, что это правильный подход. Если я это сделаю, должен ли я поместить определение class IsSorted в свой собственный файл заголовка, отдельно от моего набора тестов? Я все еще пытаюсь понять лучшие практики, связанные с модульным тестированием, особенно в этой области.

Последний вопрос: следует ли сортировать вектор в методе setUp() или в самом тесте?

ответ

1

Вы можете добавить несколько новых макросов, изменив файлы заголовков cxxtest. Это с открытым исходным кодом, после всего! Убедитесь, что вы неправильно выполнили тест из этих макросов (см., Что делают TS_ASSERT_EQUALS, в отличие от примера, приведенного здесь martiert, который несовместим с тем, как работает cxxtest).

-1

Вы можете использовать #define


#define TS_ASSERT_PREDICATE(vec)\ 
    std::vector tmp = vec;\ 
    for(int i = 0; i tmp[i+1]) \ 
      return false;\ 
    }\ 
    return true;\ 
} 
+1

Макросы 'TS_ASSERT' должны делать больше, чем возвращать bool ... в противном случае, как бы значения переменных выводились, когда тест не удался? – ThisSuitIsBlackNot

0

Ну, утверждения просто макросы препроцессора, так что вы могли бы, вероятно, реализовать их, как вы хотите, а затем #define макрос для них. Я думаю, было бы лучше использовать имя, которое не начинается с TS_ASSERT_, чтобы вы не путали более поздних читателей кода.

Предикат версия выглядит не так уж неуклюже для меня - я бы, вероятно, пошел с этим, или, возможно, реализовать метод check_ в тестируемом классе и вызывать это из теста. Я часто нуждаюсь в методах, которые проверяют внутреннюю структуру класса для отладки во время выполнения. & протоколирование, в любом случае ...

 Смежные вопросы

  • Нет связанных вопросов^_^