2016-11-22 9 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。しかし、まだ、状態は全く同じ現実世界の現象です(そして、いくつかの電圧システムはそれを持っています)。 – Toby

答えて

1

の後にを実行すると、静的変数の値は同じになります。

たとえば、として初期化されているため、単位テストを実行してtrueに変更するたびに、最終的なリクエストPRM_inputVoltageIsGood(p, 0)を送信して静的変数をfalseにします。

この方法では、単体テストの実行順序にかかわらず、次のテストに入るときに静的変数がどのようなものかを知ることができます。

関連する問題