Сравнение массивов с плавающей запятой с использованием google test и google mock

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

EXPECT_THAT(  impulse, testing::ElementsAreArray( std::vector<float>({
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0
}) )  );

Я хочу, чтобы тест прошел, если поэлементные значения в массивах находятся в пределах 10-8 друг от друга.


person learnvst    schedule 27.02.2015    source источник
comment
Попался в экспоненте. Откатитесь, если это нежелательно. Кстати, какая наука стоит за этой толерантностью?   -  person Bathsheba    schedule 27.02.2015


Ответы (2)


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

MATCHER_P(FloatNearPointwise, tol, "Out of range") {
    return (std::get<0>(arg)>std::get<1>(arg)-tol && std::get<0>(arg)<std::get<1>(arg)+tol) ;
}

Затем его можно использовать с Pointwise int test . . .

std::vector<float> expected_array({
    0, 0, 0, 1, 1, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0
});

EXPECT_THAT(  impulse, Pointwise( FloatNearPointwise(1e-8), expected_array  ) );

Но было бы лучше, если бы существовало решение, использующее встроенный FloatNear напрямую.

person learnvst    schedule 27.02.2015
comment
Примечание. Pointwise находится в тестовом пространстве имен ::testing::Pointwise. - person fgiraldeau; 14.03.2019
comment
nit: строка, заданная для MATCHER_P, должна описывать критерии прохождения сопоставителя, а не критерии его несоответствия. - person Rufus; 14.02.2021

Один из подходов заключается в использовании макросов googletest, а не googlemock, что приводит к более компактному утверждению:

#define EXPECT_FLOATS_NEARLY_EQ(expected, actual, thresh) \
        EXPECT_EQ(expected.size(), actual.size()) << "Array sizes differ.";\
        for (size_t idx = 0; idx < std::min(expected.size(), actual.size()); ++idx) \
        { \
            EXPECT_NEAR(expected[idx], actual[idx], thresh) << "at index: " << idx;\
        }

// define expected_array as in the other answer
EXPECT_FLOATS_NEARLY_EQ(impulse, expected_array, 0.001);
person the_mandrill    schedule 11.01.2018