Tag: unit testing

如何使用OCMock模拟C函数

如何使用ocmock模拟自定义c-lib函数? 在谷歌上找不到任何东西,OCMock的任何方法存根函数都不起作用

在unit testing中使用StringBuilder进行PInvoking

我有一个C DLL我是PInvoking。 主要目标是获取39个字符的GUID字符串,例如abcd-abcd-abcd-abcd-abcd-abcd-abcd-abcd 。 我首先调用一个方法来获取这个字符串的大小,我希望它是39个字符,然后我调用另一个函数传递一个容量为39的StringBuilder : [DllImport(“test.dll”)] public static extern int get_size(); [DllImport(“test.dll”)] public static extern void get_string(StringBuilder result); 我的代码看起来像这样: int size = get_size(); // Returns 40, because it includes the null terminating character. var result = new StringBuilder(size – 1); // Gives it a capacity of 39. Subtracting 1 here because this does not […]

unit testingC库,内存管理

我正在开发一个相当大的C库,现在没有任何测试。 由于API开始是最终的,我想开始编写unit testing。 几乎所有的函数都作用于第一个参数(一个结构)。 unit testing的朴素方法是使预函数调用结构处于已知状态,调用函数,然后将预调用结构与预期结果进行比较。 现在这适用于由标量类型组成的结构,但至于分配的内存,我想知道你正在使用什么样的方法。 例如,想象一下图像结构,当你这样做时: CreateImage(&img, x, y); 你希望img-> x是x,img-> y是y而img->像素是一个指向大到足以容纳x * y * sizeof(pixel)东西的指针。 检查前两个是微不足道的,但img->像素怎么样? 我不是要检查malloc调用是否成功,因为我可以重载 malloc,但我想知道malloc是否被正确调用。 在以下情况下,这一点尤为重要: CreateImage(*img, x, y) { img->x = x; img->y = y; /* do something, dhoo, that something is broken and modify x or y */ img->pixels = malloc(x * y * sizeof(pixel)); /* wrong […]

创建C代码的unit testing时LNK2001的问题

我正在尝试使用Visual Studio 2017中的本机unit testing项目为C代码配置unit testing 。但是当包含来自其他库的函数或甚至同一项目(lib)中的其他h文件时, 链接器工具错误LNK2001存在一些问题。 在没有Unit Test项目的情况下构建lib时链接没有问题。 当我对一个没有其他依赖的h和c文件进行unit testing时,它工作正常。 但是当我在其他h文件中包含调用函数时。 我遇到链接问题。 它像mytest项目(c ++)一样,没有与项目(c)相同的访问权限。 我不知道如何解决错误。 但我可以添加更多关于问题的信息,如果只需要询问,我会尝试获取它。

具有编译器特定关键字的unit testingC.

我正在为一些嵌入式C编写unit testing,它在主机上运行(尚未在目标上进行测试)并使用GCC进行编译。 我一直在使用Ceedling构建系统和Unity测试框架进行测试。 我想测试的一个文件包括一个文件(比如说啊),它包含另一个文件(比如cpu.h),它是嵌入式设备供应商提供的板级支持包的一部分,并使用特定于目标编译器的关键字(例如__cregister ,例如extern __cregister volatile unsigned int IER; . 另一个问题,再次使用BSP中包含的这样的文件,是内联汇编asm()部分,例如#define FOO_ASM asm(“FOO”) 。 当构建测试时,这两者都会引发错误,因为GCC无法识别这些关键字。 我曾经以为我可以通过在我的测试文件中添加#include “mock_a.h”来阻止这些BSP头被Ceedling生成一个模拟,但是GCC仍然编译啊,因此bh 是否有解决此类问题的最佳实践方法? 我可以在有问题的BSP文件中添加类似下面的内容,但我不愿意改变供应商代码,这些代码会在新版本发布时更改或覆盖我的更改,我宁愿了解如何正确隔离单元。 // Unknown how __cregister is initially defined #ifdef TEST #undef __cregister // Redefine __cregister to nothing #define __cregister #endif extern __cregister volatile unsigned int IER;

在MSVC中模拟C函数(Visual Studio)

我正在阅读几篇关于模拟 C函数的文章(比如CMock或CMocka ),但我不确定在这个过程中如何用模拟函数替换实际函数。 例如,CMocka依赖于使用GNU编译器的自动换行,GNU编译器支持诸如–wrap参数将__wrap前缀附加到函数调用,或者弱符号允许您覆盖任何您喜欢的符号。 但是你如何在Visual Studio中为几乎所有其他框架做到这一点? 例如, CMock有一个与此类似的例子 (这里简化了很多): // myfunc.c #include // this is the function we would like to test int MyFunc(char* Command) { // this is the call to the function we will mock return ParseStuff(Command); } 还有实际的实现,它包含链接器在实际应用程序中应该找到的实际function: // parsestuff.c int ParseStuff(char* cmd) { // do some actual work return 42; } […]

如何在unit testingC时重置状态机

我有一个用于TI处理器的嵌入式C,需要进行unit testing。 对于目标编译,使用IAR,但我使用MinGW GCC在Win7机器上运行测试。 在C代码中,有些函数包含有时需要在测试之间重置的状态机。 这些状态机通常将其状态变量保持在本地静态,即使不是不可能,也很难完成该任务。 我不是很精通C ++类,但我有一个关于将C函数“导入”包装C ++类的想法作为成员函数,可以在需要重置时创建一个新对象。 下面的代码不起作用,但它说明了我的想法。 在main.cpp中: #include “statemachine.h” using namespace std; class stateMachineWrapper { public: extern void stateMachine(void); }; int main() { stateMachineWrapper myObject; myObject.stateMachine(); myObject.stateMachine(); stateMachineWrapper myNewObject; myNewObject.stateMachine(); myNewObject.stateMachine(); return 0; } 在statemachine.h中: void stateMachine(void); 在statemachine.c中: #include void stateMachine(void) { static int myState = 0; switch(myState) { case 0: […]

长长的对齐问题(MSVC与GCC)

我正在编写C跨平台库,但最终我的unit testing中出现错误,但仅限于Windows机器上。 我已经跟踪了这个问题并发现它与结构的对齐有关(我正在使用结构数组来保存多个类似对象的数据)。 问题是:memset(sizeof(struct))和设置结构成员逐个产生不同的字节到字节结果,因此memcmp()返回“不相等”的结果。 这里的代码为: #include #include typedef struct { long long a; int b; } S1; typedef struct { long a; int b; } S2; S1 s1, s2; int main() { printf(“%d %d\n”, sizeof(S1), sizeof(S2)); memset(&s1, 0xFF, sizeof(S1)); memset(&s2, 0x00, sizeof(S1)); s1.a = 0LL; s1.b = 0; if (0 == memcmp(&s1, &s2, sizeof(S1))) printf(“Equal\n”); […]

SIGSEGV处理程序中的Segfault

让我们假设我有以下C代码: static void handler(int sig, siginfo_t *si, void *unused) { printf(“BOOM!\n”); //another segfault here exit(-1); } int main(int argc, char *argv[]) { struct sigaction sa; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sa.sa_sigaction = handler; if (sigaction(SIGSEGV, &sa, NULL) == -1) perror(“failed to set handler”); // call other stuff here, somewhere in the callstack a segfault happens } […]

CMOCKA / Linker:’包装’很多function

我最近遇到了用于C的’ cmocka ‘模拟库。我能够模拟单个函数并成功测试调用函数。 现在我需要它用于我正在进行的项目,需要模拟大量的function。 如何将我想要模拟的所有函数传递给Linker的’wrap’参数? 是否可以将函数名称存储在文件中,以便可以将其链接到链接器?