lilycheng 发表于 2009-9-1 15:21:18

C++test之单元测试

1. 单元测试的概念
“单元测试”是指在最简单的功能点测试软件代码,该功能点通常是单个类,或者一个函数。单元测试通常由开发人员在项目开发周期内执行,而不是在 QA 阶段进行。通过使用单元测试,您可以确保应用程序构建块在集成之前的可靠性,从而提高整个应用程序的质量。如果测试进行得早,则识别和修正缺陷的难度通常较低,耗时也较少。

手动单元测试通常涉及手工编写测试集、指定输入数据以及为缺少的函数提供桩函数。 C++test 可将这些结果自动化,以使得单元测试更有效率,更具一致性。

2. 单元测试的内容

通常,单元测试可能包括:

异常测试(也称为白盒测试、压力测试、结构测试或可靠性测试),用来确认代码的结构可靠性,能处理所有可行的输入以及输入组合,不会产生预料之外的异常。

功能测试,用于验证所建立模块是否符合需求和功能是否正常工作。在单元级别创建功能测试涉及到人工输入,以指定特定的输入和状态条件、以及预期的输出。功能测试可以作为白盒测试来实施(在了解接受测试的单元的内部组织和实现的情况下进行测试),或者黑盒测试,后者仅基于接受测试的单元的外部行为进行。

回归测试,用来验证现有代码行为不会随着代码库改进而更改。完成此测试的通常做法是,开发一组测试,验证它们的正确性,在代码更改之后运行它们,以捕获代码行为中的偏差。回归测试可能要依赖于异常测试和功能测试。

3. C++test的单元测试功能

C++test 可以执行上述所有类型的单元测试;可以自定义所执行测试的级别和范围,以便体现您的需求和测试习惯。

当您运行 C++test 自动生成的测试用例时,请执行异常测试。此类测试可暴露意料之外的异常,并检查类在结构方面是否合理。可靠性测试能否成功,取决于代码是否能完全覆盖,因此必要时,您可能会想要扩展自动生成的测试用例,以增强代码覆盖率。C++test 可测量测试覆盖率,以有助于您评估覆盖率,并确定哪些地方需要附加测试。

当您扩展自动生成的测试用例,以验证类的公共接口是否按照规范所述运行时,请执行功能测试。

回归测试涉及到定期测试改进的代码库,其做法是运行所有可用的测试用例,并检查预期的结果是否发生更改。在当前测试的测试用例结果与预期的测试用例结果不匹配时,C++test 会报告错误消息。

测试用例可以用C或C++源码实现和保存。您可以在 IDE 的文本编辑器中扩展和修改生成的测试用例。这些测试用例使用与通用的 CppUnit 格式类似的格式。 C++test的测试提供了比 CppUnit 更广泛的能力,包括可以测试C代码,并在测试框架内,提供对私有和保护成员数据以及成员函数的访问。现有的CppUnit 测试用例可以导入到 C++test 中,与自动生成的测试用例配合使用。

4. C++test的测试用例生成

编写单元测试是一项重要结果,它确保了代码的质量。单元测试不仅能暴露错误和功能问题,而且能作为常规的回归测试运行,以有助于您确定代码的添加/修改是否破坏了现有功能,或者是否造成意外的更改。

不过,编写测试是一项耗时的工作,如果不仔细就可能会遗漏重要的情况。C++test 提供的单元测试支持,可帮助开发人员和测试人员非常快速地创建良好的单元测试。C++test 之所以能提供帮助,是因为它自动生成许多单元测试,允许用户自定义测试生成和执行,以符合他们的参数选择和需求。

C++test 自动生成大量测试用例,这些测试用例会试图执行代码中的所有不同路径,然后保存实际的测试用例结果。从本质上来讲,这些测试用例就好比在对代码的当前状态照 x 射线,在修改代码之前拍摄代码运行情况的快照。它们还有助于识别可能影响代码可靠性和安全性的潜在异常状况。

C++test 可以为任何C/C++代码生成从单个函数到整个项目的测试用例。通过在 C++test 中运行这些测试用例,您可以验证类的健壮性,识别可能造成程序进入不一致状态或终止状态的输入。您可以自定义预先配置的测试方式、以及特定的测试生成设置。

