如何在断言之前准备消息?

How to prepare message before Assertion?

我是测试新手,刚开始使用“CppUnitTest.h”(Visual Studio2019)。断言静态函数运行良好,示例:

static void Assert::IsTrue(
    bool condition,
    const wchar_t* message = NULL,
    const __LineInfo* pLineInfo = NULL)

但我发现当这样的函数最终发现错误时 - 它会立即中断程序(在我的案例测试中),并且只做一件事 - 显示消息,我应该在 before 这样的断言执行。

在测试中,使用循环,我可以在每次迭代中准备完整的消息,但最终 运行 完整测试需要 6-8 倍的时间。因此,这里的合理意图是仅在中断之前为断言指定一次复杂消息。

感觉应该有这个方法,但是我自己在网上找不到。

我的例子: 整个测试(顺便说一句,知道为什么测试 window 中的 UnitTest1 嵌套了 3 次吗?): P.S。在测试中,window 是最后一个断言,仅显示 'iter' wchar,根本未使用 'msg'。 主要:

bool applicableAge(UINT age)
{
    if((age>=18 && age<= 50)|| age==1000111222) return true;
    else return false;
};

更新 @churill

我认为没有必要粘贴我对关卡“Hello World”的简单测试。想象一下你有一个函数,它采用简单的 uint,我的测试想要测试每个可能的输入(超过 40 亿),现在想象我(故意)在我的目标函数中输入了错误,假设它产生了错误 return如果输入是 uint 1000111222,现在,在我的测试循环中,我必须在每次迭代时编写消息,这需要 至少 3 个操作:1)用初始值初始化 wchar_t消息, 2)_itow(i, num, 10); -将当前迭代数字转换为文字,3)wcscat(msg, num); - 将必要的文本部分合并为单个 wchar_t,现在我才可以将其作为参数放入 Assert。

现在假设我正在做 3x for 循环的嵌套,这需要将 3 个不同的 'i' 转换为文本,然后将所有这些合并到单个消息。然后很明显,测试功能的 80% 是在编写实际消息,而 20% - 是对生产代码功能的实际测试。

我的这个问题的目的是找出有经验的聪明人会做什么样的把戏。

我坚信,那应该是类似“Assert::isAboutToBreak()”的函数(假设),这样程序员就只能合并一次消息,如果你考虑一下,这是有道理的,断言可以在程序中只执行(失败)一次,当我将这么多程序资源用于 'preCombine' 消息 each 时间时,我觉得有点傻。

首先:您的代码有未定义的行为。数组不会自动增长,因此 wcscat(msg, iter) 将始终写出边界,而 _itow(i, iter, 10) 将始终写出 i > 99。我会选择 std::wstring and/or std::wstringstream.


但很明显,与编写错误消息的时间相比,您正在测试的代码几乎没有花费任何时间。

您可以手动断言条件(没有 Assert::IsTrueAssert::IsFalse),只有在失败时才编写错误消息并使用 Assert::Fail.

发布

粗略示例:

auto expected = calculateExpectedValue();
auto actual = functionYouWantToTest();

if(expected != actual) {
    std::wstring message = composeMessage();
    Assert::Fail(message.c_str());
}