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

Нов съм в тестовите продукти на Google и ги изпробвам с някакъв код за обработка на сигнали. Опитвам се да твърдя, че масивите с плаваща запетая са равни в някои граници, използвайки google mock, както е предложено от отговора на този въпрос. Бих искал да знам препоръчания метод за добавяне на толерантност към грешки към израз като следния. . .

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 теста. . .

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