2016-11-22 2 views
2

Я проверяю функцию, используя Ceedling.Как проверить функцию с внутренним состоянием?

bool PRM_inputVoltageIsGood(ParameterHandle_t p, float voltage) { 
    static bool voltageGoodHyst = false; 
    /* Check if voltage has risen above ON point. */ 
    if ((!voltageGoodHyst) && (voltage > p->vin_on)) { 
     voltageGoodHyst = true; 
    } 
    /* Check if voltage has fallen below OFF point. */ 
    else if ((voltageGoodHyst) && (voltage < p->vin_off)) { 
     voltageGoodHyst = false; 
    } 
    return voltageGoodHyst; 
} 

С тестами, таких как следующие:

void test_PRM_inputVoltageIsGood_should_stayAtFalse_before_risingOverVInOn(void) 
{ 
    float i; 
    p->vin_on = 10.0; 
    p->vin_off = 5.0; 
    for (i = 0; i <= p->vin_on; ++i) 
     TEST_ASSERT_FALSE(PRM_inputVoltageIsGood(p, i)); 
} 

void test_PRM_inputVoltageIsGood_should_switchToTrue_when_risingOverVInOn(void) 
{ 
    p->vin_on = 10.0; 
    p->vin_off = 5.0; 
    TEST_ASSERT_FALSE(PRM_inputVoltageIsGood(p, p->vin_on)); 
    TEST_ASSERT_TRUE(PRM_inputVoltageIsGood(p, (p->vin_on + 1))); 
} 

void test_PRM_inputVoltageIsGood_should_stayAtTrue_before_fallingUnderVInOff(void) 
{ 
    float i = 0; 
    p->vin_on = 10.0; 
    p->vin_off = 5.0; 
    for (i = p->vin_on + 1; i >= p->vin_off; --i) 
     TEST_ASSERT_TRUE(PRM_inputVoltageIsGood(p, i)); 
} 

void test_PRM_inputVoltageIsGood_should_switchToFalse_when_fallingUnderVInOff(void) 
{ 
    p->vin_on = 10.0; 
    p->vin_off = 5.0; 
    TEST_ASSERT_TRUE(PRM_inputVoltageIsGood(p, p->vin_off)); 
    TEST_ASSERT_FALSE(PRM_inputVoltageIsGood(p, (p->vin_off - 1))); 
} 

Функция имеет внутреннее состояние в виде функции-сфера статического переменной voltageGoodhyst (потому что выход гистерезисной).

Из-за гистерезиса мои тесты должны происходить в определенном порядке. что плохо. Я вроде бы хочу избежать необходимости иметь переменную в более широкой области, поскольку это единственная функция, связанная с этой функциональностью (объект, на который указывает ParametersHandle_t, соответствует определенному расположению, поэтому я не могу добавить его там). Есть ли другой способ, который я могу настроить или написать тесты, чтобы они не выполнялись в определенном порядке?

+2

Добавить параметр «bool resetState» в функцию. –

+0

Вот почему они говорят, что состояние плохое. –

+0

@ n.m., Yep, но состояние - это явление реального мира все-таки (и некоторые системы напряжения имеют его) – Toby

ответ

1

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

Например, так как она инициализируется как static bool voltageGoodHyst = false;, каждый раз, когда вы запускаете тест модуля, который изменяет его true, отправить окончательный запрос PRM_inputVoltageIsGood(p, 0) сделать статическую переменную ЛОЖЬ.

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

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