在使用UnitTest ++对单元测试进行编码时,我正面临着麻烦.我想知道如何以干净的方式(或者任何方式......)访问私有成员类字段
到目前为止,我有一个解决方案,使用派生自被测试类的类夹具访问受保护的成员.以下代码显示了这个想法:
struct MyFixture : ClassUnderTest { };
TEST_FIXTURE(MyFixture, OneTest)
{
do_something();
CHECK(protected_field == true);
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,我认为这不是很干净,因为在某些配置中可能会出现与继承有关的问题,无论如何,只有受保护的成员才能被访问和测试.
我试图将测试类声明为朋友,但由于这些是由UnitTest ++以某种特殊方式创建的,我还没有设法做到这一点.
有没有人知道如何让测试类成为被测试类的朋友?
是否有另一种方式以更容易或不同的方式解决这个问题?
谢谢大家.
如何使用UnitTest ++运行单个测试?
我正在运行UnitTest ++.我的main功能如下:
int main()
{
printf("diamond test v0.1 %s\n\n",TIMESTAMP);
diamond::startup();
UnitTest::RunAllTests();
diamond::shutdown();
printf("press any key to continue...");
getc(stdin);
}
Run Code Online (Sandbox Code Playgroud)
对于调试我想写一些UnitTest::RunSingleTests("MyNewUnitTest");代替的东西UnitTest::RunAllTests();.UnitTest ++是否提供了这样的功能?如果是,那么语法是什么?
我的源代码和构建树看起来像这样(参见Makefile将目标文件从源文件不同的目录放入一个单独的目录?)make之后(构建并运行FooAndBarTests):
src
- Foo.cpp
- Bar.cpp
inc
- Foo.h
- Bar.h
test
- FooTest.cpp
- BarTest.cpp
- Main.cpp
- Makefile
- obj
- Foo.gcda
- Foo.gcno
- Bar.gcda
- Bar.gcno
- FooAndBarTests
UnitTest++
- libUnitTest++.a
- src
- ...
Run Code Online (Sandbox Code Playgroud)
然后我可以通过运行gcov -o obj/ ../src/Foo.cpp和生成测试目录中的.gcov文件gcov -o obj/ ../src/Bar.cpp.
但如果我跑,lcov -d obj/ -c -o FooAndBarTests.lcov我得到:
Capturing coverage data from obj/
Found gcov version: 4.2.1
Scanning obj/ for .gcda files ...
Found 4 data files in …Run Code Online (Sandbox Code Playgroud) 这是我的基本示例中的当前代码:http://unittest-cpp.sourceforge.net/UnitTest++.html
#include <unittest++/UnitTest++.h>
TEST(FailSpectacularly)
{
CHECK(false);
}
int main() {
return UnitTest::RunAllTests();
}
Run Code Online (Sandbox Code Playgroud)
在包括存在,但我收到的错误:undefined reference to UnitTest::Test::*和UnitTest::*这里*是单元测试++库中的一些任意的类/方法.
如何才能正确编译?
在scons中,我试图建立一个UnitTest系统(见下面的代码),基于这里的一个很好的例子:http://spacepants.org/blog/scons-unit-test
然而,由于最近的scons 2.0.1及更新版本中存在问题,这会产生依赖性循环,如下所述:http://old.nabble.com/AddPostAction-executes-on-first-build-but-not-subsequent- td18360675.html(和其他地方).
有谁知道这个问题的良好解决方案或替代解决方案?
码:
def UnitTest(env, target, source, **kwargs):
curTest = env.Program(target, source, **kwargs)
env.AddPostAction(curTest, curTest[0].abspath)
env.Alias('unit_tests', curTest)
env.AlwaysBuild(curTest)
return curTest
SConsEnvironment.UnitTest = UnitTest
mandolineTest = env.UnitTest(target='./codeTest',
source = mix(['test.cc', 'base.cc'),
LIBS = default_libs + ['bgl',],
LIBPATH = default_libs_path,
CPPPATH = default_includes )
Run Code Online (Sandbox Code Playgroud) 我在UnitTest ++中编写了一些单元测试,并希望编写一些共享一些公共资源的测试.我认为这应该通过他们的TEST_FIXTURE设置工作,但似乎是为每个测试构建一个新的夹具.示例代码:
#include <UnitTest++.h>
struct SomeFixture {
SomeFixture() {
// this line is hit twice
}
};
TEST_FIXTURE(SomeFixture, FirstTest) {
}
TEST_FIXTURE(SomeFixture, SecondTest) {
}
Run Code Online (Sandbox Code Playgroud)
我觉得我必须做错事; 我曾经认为拥有夹具的重点是设置/拆卸代码只发生一次.我错了吗?还有什么我需要做的才能让它以这种方式工作吗?