如何导致sqlite3_initialize失败

时间:2012-05-27 13:33:21

标签: c unit-testing sqlite

我有以下使用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子句永远不会执行。

有没有办法让这种失败不是完全破坏性的?

2 个答案:

答案 0 :(得分:3)

您希望您的单元测试能够测试您的代码。但是您也想知道您的所有测试代码都已正确执行。一种方法是使用“mocking”,即用虚假或“模拟”库替换你的实际库(如SQLite),然后针对这些假库运行你的程序。

这个库替换是在编译时还是在运行时完成是非常偶然的,但在C中,编译时更容易。您可以手动进行模拟,也可以使用Cmock等工具。

在伪造的库中,您会引发各种错误和失败。值得注意的是,伪造的图书馆甚至不必任何事情,甚至不记得任何状态,你通常可以通过返回“OK”或“FAIL”来获得相当远的目标。

答案 1 :(得分:0)

  

有没有办法让这种失败不是完全破坏性的?

出于便携性原因,您应该验证功能是否成功。如果你没有安装SQLite库会发生什么?如果发生这种情况,您无法初始化库。

“如果由于某种原因,sqlite3_initialize()无法初始化库(可能无法分配所需的资源,如互斥锁),则会返回错误代码...”

所以,如果你想要可移植性检查错误。