2

sqlite3 を使用する次の C コードがあります。

if(SQLITE_OK == sqlite3_initialize()) {
    self->db_open_result = sqlite3_open(self->db_uri, &(self->db));
} else {
    self->db_open_result = SQLITE_ERROR;
}

明らかに、コードが正しく、期待どおりに動作するという確信はかなりあります。ただし、gcov/lcov を使用して単体テストのコード カバレッジを測定しています。この場合、カバレッジ数を 100% にする方法に興味があります。通常の状況sqlite3_initialize()では、決して失敗しないため、else句が実行されることはありません。

完全に破壊的ではない、これを失敗させる方法はありますか?

4

2 に答える 2

5

単体テストでコードをテストする必要があります。しかし、すべてのテスト コードが適切に実行されていることも知りたいと考えています。これを行う 1 つの方法は、「モッキング」を使用することです。つまり、実際のライブラリ (SQLite など) を偽のライブラリまたは「モック」ライブラリに置き換えてから、これらの偽のライブラリに対してプログラムを実行します。

このライブラリの置き換えがコンパイル時と実行時のどちらで行われるかは、実際には付随的なものですが、C ではコンパイル時に行う方が簡単です。このモックは手動で行うことも、 Cmockなどのツールを使用することもできます。

偽のライブラリで、さまざまなエラーや障害を引き起こします。特に、偽造されたライブラリは何もする必要はなく、多くの状態を追跡する必要さえありません。多くの場合、"OK" または "FAIL" を返すことでかなり遠くまで到達できます

于 2012-05-28T06:55:12.757 に答える
0

完全に破壊的ではない、これを失敗させる方法はありますか?

移植性の理由から、関数の成功を確認する必要があります。SQLite ライブラリをインストールしないとどうなりますか? その場合、ライブラリを初期化できません。

「何らかの理由で sqlite3_initialize() がライブラリを初期化できない場合 (おそらくミューテックスなどの必要なリソースを割り当てることができない場合)、エラー コードが返されます...」

したがって、移植性が必要な場合は、エラーを確認してください。

于 2012-05-28T04:32:34.297 に答える