Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TEST()名称中没有下划线的规则有多严格?_C++_Googletest - Fatal编程技术网

C++ TEST()名称中没有下划线的规则有多严格?

C++ TEST()名称中没有下划线的规则有多严格?,c++,googletest,C++,Googletest,说: TEST()。第一个参数是测试用例的名称,第二个参数是测试用例中的测试名称。这两个名称必须是有效的C++标识符,并且它们不应该包含下划线( > < > < /p> 这让我感到惊讶,因为我通常用下划线(而不是CamelCase)来命名测试,例如: 看来测试做得很好 我的问题是,这个无下划线规则有多严格?如果我把它弄坏了会发生什么?来自一位Vlad Losev(见),当时他正在谷歌从事测试产品的工作: 这一限制是为了给我们在实施测试时提供一些灵活性。有朝一日,我们可能会决定改变实现,并依赖

说:

TEST()。第一个参数是测试用例的名称,第二个参数是测试用例中的测试名称。这两个名称必须是有效的C++标识符,并且<强>它们不应该包含下划线(<代码> <代码> > < <强> > < /p>
这让我感到惊讶,因为我通常用下划线(而不是CamelCase)来命名测试,例如:

看来测试做得很好

我的问题是,这个无下划线规则有多严格?如果我把它弄坏了会发生什么?

来自一位Vlad Losev(见),当时他正在谷歌从事测试产品的工作:

这一限制是为了给我们在实施测试时提供一些灵活性。有朝一日,我们可能会决定改变实现,并依赖于这一假设。[然后]与之不符的用户代码可能最终会被破坏。因此,请尝试保持您的测试用例名称没有下划线

因此,即使您采用标准语言方法,其中规则由
必须
表示,而指导原则由
表示,建议您遵循上述指导原则,以便更确定您的代码将来不会被破坏


在随后的讨论中,我们还明确指出,带有下划线的某些参数可能会导致名称以下划线开头或包含两个或多个连续的下划线,这两个下划线在用户代码中在技术上都是“无效”的(它们是为实现保留的)。

谷歌测试在其测试中回答了这个问题。总之,

  • 开头或结尾的测试名称很容易生成无效标识符
  • <> >在大多数情况下,在中间有<代码> < <代码>的测试名称是很好的。但是,

    TEST(Time, Flies_Like_An_Arrow) { ... }
    TEST(Time_Flies, Like_An_Arrow) { ... }
    
    将生成相同的名称

为简单起见,该规则设置的约束比必要的多,它还为谷歌测试提供了一些空间,以防其实现在未来需要更改

因此,总而言之:

如果您违反了规则,可能不会立即产生后果,但您的测试可能(只是可能)在使用新编译器(或您正在使用的编译器的新版本)或新版本的Google测试时中断。因此,最好遵守规则


我猜这是因为IIRC,在内部它们连接名称,用下划线分隔,所以TEST(foo,bar_-foo)和TEST(foo_-bar,foo)将具有相同的内部名称,导致编译错误…我跟踪了TEST宏,它将扩展到
#define GTEST_TEST_CLASS_name(TEST_case_name,TEST_name)TestAlgCaseNoNo.C++测试名<测试测试> <代码>我认为他们不想用下划线来命名任何东西,因为它们不希望生成的名称具有双分数,这是根据C++标准的未定义行为,并且在稍后讨论时,如果允许下划线,则某些测试可能会相互复制。
TEST(Time, Flies_Like_An_Arrow) { ... }
TEST(Time_Flies, Like_An_Arrow) { ... }