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

为单元测试编写复杂的预处理器宏

  •  1
  • erik  · 技术社区  · 16 年前

    我正在使用一个单元测试套件,它劫持函数调用并测试预期的输出值。

    正常的布局要求每个期望值都有一个单元测试代码块。

    因为我的代码使用了大量的枚举,所以我想使用一些for循环/宏魔术来自动化自动化测试,我正在寻找一些关于编写它的建议。

    这里是一个测试代码块,我需要重复x次:

    START_TEST("test_CallbackFn");
    
    EXPECTED_CALLS("{{function1(param_type)#default}{function2(param_type)#default}}");
    
    CallbackFn();
    
    END_CALLS();
    END_TEST();
    

    现在,这是我所设想的

    for (int i = 0; i < 10; i++)
    {
      RUN_TEST(i)
    }
    

    现在,我想用上面提到的代码定义run_test,除了需要替换字符串 违约 当前值为 我 . 让我失望的是现有的expected_calls宏中存在的引号和。

    4 回复  |  直到 10 年前
        1
  •  2
  •   Jonathan Leffler    16 年前

    我想我会考虑使用一个单独的宏处理器,而不是试图击败C预处理器提交。人们所指的典型例子是 m4 ,但为了这个,你最好 awk 或 perl 或 python 或者类似的东西。

        2
  •  1
  •   bta    16 年前

        3
  •  0
  •   torak    16 年前

    EXPECTED_CALLS 若要接收默认值替换为默认值的字符串,则需要删除 #default 从绳子上。即

    EXPECTED_CALLS("{{function1(param_type)#default}{function2(param_type)#default}}"); 
    

    应该是

    EXPECTED_CALLS("{{function1(param_type)"#default"}{function2(param_type)"#default"}}"); 
    
        4
  •  0
  •   Matthieu M.    16 年前

    可能是: Boost.Preprocessor 确实令人印象深刻。

    对于枚举来说,这可能有点困难,但是boost.preprocessor中的每个循环都有。

    使用外部脚本的生成方法的问题是,它可能需要外部化而不仅仅是测试。除非你计划实现一个C++解析器,它在最好的时候被认为是棘手的。

    因此,您需要生成枚举(例如,将它们存储在json中),以便能够在之后为这些枚举生成测试……事情开始变得毛茸茸的:/