C 如何导致sqlite3\u初始化失败

C 如何导致sqlite3\u初始化失败,c,unit-testing,sqlite,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测量我的单元

我有以下使用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\u initialize()
永远不会失败,因此
else
子句永远不会执行

有没有一种不完全破坏性的方法可以让它失败

有没有一种不完全破坏性的方法可以让它失败

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

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

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

有没有一种不完全破坏性的方法可以让它失败

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

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


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

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

这个库的替换是在编译时还是在运行时进行确实是偶然的,但在C语言中,在编译时进行比较容易。您可以手动执行此模拟,也可以使用工具,例如


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

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

这个库的替换是在编译时还是在运行时进行确实是偶然的,但在C语言中,在编译时进行比较容易。您可以手动执行此模拟,也可以使用工具,例如


在伪造的库中,会引发各种错误和失败。值得注意的是,伪造的库甚至不需要做任何事情,甚至不需要跟踪很多或任何状态,如果出于某种原因,sqlite3_initialize()无法初始化库(可能无法分配所需的资源,如互斥锁),您通常可以返回“OK”或“FAIL”。

”它返回一个非SQLITE_OK的错误代码。“-也许你可以找到它使用的互斥锁并首先打开它?是否“完全破坏性”排除了在`sqlite3_initialize`前面预加一个'x'导致它失败?@DCoder到目前为止,我发现的唯一一件事是在调用之前弄乱内部结构。@Ben Yes。但我真正所说的“破坏性”是指在调用之前执行
malloc(所有内存)
。显然,我可以修改sqlite3库以包含某种测试用例设置,从而允许它故意失败。。。但是我有一整套新的问题“如果出于某种原因,sqlite3_initialize()无法初始化库(可能无法分配所需的资源,如互斥体),则返回SQLITE_OK以外的错误代码。”-可能可以找到它使用的互斥体并首先打开它?是否“完全中断”排除在'sqlite3_initialize'前面预加一个'x'导致它失败?@DCoder到目前为止,我发现的唯一一件事是在调用之前弄脏内部构件。@Ben Yes。但我真正所说的“破坏性”是指在调用之前执行
malloc(所有内存)
。显然,我可以修改sqlite3库以包含某种测试用例设置,从而允许它故意失败。。。但是我有一整套新的问题如果库未安装,程序甚至不会运行,因为运行时链接器无法解析
sqlite3\u initialize
符号(或者它可能会运行,具体取决于特定的操作系统/平台,但在调用之前会“退出”,因为它根本不在那里)。如果库未安装,程序甚至不会运行,因为运行时链接器无法解析
sqlite3\u initialize
符号(或者它可能会运行,具体取决于特定的操作系统/平台,但在执行调用之前会“退出”,因为它根本不在那里)。我想这可能是唯一真正的答案,但我希望避免这种情况:)sqlite3有一种内存模式,这使得它非常适合于不必为了进行自动化测试而模拟数据库(我知道,从技术上讲,这会推动从单元测试到集成测试领域)。必须模拟sqlite3意味着为我的测试代码运行两个单独的编译,一个使用真实的sqlite3,另一个使用模拟。也许不是世界末日。谢谢我认为这可能是唯一真正的答案,但我希望避免:)sqlite3有一种内存模式,这使得它非常适合于不必为了进行自动化测试而模拟数据库(我知道,从技术上讲,它推动了单元测试和集成测试领域)。必须模拟sqlite3意味着为我的测试代码运行两个独立的编译,一个使用真实的sqlite3,另一个使用模拟