【问题标题】:Custom assertions in a c++ unit testerc++ 单元测试器中的自定义断言
【发布时间】:2012-12-23 22:15:08
【问题描述】:

我正在开发一个 c++ 单元测试器(主要是作为练习)并且对我的实现有一些疑问。 我希望能够重载自定义断言,因此我决定将它们实现为包装在命名空间中的函数。

我目前的实现如下:

Tester.h
#include <string>

#define INFO __FILE__, __LINE__

namespace Tester
{
    void Assert(char const* input, char const* file_path, int line_number, std::string error_message);
    ...more overloaded Asserts and some Log functions...
}

当我调用函数时:

#include "Tester.h"
...code...
    Tester::Assert(false, INFO, "Some message");
...code...

这可行,但我不确定“INFO”宏是否是好的做法。 我欢迎有关此实现的所有建议和指示,如果没有任何意义,请随时告诉我,我应该做一些完全不同的事情;)

【问题讨论】:

    标签: c++ unit-testing macros assert


    【解决方案1】:

    INFO 作为一个宏看起来非常好。另一种选择,我更喜欢有一个宏

    #define TEST_ASSERT(condition, message) Tester::Asssert(condition, __FILE__, __LINE__, message)
    

    或类似的东西。

    如果你有不同数量的参数,这样的事情可能会起作用:

    #define TEST_ASSERT(condition, ...) Tester::Asssert(condition, __FILE__, __LINE__, __VA_ARGS__)
    

    假设您的编译器足够新,也就是说。

    【讨论】:

    • 这是一种非常标准的方法,是的,它非常简洁。 [而且,当您将它用于非测试 ASSERT 时,您可以 #define 它为空,并且仍然摆脱所有断言 - 例如用于生产构建]
    • 感谢您的快速回复。这实际上看起来好多了,我真的想摆脱那个'INFO',但是我必须为每个重载的 Assert 实例定义一个新的 ASSERT 宏。例如:Tester::Assert(false, INFO, "Some message"); Tester::Assert(false, INFO, "Some message", "Error severity") 这两个不能使用相同的宏,因为它们接受可变数量的参数。也许我不应该使用重载的断言? -弗雷迪
    • 我已经更新了一个可变参数宏,它接受任意数量的参数(包括无参数)。
    • 哇,非常感谢,这正是我想要的!我听说过 VA_ARGS 但一些论坛不鼓励使用它,如果我没记错的话,它不是标准的。但它对我来说很好(visual studio 2010 编译器)-Freddie
    • @user1925608 目前的 ISO/IEC 14882:2011 标准可变参数宏是兼容的。请参阅此SO link(接受的答案已过时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多