web-dev-qa-db-ja.com

モックされた関数を呼び出す初期化関数でテストを処理する方法は?

モジュールの(foo)コンテキストオブジェクトハンドルを初期化するために使用される関数がある組み込みCプロジェクトに取り組んでいます。したがって Ceedling を使用してテストするとき、セットアップでこの初期化関数を使用しました。

_#include "unity.h"
#include "mock_bar.h"
#include "foo.h"

static foo_handle s = NULL;

void setUp(void)
{
    s = foo_init(&bar_assertAlert, &bar_releaseAlert);
}
_

ご覧のとおり、foo_init()関数には、別のモジュール(バー)からの関数への2つのハンドルが必要です。これにより、非同期イベントの場合にこれらの関数を呼び出すことができます。いくつかのテストでこれらの関数の使用をテストできるように、barモジュールはCeedlingによってモックされています。

ただし、bar関数はモックされているため、init関数が実際にbar_releaseAlertを呼び出して初期状態であることを確認するため、テストとしてのsetUpレポートは毎回失敗します。

_"Function bar_releaseAlert.  Called more times than expected."
_

以下のように、セットアップに「無視」を追加できますが、セットアップでテストタイプのコードを使用したり、ティアダウンしたりするのは間違っています。多分その仮定は間違っていますか?

_void setUp(void)
{
    bar_releaseAlert_Ignore();
    s = foo_init(&bar_assertAlert, &bar_releaseAlert);
}
_

それとも、このデザインは私の側にありますか?セットアップがモック関数を呼び出すモック関数を使用するモジュールをテストするにはどうすればよいですか?

2
Toby

私は仲間のシードリングユーザーとして、以前にこれらのアイデアに取り組んできました。理想的には、setUp関数での直接テストを回避する必要がありますが、CeedlingとCmockがsetUpでExpectとIgnoreを使用するだけで機能するため、モックを制御してからこのフェーズでテストする方がより適切です。

Cmockの優れた点の1つは、関数がモック化されるたびに考慮を強いられることですが、このような状況では、期待するものに焦点を合わせていない可能性があるときに、期待または無視する必要があります。テストする。

テストの他の場所でbar_releaseAlertを呼び出す場合は、bar_releaseAlert_Expectを使用することをお勧めします。[無視]は、期待どおりの結果になるまでそれを無視するので、期待とは異なる場合があります。

void setUp(void)
{
    bar_releaseAlert_Expect(); //Expect instead of Ignore if used elsewhere
    s = foo_init(&bar_assertAlert, &bar_releaseAlert);
}

別のオプションは、関数が呼び出されたかどうか、および関数が呼び出された回数を確認できるcmockの代わりにfake_function_frameworkプラグインを使用することです。

単一性とceedlingの動作がsetUpとtearDownの両方でのテストを可能にし、たとえばCeedlingがどのように動作するかについての影響にどのように影響するかを示すため、 テストが無視された場合、tearDownは呼び出されません

1
Dom

免責事項:私は決して経験豊富なソフトウェア開発者やテスターではありません。これが言われて、ここに問題についての私の考えがあります:

初期化関数が複雑すぎない場合は、実際に何も呼び出さずに、setUpでコアの動作をエミュレートすることもできます。テスト済みのモジュールの関数をsetUpで呼び出すIMOには、実際にその関数をテストするだけでなく使用したいというデメリットもあります。例えば。 setUpで初期化関数を呼び出して変更すると、すべてのテストが失敗する可能性があり、その理由を見つけるのが困難になる可能性があります(異なる関数が異なる障害をスローする可能性があります)。

私のテストでは、init関数から必要なものを抽出し、何も起こらなかったかのようにテストしました。これまでに動作します。

0
Mike