Сравнение массивов в тесте Google?

Необходимо структурировать это вопросы с точки зрения повторного использования кода и надежности кода (иначе удобочитаемость). Так или иначе нет действительно никакого увеличения производительности.

70
задан BЈовић 1 September 2015 в 15:46
поделиться

2 ответа

Я бы действительно посоветовал взглянуть на Google C ++ Mocking Framework . Даже если вы не хотите ничего высмеивать, он позволяет с легкостью писать довольно сложные утверждения.

Например

//checks that vector v is {5, 10, 15}
ASSERT_THAT(v, ElementsAre(5, 10, 15));

//checks that map m only have elements 1 => 10, 2 => 20
ASSERT_THAT(m, ElementsAre(Pair(1, 10), Pair(2, 20)));

//checks that in vector v all the elements are greater than 10 and less than 20
ASSERT_THAT(v, Each(AllOf(Gt(10), Lt(20))));

//checks that vector v consist of 
//   5, number greater than 10, anything.
ASSERT_THAT(v, ElementsAre(5, Gt(10), _));

Существует множество сопоставителей для всевозможных ситуаций, и вы можете комбинировать их для достижения почти всего.

Я говорил вам, что ElementsAre требует для работы только итераторов и size () метода в классе? Таким образом, он работает не только с любым контейнером из STL, но и с пользовательскими контейнерами.

Google Mock утверждает, что он почти такой же переносимый, как и Google Test, и, честно говоря, я не понимаю, почему вы не стали бы его использовать. Это просто потрясающе.

103
ответ дан 24 November 2019 в 13:21
поделиться

У меня был точно такой же вопрос, поэтому я написал пару макросов, которые сравнивают два общих контейнера. Он расширяется до ЛЮБОГО контейнера, имеющего const_iterator , begin и end . В случае неудачи он отобразит подробное сообщение о том, где произошла ошибка в массиве, и будет делать это для каждого элемента, который выходит из строя; это обеспечит одинаковую длину; и место в вашем коде, которое он сообщает как сбой, совпадает с той же строкой, где вы вызываете EXPECT_ITERABLE_EQ (std :: vector , a, b) .

//! Using the google test framework, check all elements of two containers
#define EXPECT_ITERABLE_BASE( PREDICATE, REFTYPE, TARTYPE, ref, target) \
    { \
    const REFTYPE& ref_(ref); \
    const TARTYPE& target_(target); \
    REFTYPE::const_iterator refIter = ref_.begin(); \
    TARTYPE::const_iterator tarIter = target_.begin(); \
    unsigned int i = 0; \
    while(refIter != ref_.end()) { \
        if ( tarIter == target_.end() ) { \
            ADD_FAILURE() << #target " has a smaller length than " #ref ; \
            break; \
        } \
        PREDICATE(* refIter, * tarIter) \
            << "Containers " #ref  " (refIter) and " #target " (tarIter)" \
               " differ at index " << i; \
        ++refIter; ++tarIter; ++i; \
    } \
    EXPECT_TRUE( tarIter == target_.end() ) \
        << #ref " has a smaller length than " #target ; \
    }

//! Check that all elements of two same-type containers are equal
#define EXPECT_ITERABLE_EQ( TYPE, ref, target) \
    EXPECT_ITERABLE_BASE( EXPECT_EQ, TYPE, TYPE, ref, target )

//! Check that all elements of two different-type containers are equal
#define EXPECT_ITERABLE_EQ2( REFTYPE, TARTYPE, ref, target) \
    EXPECT_ITERABLE_BASE( EXPECT_EQ, REFTYPE, TARTYPE, ref, target )

//! Check that all elements of two same-type containers of doubles are equal
#define EXPECT_ITERABLE_DOUBLE_EQ( TYPE, ref, target) \
    EXPECT_ITERABLE_BASE( EXPECT_DOUBLE_EQ, TYPE, TYPE, ref, target )

Надеюсь, это сработает для вас (и что вы действительно проверяете этот ответ через два месяца после того, как ваш вопрос был отправлен).

9
ответ дан 24 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: