技术开发 频道

在Visual C++ 2010中实践测试驱动开发

  到这里,我们就完成了测试驱动开发过程的一次完整的迭代,接下来的工作,就是编写更多的测试以覆盖设计中的所有用例,然后运行这些测试使这些测试通过,如果测试暂时无法通过,则对开发代码进行重构实现设计使得所有测试都可以通过。例如,在上面完成第一次开发迭代的基础,我们可以编写更多的测试来覆盖Salary类设计中的所有功能点:

  [TestMethod]

  
void TestCalculationn()

  {

  std::unique_ptr pClass(
new Salary(2003));

  
int cases[4][2] =

  {{
2003,1000},{2004,1300},

  {
2005,1600},{2011,3100}

  };

  
for(int i = 0; i < 4; ++i)

  {

  Assert::AreEqual(cases[i][
1], pClass->GetSalary( cases[i][0]));

  }

  };

  在这里我们使用一个数组cases定义了多个测试用例,然后使用for循环对这些用例逐个进行测试。现在我们运行测试项目中的这些测试当然是没法通过的,所以这些测试就驱动我们去对开发项目中的Salary类进行重构,以使得这些测试可以通过:

  class Salary

  {

  
public:

  Salary(
int nBaseYear)

  :m_nBaseYear(nBaseYear)

  {};

  
public:

  
int GetSalary(int nNow)

  {

  
return 300*(nNow - m_nBaseYear) + 1000;

  }

  
private:

  
int m_nBaseYear;

  };

  对Salary类进行重构之后,所有测试都可以通过了,这样也就实现了用测试来驱动开发。当然,我们这里只是对设计中的第一个功能进行了足够的测试,完成了第一个功能的开发。我们还可以在这个基础上编写更多的测试,进入下一个以测试驱动开发的迭代。我们可以按照上面的过程以测试来驱动第二个功能的实现:

  [TestMethod]

  
void TestInvalidInput()

  {

  std::unique_ptr pClass(
new Salary(2003));

  
// 测试第二个功能点:能够对错误的输入年份返回相应的错误代码

  Assert::AreEqual(
-1, pClass->GetSalary(2001));

  
// 测试临界输入是否返回正确结果

  Assert::AreEqual(
1000, pClass->GetSalary(2003));

  };

  为了让这个测试通过,我们必须对Salary进行重构,让它对错误的输入进行处理并返回相应的错误代码:

  class Salary

  {

  
public:

  Salary(
int nBaseYear)

  :m_nBaseYear(nBaseYear)

  {};

  
public:

  
int GetSalary(int nNow)

  {

  
int nYears = nNow - m_nBaseYear;

  
// 对错误的输入进行处理并返回相应的错误代码

  
if( nYears < 0 )

  {

  
return -1;

  }

  
else

  {

  
// 正确的输入返回相应的计算结果

  
return 300*(nNow - m_nBaseYear) + 1000;

  }

  }

  
private:

  
int m_nBaseYear;

  };

  经过重构之后,测试项目中的所有测试都可以顺利通过,这也宣告了我们这一次的代代已经顺利完成。而通过不断地进行这样的迭代,我们可以实现设计中的所有功能。

  经过简单的几次迭代,我们就以测试驱动了Salary的实现。整个过程完美地体现了测试驱动开发的强大优势:这种从使用者角度对代码进行的设计通常更符合后期开发的需求。因为关注用户反馈,可以及时响应需求变更,同时因为从使用者角度出发的简单设计,也可以更快地适应变化。同时,测试驱动开发将测试工作提到编码之前,并频繁地运行所有测试,可以尽量地避免和尽早地发现错误,极大地降低了后续测试及修复的成本,提高了代码的质量。在测试的保护下,不断重构代码,以消除重复设计,优化设计结构,提高了代码的重用性,从而提高了软件产品的质量。

  测试驱动开发的优势自不待言,从整个过程中我们也可以体会到,有了Visual C++ 2010的支持,面向C++的测试驱动开发也可以同样的快捷而简便。测试驱动开发的优势如此诱人,而我们又有了Visual C++ 2010这个工具的强力支持,我们不妨一试,让测试驱动开发使得我们的生活更加轻松。

0
相关文章