代码之家  ›  专栏  ›  技术社区  ›  BuggerMe

如何使用#defines最佳地打开/关闭单元测试

  •  1
  • BuggerMe  · 技术社区  · 15 年前

    我有一个单元测试的文件

        testOne() {...}
        testTwo() {...}
    ...
    

    但是当我排除故障时,我想关闭除单元测试之外的所有测试

    #if 0
    testOne() {...}
    #endif
    ..
    #if 1
    testTroublesome() {...}
    #endif
    

    但我想知道有没有更好更方便的方法?

    2 回复  |  直到 15 年前
        1
  •  1
  •   falstro    15 年前

    例如,您可以有一个环境变量来表示要运行哪个测试,unset表示全部运行它们(这是通常的情况)。像这样:(这是C,但我认为它也适用于目标C)

    char *env = getenv ("MY_TEST_ENV");
    

    if (! env || 0 == strcmp (env, "testOne"))
      testOne();
    

    或者你可以把同样的条件放在测试本身中,如果失败就返回。这不会阻止你的测试被编译,但我不认为这是你的问题,是吗?只需将环境变量设置为要运行的测试,其他变量都不会。

    编辑
    为了更简单,把它放在宏中

    #define RUN_TEST(fn) do{if(!getenv("MY_TEST_ENV")||!strcmp(getenv("MY_TEST_ENV"),#x))x();}while(0)
    

    总是用它来执行你的测试

    RUN_TEST(test_one);
    

    ... 你已经有了一个小的单元测试框架。不过,在做得太过火、重新发明太多轮子之前,您应该(正如已经指出的那样)看看现有的框架。

        2
  •  1
  •   Péter Török    15 年前

    两个注意事项:

    • 大多数单元测试框架提供了将测试组织成套件的可能性,因此您只能运行特定的测试。
    • 您应该考虑重新配置登录单元测试,以便不生成任何日志。单元测试输出应该尽可能简单,以避免将您的注意力淹没在无用的细节中。也就是说,如果所有测试都通过了,您应该看到的唯一输出是类似于“123个测试通过了”。或者如果有错误,则是失败测试的名称和相关的错误消息。