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

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

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

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

于 2012-05-28T06:55:12.757 回答
0

有没有办法让这个失败而不是完全破坏?

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

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

因此,如果您想要可移植性,请检查错误。

于 2012-05-28T04:32:34.297 回答