这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

c++test v7.1初级试用——3

上一篇 / 下一篇  2008-05-16 14:24:41 / 个人分类:C++test

在前两次的试用中,借助于一个小例子,c++test的基本功能点都已经试过。下面先简单回顾一下c++test是如何用于代码测试的。

今天我的任务是试用c++test中如何手动编写“使用数据源”的测试用例。没看明白,没关系,继续往下看,慢慢就明白了。

虽然说c++test有能力自动生成测试用例,但其自动生成的用例还是更偏重于"白盒",目的是为了验证代码本身的可靠性和健壮性。如果要想对被测单元做完整的黑盒测试,即功能测试,用户可能还需要有针对性的手动补充一些用例,当然自动生成的部分白盒用例在一定程度上也可以充当黑盒的用例的。

还是以第一天的代码为例,代码如下:

第一次使用了c++test的Generate Unit Tests功能(即自动生成测试用例),今天我要手动编写用例对以上代码做单元级的功能测试。创建项目并且导入被测源文件后,不要运行Generate Unit Tests。

手动编写用例有两种方式:

× 参照c++test自动生成用例的方法写代码,每一个函数当作一个用例,包含了输入、预期输出、实际输出等信息,例如

这种方法简单,容易理解,但不容易维护。一旦用例较多,需要编写很多类似这样的函数,在用例的统计和汇总方面比较困难,因为它需要用户手动从各个函数中提取输入值。

× 使用基于数据源的测试用例。用例中的输入和预期输出保存在数组或者CSV数据文件中,只需要写一个用例函数,就可以自动实现依次从数组或者CSV数据文件取数值的方式,实现自动化的运行。

1 使用数组数据源的实现方法:

  选中cal.c后,选择“新建--其他--TestSuite”,给本次Test suite起名“Suite”,保存在tests文件夹中,选择C语言(被测代码用的C,所以测试代码也用C),如下

注意:Test Suite Name最好只是字母,不能带下划线。

下一步后,添加用例case_1,然后完成。打开Suite_1.c后,其中的代码还需要做一些改动。改动后的代码及解释如下:

#include "cpptest.h"

CPPTEST_CONTEXT("/cal/cal.c");

/*CPPTEST_TEST_SUITE(Suite);*/
/*CPPTEST_TEST(Suite1_case_1);*/
/*用CPPTEST_TEST_DS替代CPPTEST_TEST
 *用CPPTEST_TEST_DS,可以创建可以访问数组数据源的测试用例
 *CPPTEST_DS_REPEAT(NUMBER), 说明:测试用例将被执行 NUMBER 次。
 * */
CPPTEST_TEST_DS(Suite_case_1,CPPTEST_DS_REPEAT(5));
CPPTEST_TEST_SUITE_END();
       
void Suite_case_1();
/*定义输入及预期输出、实际输出的数组
 * 数组的大小即为测试用例的个数,这里假设补充了5个用例
 * */
     int arg_1[5];
     int arg_2[5];
     int arg_3[5];
     int expeted[5];

CPPTEST_TEST_SUITE_REGISTRATION(Suite);
/*Suite的setUp函数,类似与类的构造函数
 * 对所有的测试用例数组以及预期输出数组初始化
 * */
void Suite_setUp()
{
  int i;
 for(i = 0; i<=3; i++)
 {
  arg_1[i] = i + 6; //6 7 8 9
  arg_2[i] = i;     //0 1 2 3
  arg_3[i] = i+1;   //1 2 3 4
 }
 expeted[0] = 6;      //6+0=6
 expeted[1] = 6;      //7-1=6
 expeted[2] = 16;     //8*2=16
 expeted[3] = 3;      //9÷3=3
 
 arg_1[4] = 10;
 arg_2[4] = 0;
 arg_3[4] = 4;
 expeted[4] = -1;     //10÷0 肯定出错
}

void Suite_tearDown()
{
}


/* CPPTEST_TEST_CASE_BEGIN case_1 */
void Suite_case_1()
{
 /*下面这行自动生成,需要注释掉 */
    /*CPPTEST_FAIL("Auto-generated test case");*/
    /*补充以下代码*/
        int index = CPPTEST_DS_GET_ITERATION() - 1;
 int _par_1 = arg_1[index];
 int _par_2 = arg_2[index];
 int _par_3 = arg_3[index];
 int _expected = expeted[index];
 int _return = calculate(_par_1, _par_2, _par_3);
 /*如果该用例要用于回归测试,使用ASSERT的宏,可以直接断言预期输出和实际输出是否相等,相等的话不会输出
  * 如果只是想在测试中查看实际输出值,使用后置POST_CONDITION的宏*/
 /*CPPTEST_ASSERT_INTEGER_EQUAL(_expected, _return);*/
 CPPTEST_POST_CONDITION_INTEGER("int _return", ( _return ));
}
/* CPPTEST_TEST_CASE_END case_1 */

