【问题标题】:How do I test custom error messages with the help of CUnit?如何在 CUnit 的帮助下测试自定义错误消息?
【发布时间】:2021-05-30 03:09:12
【问题描述】:

大家好,我是 Cunit 的新手。我的问题在代码下方,如果你愿意,可以跳过它。我做了一个小函数,将两个正整数相加并返回结果,如果任何整数小于或等于零,然后它会向 stderr 写入错误消息。

/*This file is dummy.c*/
#include "dummy.h"

int add(int a,int b)
{
   if(a<=0||b<=0)
   {
       fprintf(stderr,"Error in arguments");
       exit(EXIT_FAILURE);
   }
   else
       return a+b;
}

这是 dummy.h

#include<stdio.h>
#include<stdlib.h>

int add(int a,int b)

这是我的 CUnit 测试代码的一部分。文件名是 testdummy.c

/*Necessary files have been included*/
void addtest()
{
    CU_ASSERT_EQUAL(add(3,5),8);
    CU_ASSERT_EQUAL(add(1,6),7);
    /*What should I add here*/
}

我应该在指定的部分添加什么,以便我的代码也可以测试错误消息?

【问题讨论】:

    标签: c unit-testing testing error-handling cunit


    【解决方案1】:

    您的代码中的错误情况很棘手。它不是为测试而设计的。它直接调用 libc 函数,更糟糕的是,它调用了exit()。 IIRC CUnit 不支持模拟 libc 函数。因此,我看到了两种半可能性:

    1. 使用支持模拟的测试框架(我相信谷歌测试支持)。
    2. 在测试上下文中通过一些丑陋的宏 hack (#define) 重新定义 libc 函数(fprintf()exit())。
    3. 也许你可以通过设置fprintf() 的文件句柄来做一些丑陋的黑客攻击,以一种你可以读取输出来断言的方式。但是你仍然留下了exit() 电话。

    了解模拟以及如何编写可测试的代码。您的代码很难测试。不一定。

    【讨论】:

    • Redefine the libc functions (fprintf() and exit()) via some ugly macro hacks (#define) 请注意,在带有glibc 的Linux 上,您可以像这样模拟void exit(int status) { /* some stuff */ __libc_exit(status); }
    • @EricSchaefer。感谢您的指导,但我无法删除退出功能。这是因为这只是一个让我的问题保持简单的虚拟代码。原始代码将导致用户(我的非 CS 朋友)无法理解的分段错误。我会尝试你的建议。 我的主要目的是在程序无法继续时进行错误处理并编写有意义的错误。那么您知道任何其他错误处理方法,请指导我。也再次感谢您的帮助。
    • @prithvisinghtewatia 我的意思是,你可以调用你提供的其他函数,然后调用 exit,但前提是你当前没有运行测试。
    • @EricSchaefer Google 测试有效。谢谢。 :)。另外,我明白你的意思。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多