关闭

如何编写测试代码

发表于:2010-2-05 13:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  使用VU时,测试代码是自动生成的,但了解手工编写测试代码的方法,有助于更好地实施单元测试。这里用一个简单的例子,说明如何编写测试代码进行单元测试。可以用一个简单的方式来组织测试代码:一个类对应一个测试类,一个函数对应一个测试函数。

  产品类:

class CMyClass 
{
public:
   intAdd(inti,intj);
    CMyClass();
   virtual~CMyClass();

private:
   intmAge; //年龄
    CString mPhase; //年龄阶段,如"少年","青年"
};

  建立对应的测试类CMyClassTester,为了节约篇幅,只列出源文件的代码:

  voidCMyClassTester::CaseBegin()
  {
  //pObj是CMyClassTester类的成员变量,是被测试类的对象的指针,
  //为求简单,所有的测试类都可以用pObj命名被测试对象的指针。
  pObj =newCMyClass();
  }
  voidCMyClassTester::CaseEnd()
  {
  deletepObj;
  }

  测试类的函数CaseBegin()和CaseEnd()建立和销毁被测试对象,每个测试用例的开头都要调用CaseBegin(),结尾都要调用CaseEnd()。

  接下来,我们建立示例的产品函数:

  intCMyClass::Add(inti,intj)
  {
  returni+j;
  }

  和对应的测试函数:

  void CMyClassTester::Add_int_int()
  {
  }

  把参数表作为函数名的一部分,这样当出现重载的被测试函数时,测试函数不会产生命名冲突。下面添加测试用例:

  voidCMyClassTester::Add_int_int()
  {
  //第一个测试用例
  CaseBegin();{//1
  inti = 0;   //2
  intj = 0;   //3
  intret = pObj->Add(i, j); //4
  TEST_ASSERT(ret == 0);    //5
  }CaseEnd();               //6
  }

  第1和第6行建立和销毁被测试对象,所加的{}是为了让每个测试用例的代码有一个独立的域,以便在多个测试用例中使用相同的变量名。

  第2和第3行是定义输入数据,第4行是调用被测试函数,这些容易理解,不作进一步解释。第5行是预期输出,它的功能是当实际输出与预期输出不同时自动报错,TEST_ASSERT(exp)是一个断言宏,表示当exp的计算结果为真时,测试通过,否则,输出报告错误的信息。

  示例中的格式显得很不简洁,2、3、4、5行可以合写为一行:TEST_ASSERT(pObj->Add(0, 0) == 0);但这种不简洁的格式却有很大的优点,因为它一目了然,易于建立多个测试用例,并且具有很好的适应性,同时,也是极佳的代码文档。

  建立了第一个测试用例后,最好编译并运行测试,以排除语法错误,然后,使用拷贝/修改的办法建立其他测试用例。由于各个测试用例之间的差别往往很小,通常只需修改一两个数据,拷贝/修改是建立多个测试用例的最快捷办法。

21/212>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • akzw1314
    2010-2-08 09:24:34

    很好 谢谢分享

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号