Могу ли я написать собственные утверждения в CxxTest?

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

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, но не смог понять, можно ли писать собственные утверждения, например это. В качестве альтернативы я мог бы написать класс IsSorted и реализовать его operator(). Затем я мог бы написать тест следующим образом:

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

  TS_ASSERT_PREDICATE(IsSorted, vec);
}

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

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


person ThisSuitIsBlackNot    schedule 23.11.2009    source источник


Ответы (3)


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

person Uri Cohen    schedule 23.01.2011

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

Версия предиката не выглядит такой уж неуклюжей для меня - я бы, вероятно, пошел с ней или, возможно, реализовал бы метод check_ в классе, который вы тестируете, и вызвал бы его из теста. В любом случае мне часто нужны методы, которые проверяют внутреннюю структуру класса для отладки и ведения журнала во время выполнения...

person Mark Bessey    schedule 23.11.2009

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


#define TS_ASSERT_PREDICATE( vec )\
    std::vector tmp = vec;\
    for(int i = 0; i  tmp[i+1]) \
            return false;\ 
    }\ 
    return true;\ 
}
person martiert    schedule 23.11.2009
comment
Макросы TS_ASSERT должны делать больше, чем возвращать логическое значение... в противном случае, как будут выводиться значения переменных при неудачном тесте? - person ThisSuitIsBlackNot; 23.11.2009