测试用例可以用C 或 C++ 源码来实现和保存(所用语言取决于要测试的原始源码)。这些测试用例使用与通用的 CppUnit 格式类似的格式。C++test 的测试提供了比 CppUnit 更广泛的功能,包括可以测试C代码、并在测试框架内提供对私有和保护成员数据以及成员函数进行访问的功能。

现有 CppUnit 测试用例可以导入到 C++test 中,与自动生成的测试用例配合使用。可以通过用户定义的测试用例对测试套件进行扩展,以改进测试覆盖率并验证特定的功能;可以通过修改自动生成的测试用例、或定义新的测试用例,来添加这些测试。对于回归测试,可以自动验证和配置任何可用的测试用例。通过保存所有可用的测试用例,并充分将它们用于自动回归测试,您可以建立一个回归测试基础结构,快速地识别因代码修改而引入的意外功能更改和异常。

自动测试用例生成的功能,允许您在更短的时间内创建更有效的测试套件。测试用例的开发,历来是单元测试过程中最耗时的部分。通过使用 C++test,您无需编写任何代码以生成一组使用每一个类的基础测试用例,您可以通过向自动生成的测试用例添加少量代码来创建更多的测试用例。通常,您无需为简单方法编写测试用例而担心,可以将资源集中于更复杂方法的扩展/添加测试。

5. 导入待测工程

按照前面介绍的方法导入Cal_coverag工程作为待测工程。

二、C++test之单元测试

1.配置Unit Tests

(1)在C++test下拉菜单下选择“Test Configurations(测试配置)”,如图2-1所示。

(2)在出现的窗口左侧,展开Unit Tests(单元测试)文件夹,右键单击Generate Unit Tests(生成单元测试),选择Duplicate(副本),此后在User-defined文件夹下会出现Generate Unit Tests,同理生成Run Unit Tests的副本,然后单击Close关闭窗口,如图2-2所示。

2.运行Unit Tests

(1)在工程浏览器中选中Cal_coverage,右键选择C++test->Test Using->User-Defined->Generate Unit Tests,如图2-3所示。

(2)运行Generate Unit Tests之后,在工程浏览器的Cal_coverage目录下会出现一个名为tests的文件夹,里面包含了测试用例,如图2-4所示。

(3)在工程浏览器中选中Cal_coverage,右键选择C++test->Test Using->User-Defined->Run Unit Tests,与(1)类似。

3.查看运行Unit Tests的结果

(1)选择C++test面板查看测试结果,如图2-5所示。

(2)双击Outcome:int _return=1,会提示自动生成的测试用例中相应的语句行,如图2-6所示。

(3)在C++test面板中,右键单击单元测试任务,选择Verify All Outcome,可以验证所有单元测试的任务,如果只需要验证其中某条任务,选中该任务,右键单击选择Verify Outcome即可,如图2-7所示。

(4)选择某一条任务进行验证,对应的单元测试用例中代码会记录验证值,同时任务数会减少一个,如图2-8所示。

4. 根据覆盖率添加用户自定义测试用例

(1)在主菜单栏中选择C++test->Show View->Coverage,打开覆盖率面板,在编辑器视图中会出现红绿条纹,绿色表示该语句被测试用例覆盖到了,红色则未覆盖到,如图2-9所示。

(2)在主菜单栏中选择C++test->Show View->Test Case Explorer,打开测试用例浏览器,然后选中自动生成的测试的名称(如TestSuite_Cal_coverage_c_1e843437等),如图2-10所示。

(3)在出现的测试用例向导窗口中,修改用户自定义测试用例名称,然后点击Next,如图2-11所示。

(4)由(1)知,flag=4,n2=0,result=0(n1任意取值)这组数据没有测试到,故在新建测试用例窗口中双击flag,将其值改为4,再将_return值改为0,单击Finish,如图2-12所示。

(5)在编辑器的测试用例代码中会多出一段用户自定义测试用例,如图2-13所示。

(6)如前所介绍的方法,再次运行单元测试,会发现所有的语句都被覆盖到了,覆盖率为100%(对比图2-9),如图2-14所示。

如果需要被测试的Cal_coverag工程,请到www.tryarm.com的“资源共享”区下载
最新版本C++test免费下载:www.edukit.com.cn

sandy-guo 发表于 2015-1-4 15:51:03

顶一个
页: [1]
查看完整版本: C++test之单元测试