注:以下内容是课程的教学资料,非本人作品,与大家分享和记录。
1、 在 CppUnit 中,一个或一组测试用例的测试对象被称为Fixture。Fixture 就是被测试的目标,可能是一个对象或者一组相关的对象,甚至一个函数。
① 初始化操作,比如:生成一组被测试的对象,初始化值;
② 按照要测试的某个功能或者某个流程对 fixture 进行操作;
③ 验证结果是否正确;
④ 清理工作,比如对 fixture 的及其他的资源进行释放等。
对 fixture 的多个测试用例,通常(1)、(4)部分代码都是相似的,CppUnit在很多地方引入了setUp和tearDown虚函数。可以在 setUp 函数里完成(1)初始化代码,而在 tearDown 函数中完成(4)代码。具体测试用例函数中只需要完成(2)、(3)部分代码即可,运行时 CppUnit 会自动为每个测试用例函数运行 setUp,之后运行 tearDown,这样测试用例之间就没有交叉影响。
对 fixture 的所有测试用例可以被封装在一个CppUnit::TestFixture 的子类(命名惯例是[ClassName]Test)中。然后定义这个fixture 的 setUp 和 tearDown 函数,为每个测试用例定义一个测试函数(命名惯例是 testXXX)。
class MathTest : public CppUnit::TestFixture {
protected:
int m_value1, m_value2;
public:
MathTest() {}
// 步骤(1)初始化函数
void setUp () {
m_value1 = 2;
m_value2 = 3;
}
// 测试加法的测试函数
void testAdd () {
// 步骤(2)对 fixture 进行操作
int result = m_value1 + m_value2;
// 步骤(3)验证结果是否争取
CPPUNIT_ASSERT( result == 5 );
}
// 步骤(4)没有什么清理工作
tearDown. void teardown () { }
}
3、提供的部分断言宏
• CPPUNIT_ASSERT(condition) // 确信condition为真
•CPPUNIT_ASSERT_MESSAGE(message, condition) // 当condition为假时失败, 并打印message
•CPPUNIT_FAIL(message) // 当前测试失败, 并打印message
•CPPUNIT_ASSERT_EQUAL(expected, actual) // 确信两者相等
•CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) // 失败的同时打印message
•CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta)// 当expected和actual之间差大于delta时失败
4‘被测项目的设置
① 在VC中,在菜单中,选择Project -> Setting -> C/C++ -> Category列表中选择'C++ Language’, 选择'enable Run-Time Type Information (RTTI)'。
② 在VC中,在菜单中,选择Project à Settingsà 'C/C++'à Category列表中选择'Code generation',在Use run-time library列表中,对于Debug版,选择'DebugMultithreaded DLL',对于release版,选择'Multithreaded DLL';
③ 在VC中,在菜单中,选择Project à Settingsà 'Link',在'Object/library modules'中添入需要的lib文件:cppunitX.lib (debug模式为cppunitd.lib, release 模式为cppunit.lib )、testrunnerX.lib(debug模式为testrunnerd.lib, release 模式为testrunner.lib,debug Unicode模式为testrunnerud.lib, releaseUnicode模式为testrunneru.lib)
• 对于可视化方式,需将testrunnerd.dll拷贝至工程目录下(非常重要,TestRunner.dll为我们提供了基于GUI的测试环境。为了让我们的测试程序能正确的调用它 estRunner.dll必须位于你的测试程序的路径下。)
5、框架剖析 核心
CPPUnit Core类图
1. Test所有测试的基类。
2. TestSuite表示一系列测试用例的集合,也可以包含其他TestSuite。
3. TestCase表示一个单一的TestCase。
4. TestFixture用于初始化和回收测试用例。
5. TestCaller用于封装一个TestFixture成TestCase。
6. TestRunner启动测试用例的主程序,可以通过addTest将需要运行的测试用例添加到单元测试程序中。
6、框架剖析 扩展解析
• 工厂类
TestFactory Test工厂的虚基类
TestSuiteFactory TestSuite工厂类,用于产生具体的TestSuite
TestFactoryRegistry该类有两个功能,第一个功能是作为仓库,提供接口让其他模块注册新的TestFactory。第二功能是作为TestFactory,调用注册进去的TestFactory 生Test,并且添加到一个统一的TestSuite中,并返回给调用者。
• 辅助类
TestSuiteBuilderContextBase该类是扩展中非常重要的一个类,该类用于将某个TestFixture中声明的TestCase添加到该TestFixture对应的TestSuite中。关于该类的作用可以等到解析HelperMacro时再分析。
TestNamer一个辅助类用于定义以及生成测试的名称。
• 帮助宏
1. CPPUNIT_TEST_SUITE
2. CPPUNIT_TEST
3. CPPUNIT_TEST_SUITE_END
4. CPPUNIT_TEST_SUITE_REGISTRATION