多数情况下,一个开发团队想要在开发过程中使用自动化测试,大多数成员都会对它抱以质疑的态度。毕竟,与其花这点时间写测试用例,还不如去写逻辑和引擎 的代码。根据我们在游戏和其他领域的工作中使用自动化测试的经验来看,编写测试代码会额外增加30%工作量。初看,在时间和资金上这也许是很大的开销,然而,你要意识到这样做,省去了人工测试所花费的时间。项目管理者联盟
自动化测 试可以看作在开发前期投入,在开发过程中赢利。大多数的代码修改,包括Bug修改,都可能会引入更多问题导致程序宕机。所以,理论上说,一旦代码有所改变,就必须测试所有可能被影响的代码。自动化测试无需人工干预就可以完成,它们缩短了开发过程。而且由于自动化测试可以简单快速的发现修改的代码是否能有效地运行,因此也就鼓励开发者优化和改进现有的代码。项目管理者联盟
对我们来说,自动化测试帮助开发者编写更稳定和可靠的代码。哪怕是一开始对它抱有怀疑态度的开发成员也欣赏它所提供早期反馈的特性,在开发过程中,它也可以更早的 发现Bug。开发者的工作压力和负荷随着项目的开展日益加大,尽早的发现和解决Bug也可以避免给开发关键时期带来额外的压力。项目管理者联盟
在开发Vision引擎的时候,我们收集了一些数据来研究为提高代码稳定性而实施自动化测试的有效性。2001年早期,全部依靠人工测试的引擎第一个 release版本开发完成,尽管我们已经进行了很全面的测试,但是每个月,我们的在线技术支持数据库依然会收到上百个来自客户的Bug报告。2001年 9月,我们对已有的引擎功能和新增的特征实施自动化测试。这样,即使我们现在的工作量很大,开发进展也很正常,每月Bug报告的数量锐减(现在大概是5到10个)。blog.mypm.net
必须强调,这些图表只是反映了单元测试用例数量和每月Bug数量两者之间的相互关系,不能将它理解为必然的因果关系。当然,从2001年到2004年,我们在如何编写健壮的代码上学到了很多,在这段时间内,开发团队的人数变动频频,但是,这些明显的差异足以说明稳定性的提升部分归功于使用了自动化测试。项目管理者联盟
游戏中自动化测试的局限性项目管理者联盟
尽管使用自动化测试对于游戏开发来说获益匪浅,但是也有其局限之处。显然,很难用它来测试游戏的平衡性,也不太可能用它来测试游戏性和画面的美观性。在这几年里,我们总结了一些编写自动化测试的要点,重点如下:项目管理者联盟
*测试最重要的模块(比如,最复杂和最常用的)。对那些最有可能出问题或者不会破坏原先设计的重构任务进行自动化测试,性价比最高。 *当上层功能性测试难以进行的时候,把精力集中在不同的子系统上。例如,你也许不能通过自动化测试来验证AI系统是否正常工作,但你可以测试当一个怪兽的体力低于一定数值的时候,它是否会“投降”。 *用压力测试来验证你的代码的强壮性。如果你的游戏在极端条件下运行的很好,比如,每秒有2000个怪兽出生和死亡,一个场景中同时放入500个有真实物理特性的物体,一幅地图轮流载入200次,那么玩家作一些异常操作时,宕机的可能性就会小很多。 *在修改Bug前,也为它编写测试用例。这样的话,可以确保这些Bug在今后的版本中不会重现。 *回归测试。例如,图像或状态比较的话,使用指定的测试场景要比使用产品地图更容易维护。如果你认为测试用产品数据可能会经常变动,那么你最好使用小的测试场景。否则,不断的生成新的参考数据会使得开发团队产生疲倦和厌烦的情绪。 * 测试用例越简单越好,不要奢望有非常大的覆盖面。搭建一个易维护和可扩展的自动化测试是一个长期的任务。一般来说,“底层”代码,例如算术、碰撞检测和渲染,更容易进行自动化测试,对于游戏性和完整的游戏测试来说,还是需要经过QA人员亲自测试。当然,QA部门的注意力也要从技术转移到与游戏性相关的问题上去。“到A房间后,因为通风口前面的箱子太高了,所以出不去”这样的报告就会取代“当我的角色转动的时候,屏幕上出现了很多扭曲的三角面”。项目管理培训
持续集成项目管理者联盟
在一个复杂的软件项目中引入自动化测试,你会发觉运行它也需要一定的时间,我们看到的一些项目甚至需要几个小时。如果让开发者在他们的开发用机上运行的话,测试会完全占用他们的机器,影响工作,那么结果就是他们不去运行测试用例,很显然,没有被运行的用例是没有任何价值的。项目管理者联盟
解决方法就是搭建一台或多台专用的自动化测试机。它同时还运行版本管理软件(Subversion/CVS/Perforce),一旦发现提交了新代 码,那么代码就会被Check out并编译,测试用例也会自动运行。最后,系统会将测试结果报告以email的形式自动发送给最近提交代码的开发者。项目管理者联盟
完全自动化、重复的 build和测试过程,这种过程每天运行多次,在极限编程中,我们把它称为:持续集成。为了更好的实行持续集成,像 Cruise Control或者Anthill这样的开源代码工具可以将版本管理软件和自动build工具,例如ANT,整合起来。使用这样的工具, 可以很轻松的搭建适合自己的持续集成系统。项目管理者联盟
我们发现搭建专用持续集成服务器使得开发过程变得更顺畅,开发者可以更专注于自己的工作。与此同时,测试可以被很好的运行,一旦提交了错误的代码,持续集成系统会自动通知开发者和项目经理,因此开发者也可不必为此分心。自动化,自动化!项目管理者联盟
自动化测试和持续集成的使用为我们在游戏和工具的开发上带来了极大的收益。例如,持续集成服务器根据Wiki中的变化,每天自动生成CHF (windows帮助文件)文件。而且,使用ANT和CruiseControl来制作软件自动分发包会非常容易。这样一来,用最新的代码(或最新的 tag)创建一个完整的分发包就是举手之劳。pmp.mypm.net
自动化过程中的自 动化测试执行,例如测试框架中的常规单元和回归测试,他们不是用来检查错误,而是用在相同环境下得到测试结果来衡量和比较引擎的性能(系统配置的结果以 XML文件格式存放在版本管理软件系统上)。如果当前的结果比参考结果差很多,那么测试失败,反之,它就成为了新的参考结果。项目管理者联盟
性能测试是一种特殊的回归测试。当引擎代码被重构,我们通过它来确保修改不会降低引擎原有的性能。这样,就迫使我们时刻关注代码的运行效率和对代码的优化工作,可以避免遇到在实际运行中,速度突然变慢的现象发生。项目管理者联盟
结论 根据我们的经验,使用自动化测试和持续集成可以使开发团队工作更有效而开发出更好、稳定、简单的软件。而且,减少人工测试也可以减少开发团队的压力和工作负荷,可以在开发过程中尽早的发现Bug。talent.mypm.net
当然,自动化测试不会使你的游戏想当然成为畅销品。但毋庸置疑,它会使各类开发人员甚至玩家活得更自在。项目管理者联盟
参考 * Unit Tests: http://c2.com/cgi/wiki?UnitTest * The Standish Group, Inc. (2001), Extreme Chaos * By the Books: Solid Software Engineering for Games (GDC 2002 roundtable): * http://www.convexhull.com/sweng/GDC2002.html * Continuous Integration: http://cruisecontrol.sourceforge.net/ * http://c2.com/cgi/wiki?ContinuousIntegration * ANT: http://ant.apache.org * BullseyeCoverage: http://www.bullseye.com * AQtime: http://www.automatedqa.com项目管理者联盟 项目管理者联盟
|