如何导致sqlite3_initialize失败

mli*_*bby 2 c sqlite unit-testing

我有以下使用 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;
}
Run Code Online (Sandbox Code Playgroud)

显然,我非常有信心代码是正确的并且会按预期运行。但是,我正在使用 gcov/lcov 测量单元测试的代码覆盖率,我很好奇在这种情况下如何使覆盖率达到 100%。正常情况下sqlite3_initialize()永远不会失败,因此该else子句永远不会执行。

有没有一种方法可以导致此失败而不完全造成破坏?

Pro*_*ica 5

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

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

在伪造的库中,您会引发各种错误和失败。值得注意的是,伪造的库甚至不需要任何事情,甚至不需要跟踪大部分或任何状态,您通常可以通过返回“OK”或“FAIL”来走得很远。

  • 我认为这可能是唯一真正的答案,但我希望避免它:) sqlite3 有一个内存模式,这使得它非常适合不必模拟数据库来进行自动化测试(我知道,从技术上讲,这推动了远离单元测试并进入集成测试领域)。必须模拟 sqlite3 意味着为我的测试代码运行两个单独的编译,一个使用真正的 sqlite3,另一个使用模拟。也许不是世界末日。谢谢! (2认同)