小编Cor*_*ran的帖子

GTest没有在单独的编译单元中找到测试

我有一个用C++编写的程序,其中一些子文件夹包含链接的库.有一个顶级的SConscript,它调用子文件夹/库中的SConscript文件.

在库cpp中,有一个GTest:

TEST(X, just_a_passing_test) {
EXPECT_EQ(true, true);
}
Run Code Online (Sandbox Code Playgroud)

在顶级程序源中有main(),它只调用GTests main,并且有另一个GTest:

int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

TEST(Dummy, should_pass){
EXPECT_EQ(true, true);
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我运行程序时,GTest只在main.cpp源代码中运行测试.忽略库中的测试.现在,当我在main.cpp中的同一个库cpp中引用一个不相关的类时,它变得奇怪,没有任何副作用(例如'SomeClass foo;'),测试神奇地出现了.我已经尝试使用-O0和其他技巧来强制gcc不优化未调用的代码.我甚至尝试过Clang.我怀疑它与GTest在编译期间测试发现的方式有关,但我找不到关于这个问题的任何信息.我相信它使用静态初始化,所以可能会有一些奇怪的排序.任何帮助/信息非常感谢!

更新:在FAQ中发现了一个听起来像这个问题的部分,尽管它特指Visual C++.其中包括一个技巧/黑客,强制编译器如果没有引用则不丢弃库.它建议不要在库中放置测试,但这让我想知道你如何测试库,而不是每个都有可执行文件,使得快速运行它们很痛苦并且输出膨胀. https://code.google.com/p/googletest/wiki/Primer#Important_note_for_Visual_C++_users

googletest

14
推荐指数
1
解决办法
4617
查看次数

对于集成测试应该嘲笑什么?

在阅读以测试为导向的面向对象的成长软件时,我了解了测试隔离和测试脆弱性.我们认为每个测试都应该对一段代码或功能非常具体,并且应该将测试代码覆盖的重叠保持在最低限度.隐含的理想是代码中的每个更改都应该导致只打破一个测试.避免花费时间经历多次破坏测试以确认一个更改是原因以及是否通过测试修改来修复.

现在这对于单元测试来说似乎很容易,但它们本质上是非常孤立的.但是,当通过集成测试呈现时,似乎很难避免多个测试执行相同的代码路径,特别是在单元测试之外运行时.

所以我的问题是,在进行集成测试时应该嘲笑哪些依赖项?有什么可以嘲笑的吗?是否应该测试单个执行路径,并且模拟与该代码路径不直接相关的所有副作用?

我正在考虑进行成对集成测试.测试两个对象之间的一个关系,并模拟其他一切.然后,除了通过成对形成完整的端到端测试链之外,其中任何一个对象中的更改对其他集成测试的影响应该最小.

感谢您的任何信息..

编辑:只是为了澄清,我基本上问"如何在正常的开发过程中避免大量失败的集成测试?".我假设是通过使用模拟来实现的,为什么我询问了要模拟的内容.

更新:我发现了一个关于JBRainsberger的集成测试的非常有趣的讨论,我认为这个答案相当好,如果可能有点争议的话.标题是"集成测试是一个骗局",所以你可以猜测,他根本不提倡集成测试(端到端类型测试).认为积分测试总是远远低于彻底测试可能的相互作用所需的量(由于组合爆炸),并且可能给出错误的信心.相反,他建议他称之为协作测试和合同测试.这是一个90分钟的谈话,不幸的是白板不是很清楚,没有代码示例,所以我仍然围绕它.当我有清楚的解释时,我会在这里写出来!除非别人打败我...

以下是合同测试的简要概述.听起来像契约类型断言,我相信可以/将在C++中以非虚拟接口模式实现.

http://thecodewhisperer.tumblr.com/post/1325859246/in-brief-contract-tests

集成测试是一个骗局视频讲座:http: //www.infoq.com/presentations/integration-tests-scam

摘要:

集成测试是一个骗局.您可能正在编写需要进行彻底测试的2-5%的集成测试.你可能在整个地方重复单元测试.您的集成测试可能会在整个地方相互重复.当集成测试失败时,谁知道什么坏了?了解解决问题的双管齐下的攻击:协作测试和合同测试.

integration-testing unit-testing mocking

5
推荐指数
1
解决办法
519
查看次数

声明模板类型以调用make_pair

也许我是傻瓜,但我不明白这段代码的问题是什么.我开始怀疑我的工具了.我正在使用Clang(C++ 11)及其libc ++.如果这是我的错,我道歉并提前感谢谁指出我的愚蠢,但如果不是,也许这是一个更深层次的问题..

std::map<int, bool> map_;

map_.insert(std::make_pair<int, bool>(5, true)); //Use a literal, compiles OK

int x = 5;
map_.insert(std::make_pair<int, bool>(x, true)); //Use a local of same type, compile error: 'no known conversion from 'int' to 'int &&' for 1st argument'
Run Code Online (Sandbox Code Playgroud)

c++ clang c++11 libc++

1
推荐指数
1
解决办法
488
查看次数

模板类成员函数之间的循环依赖关系

给定两个模板类,每个模板类都有成员函数,这些函数引用其他类中的成员函数,如何才能完成?如果有的话.通过使用前向声明来允许循环依赖,意味着该定义不适用于引用的成员函数.因此,出现了关于未定义类型的隐式实例化的错误.成员函数的定义不能推送到cpp文件,包含完整的类定义而不是前向声明,因为它必须存在于头中以允许在使用/调用时进行编译器实例化.

template<typename T>
class A {
    void foo(B &b) { b.bar(); };
    void bar() {};
}

template<typename T>
class B {
    void foo(A &a) { a.bar(); };
    void bar() {};
}
Run Code Online (Sandbox Code Playgroud)

现在我知道第一个响应将是"更改你的代码",但我正在尝试一些东西,这是我能看到的唯一方法.所以我对C++中的上述内容是否完全感兴趣.提前谢谢了!

c++ templates

1
推荐指数
1
解决办法
33
查看次数