用例写完后,开始Build Test Executable,然后选择该TestSuite,Run Unit Tests,看运行结果

自动执行了5次,分别取数组中的5个元素,并自动显示每次执行的结果;如果使用ASSERT断言,可以自动对预期输出和实际输出比对,如果不一致,则报告错误。

注:以上代码为了描述更明确,使用了中文注释,在实际编译时,我去掉了所有的中文注释。

原因是如果保留这些中文注释的话,c++test老是自动执行15遍,很奇怪;去掉这些中文注释,就成了自动执行5遍。可能是由于c++test对中文注释支持还有一定问题。

2 使用CSV数据源的实现方法

添加新的TestSuite后(TestSuite名为csvSuite,添加用例csvDemo),准备CSV数据文件,我这里取名t1.dat,内容使用记事本或者UltraEdit编辑如下

n1,n2,flag,expected
6,0,1,6
7,1,2,6
8,2,3,16
9,3,4,3
10,0,4,-1

修改后的源代码如下

#include "cpptest.h"

CPPTEST_CONTEXT("/cal/cal.c");

CPPTEST_TEST_SUITE(csvSuite);
CPPTEST_TEST_DS(csvSuite_csvDemo,CPPTEST_DS_CSV("t1.dat",',',1,0));
CPPTEST_TEST_SUITE_END();
       
void csvSuite_csvDemo();

CPPTEST_TEST_SUITE_REGISTRATION(csvSuite);

void csvSuite_setUp()
{
}

void csvSuite_tearDown()
{
}


/* CPPTEST_TEST_CASE_BEGIN csvDemo */
void csvSuite_csvDemo()
{
    int _arg_1 = CPPTEST_DS_GET_INTEGER("n1");
    int _arg_2 = CPPTEST_DS_GET_INTEGER("n2");
    int _arg_3 = CPPTEST_DS_GET_INTEGER("flag");
    int _expected = CPPTEST_DS_GET_INTEGER("expected");
    int _return = calculate(_arg_1, _arg_2, _arg_3);
    //CPPTEST_ASSERT_INTEGER_EQUAL(_expected, _return);
 CPPTEST_POST_CONDITION_INTEGER("int _return", ( _return ));
}
/* CPPTEST_TEST_CASE_END csvDemo */

这里重点用到了宏定义CPPTEST_DS_CSV,关于该宏的说明,请参考c++test user guide相关章节。

Build-Run的结果如下

借助于CSV数据文件的方式,可以更好的起到对测试用例管理的作用,尤其是CSV文件可以在EXCEL中维护。

注意一点:CPPTEST_DS_CSV中使用相对路径时,要保证t1.dat位于c++test的执行路径下,当然可以在Test Configuration中修改其runtime的路径,否则在Run Unit Test时会出现“找不到文件”的提示。

好了,今天的试用就到这里,简单总结一下:

1 使用数据源的用例,尤其是CSV数据文件使代码和用例彻底脱离的方式,大大方便了测试用例的维护和管理,使得测试的自动化的成本更低;

2 在具体编码中的注意点上面已经提到

  ×新建Test Suite的名字中最好只有字母,不要含下划线

  ×CPPTEST_DS_CSV中使用相对路径时,要保证t1.dat位于c++test的执行路径下

  ×CPPTEST_TEST_SUITE(Suite);
   ......
   CPPTEST_TEST_SUITE_END();

    中间不要有注释,否则的话在运行时就会出现运行Number*2或者Number*3的现象。很奇怪,但的确是实验了多次的结果。

3 c++test提供了测试的自动化框架,用户只需关注测试本身即可,让用户从“搭建环境”中完全解脱出来,从而使开发人员自身做充分的单元测试成了可能。

4 借用Parasoft的一句话:

üC++test提供全球最先进的自动化单元测试

TAG:

引用 删除 xiaoler   /   2010-07-30 11:59:40
在学C++test,推荐一个C++test经验分享博客:www.mytestlife.com
 

评分:0

我来说两句

Open Toolbar