C:如何对不带任何参数且主程序链接到单元测试框架的函数进行单元测试?

标签 c unit-testing

我正在使用 minunit C 应用程序的测试框架。我有一堆 GUI 工作的函数,但我不确定需要做什么。 我已经创建了一个主程序库并将其链接到我的单元测试框架,因此我可以访问所有功能。

这是我需要测试的示例函数。

int
main_gui_init()
{
    GladeXML  *main_window;
    main_widgets_t *widgets;
    zlog_category_t *zc;

    zc = zlog_get_category(LOG_CATEGORY);

    /* load the interface */
    main_window = glade_xml_new(MAIN_GLADE_FILE, NULL, NULL);

    if (!main_window) {
        zlog_error(zc, "Failed to load main interface");
        return -1;
    }

    widgets = (main_widgets_t *) malloc (sizeof(main_widgets_t));

    if (!widgets) {
        zlog_error(zc, "Failed to allocate memory for widgets");
        return -1;
    }

    /* Initialize widgets we are interested in */
    main_gui_init_widgets(main_window, widgets);

    /* connect the signals in the interface */
    main_gui_register_callbacks(main_window, widgets);

    zlog_info(zc, "Main gui init done.");
    return 0;
}

这就是我想测试它的方式:

/* Test main_gui_init() */
char* run_all_main_gui_init_test()
{
    /* Functions are not yet written but the name 
       shows what needs to be tested */ 
    mu_run_test(test_main_gui_init_valid);
    mu_run_test(test_main_gui_init_invalid_main_window);
    mu_run_test(test_main_gui_init_malloc_fail);
}

/* Starting point. Specify all the functions that needs to be tested here */
char* run_all_main_gui_tests()
{
    run_all_main_gui_init_test();
}

如何编写测试程序?我可以为每个测试用例编写一个 stub ,例如,让函数 glade_xml_new() 返回 NULL,但是由于我已经链接了主程序,所以它不允许我对相同的函数定义两次。

我需要做什么?

最佳答案

您需要包含一个模拟库,我不建议您自己这样做。一个不错的选择是 cmocka它在 c 库上作为依赖项使用,并允许您使用模拟重新定义对象。

否则,在 C 中,您唯一的选择是使用预处理器或链接器来模拟您的依赖项。

关于C:如何对不带任何参数且主程序链接到单元测试框架的函数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25002016/

相关文章:

c++ - 给定整数 n 决定是否可以将其表示为两个整数的平方和

将变量转换为结构定义中定义的 union 类型

unit-testing - 单元测试中什么是正向测试和负向测试

java - 无法在 Spring 3.2.8 和 junit 4.4 中 Autowiring 现场执行 Junit 测试

visual-studio - 如何在 Visual Studio 中将单元测试与集成测试分开?

c - 如何使用 openssl 加载 pkcs12 并将其转换为 char* ?

Python ctypes & libspeex.dll/libspeex.so; #define、typedef 和结构的等价物是什么?

c - C语言如何退出控制台屏幕

angular - 构造函数中的 SpyOn 服务函数调用

c# - 单元测试时 HttpContext.Current 为空