Я проверяю функцию, используя 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
, соответствует определенному расположению, поэтому я не могу добавить его там). Есть ли другой способ, который я могу настроить или написать тесты, чтобы они не выполнялись в определенном порядке?
Добавить параметр «bool resetState» в функцию. –
Вот почему они говорят, что состояние плохое. –
@ n.m., Yep, но состояние - это явление реального мира все-таки (и некоторые системы напряжения имеют его) – Toby