对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这个工具的强力支持,我们不妨一试,让测试驱动开发使得我们的生活更加轻松。
文章来源于领测软件测试网 https://www.ltesting.net/