C 如何使用内部状态测试函数?

C 如何使用内部状态测试函数?,c,unity-test-framework,C,Unity Test Framework,我正在使用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)

我正在使用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;
}
bool PRM\u输入电压良好(参数handle\u t p,浮动电压){
静态布尔电压goodhyst=false;
/*检查电压是否上升到接通点以上*/
如果((!voltageGoodHyst)和&(电压>p->vin_开启)){
voltageGoodHyst=真;
}
/*检查电压是否低于断开点*/
否则如果((电压goodhyst)和&(电压vin\U关闭)){
voltageGoodHyst=假;
}
返回电压goodhyst;
}
进行如下测试:

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)));
}
无效测试\u PRM\u输入电压是否良好\u在出现无效(无效)之前应保持错误\u
{
浮点数i;
p->vin_on=10.0;
p->vin_off=5.0;
对于(i=0;i vin_on;++i)
TEST_ASSERT_FALSE(PRM_输入电压良好(p,i));
}
无效测试\u PRM\u输入电压是否良好\u在出现异常(无效)时应切换到正确的\u
{
p->vin_on=10.0;
p->vin_off=5.0;
测试断言错误(PRM输入电压良好(p,p->vin开启));
测试断言为真(PRM输入电压良好(p,(p->vin开+1));
}
无效测试\u PRM\u输入电压是否良好\u应在\u失效前保持正确(无效)
{
浮点数i=0;
p->vin_on=10.0;
p->vin_off=5.0;
用于(i=p->vin\U开+1;i>=p->vin\U关;--i)
测试断言为真(PRM输入电压良好(p,i));
}
无效测试\u PRM\u输入电压是否良好\u在欠压(无效)时应切换到ALSE\u
{
p->vin_on=10.0;
p->vin_off=5.0;
测试断言为真(PRM输入电压良好(p,p->vin关闭);
测试断言错误(PRM输入电压良好(p,(p->vin关闭-1));
}
函数具有函数范围静态变量形式的内部状态(因为输出是滞后的)


由于滞后,我的测试必须按一定的顺序进行。这很糟糕。我有点想避免让变量具有更大的范围,因为这是唯一与此功能相关的函数(由
参数shandle\u t
指向的对象符合特定的布局,因此我也不能将其添加到那里)。。。是否有其他方法可以调整此测试或编写测试,使它们不必按特定顺序执行?

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

例如,因为它被初始化为
static bool voltageGoodHyst=false
,每次运行单元测试将其更改为
true
,都会发送一个最终请求
PRM\U inputVoltageIsGood(p,0)
,以使静态变量为false


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

在函数中添加一个
bool resetState
paraparaparameter。。这就是为什么他们说状态是坏的。@n.m.,是的,但状态仍然是一个真实世界的现象(一些电压系统也有这种现象)必须以一种干净文明的方式来处理这个国家:)而不是通过隐藏它来让事情变得更糟。也许这是一个额外的函数参数。我用静态变量测试函数时很痛苦,所以我知道这种感觉。让体系结构/开发人员更改代码/设计并不总是可能的。