gpt4 book ai didi

c - 如何测试具有内部状态的函数?

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:58 25 4
gpt4 key购买 nike

我正在使用 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 指向的对象符合特定布局,因此我无法添加它在那里)...有没有其他方法可以调整这个或编写测试,以便它们不需要按特定顺序执行?

最佳答案

一种策略是创建您的测试,以便在您运行它们之后,静态变量将具有相同的值。

例如,由于它被初始化为 static bool voltageGoodHyst = false;,每次运行将其更改为 true 的单元测试时,发送一个最终请求 PRM_inputVoltageIsGood(p, 0) 使静态变量为假。

这样,无论单元测试执行的顺序如何,进入下一个测试时,您就会知道静态变量是什么。

关于c - 如何测试具有内部状态的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com