2016-11-22 5 views
2

Ich bin Gerät testen die folgende Funktion, mit Ceedling.Wie testet man eine Funktion mit internem Zustand?

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; 
} 

Mit Tests wie folgt aus:

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))); 
} 

Die Funktion hat interne Zustand in die Form der Funktion-scope statische Variable voltageGoodhyst (weil der Ausgang hysteretischen).

Wegen der Hysterese müssen meine Tests in einer bestimmten Reihenfolge stattfinden. was schlecht ist. Ich möchte vermeiden, dass die Variable einen größeren Umfang haben muss, da dies die einzige Funktion ist, die diese Funktionalität betrifft (das Objekt, auf das ParametersHandle_t zeigt, entspricht einem bestimmten Layout, so dass ich es dort auch nicht hinzufügen kann) ... Gibt es eine andere Möglichkeit, dies anzupassen oder Tests zu schreiben, so dass sie nicht in einer bestimmten Reihenfolge ausgeführt werden müssen?

+2

Fügen Sie der Funktion einen 'bool resetState' Parameter hinzu. –

+0

Deshalb sagen sie Zustand ist schlecht. –

+0

@ n.m., Yep, noch Staat ist ein reales Weltphänomen aller Gleichen (und einige Spannungsysteme haben es) – Toby

Antwort

1

Eine Taktik wäre, Ihre Tests so zu erstellen, dass nach Sie sie ausführen, die statische Variable wird den gleichen Wert haben.

Zum Beispiel, da es als static bool voltageGoodHyst = false; initialisiert ist, jedes Mal wenn Sie einen Komponententest ausführen, die es zu true ändert, um eine endgültige Anfrage sendet PRM_inputVoltageIsGood(p, 0) die statische Variable falsch zu machen.

Auf diese Weise wissen Sie unabhängig von der Reihenfolge, in der die Komponententests ausgeführt werden, dass die statische Variable falsch ist, wenn Sie den nächsten Test eingeben.

Verwandte Themen