技术开发 频道

基于模型的Java应用测试

【IT168 专稿】

  软件测试(包括自动化测试、人工测试或基于模型的测试)是发现软件实际表现功能与预期功能差异的系统化方法。任何应用程序都应当通过测试以确保其功能正常可用,没有bug或缺陷
  
    近年来,基于模型的测试引起了广泛的关注。对一些开发与测试团队来说,这确实是一个值得探索的测试方法。但要注意基于模型的测试虽然有利于自动化测试的实现,却不能代替标准的自动化测试,只能作为自动化测试的补充。
    一个可以保证软件质量的、结构完整的测试,其目标是发现使用软件功能的所有方法,以及各功能部件的交互途径,并发现程序代码中的缺陷与bug。标准的测试方法通过运行预定的代码测试完成这个目标。基于模型的测试方法与此相反,它使用算法确定应用程序的所有测试路径,在确保最大测试覆盖度与最少测试的基础上减少路径,然后生成测试用例,对应用程序进行再次测试。
    有经验的软件测试人员为找出所有用户与应用程序的交互方式,需要进行长时间的分析工作。但用户总能找到一些程序员想不到的方式来使用程序,其中某些可能会产生意料之外的结果。
    基于模型的测试可以认为是许多用户每天24小时、连续几周不间断地测试你的程序,并且每人与程序交互的方式都截然不同。因为基于模型的测试可以产生覆盖面广泛的测试用例,有效地避免重复单一模式测试的种种缺陷。这种单一模式的测试会产生一种错觉,让人以为后面的测试自然会更少地发现程序代码中的缺陷,从而隐藏很严重的问题。这就是为什么基于模型的测试有时会发现标准测试过程中难以发现的问题。
    众所周知,一旦我们将Web应用程序投入使用,用户早晚会探测到程序中的缺陷,或者意外地发现程序中的bug,而这些缺陷或bug却没有在软件测试过程中检测出来。检测或修正这些问题可以节省大量资金、时间,并避免情况进一步恶化。所以,基于模型的测试是保证软件质量的有效方法。

基于模型测试的优缺点

    在考虑将基于模型的测试方法引入你的开发流程之前,必须明白这种测试方法并不适用于每种应用程序或组织需求。
    正如上面所说,基于模型的测试是检测应用程序对一定操作的响应行为。这些操作由为测试程序编写的输入产生。为编写这些输入,以便用来产生测试用例(或者说测试程序的预期行为、对用户的响应,以及与其它程序的交互等),我们需要准确地描述程序的预期行为。由于所产生的结果将完全建立在这些输入的基础上,所以编写输入是一个关键的过程。如果输入不是很完善,或者没有严格按照语法进行(以至测试工具不能正确地执行输入),整个测试过程也会有缺陷。
    基于模型测试的另一个问题便是使用这一方法的测试人员的技术熟练程度。一般的手工测试人员或自动化测试人员可能会感觉编写这种测试方案比较困难。而测试的实现需要对运行的程序设计语言(比如Java)有深入了解,并需要有良好编程能力的测试人员和开发人员参与。
    确定准确的输入也是一项费时费力的工作。完整的说明文档则可以为测试和开发团队节省大量时间。如果没有相关文档,确定准确的输入可能就要花费额外的时间了。基于模型测试的一个优点是可以促使团队创建优秀的说明文档和代码规范。优秀的内部代码规范有助于代码的检查、编写、维护与重用。如果每个程序员都使用自己的方法、编程风格,特别是在没有统一编码规范的情况下,代码将不利于其它开发人员阅读,甚至开发人员在修改自己的代码时都将面临很大困难。
    开发过程规范化并不意味着开发的停滞。在一个开发团队中,Java程序员之间可以互相分享实践经验。考虑到安全漏洞方面的问题,由于大多数针对程序脆弱性的攻击都从程序代码的常见错误入手,遵守开发规范的约束还可以有效地避免这些问题。每一次成功避免问题,都意味着在开发过程中团队可以少一个问题需要验证、分析和修正,否则会影响到已部署的应用程序。
    基于模型测试的另一个优点是可以在编程时考虑得更周到。因为程序员和测试人员必须对应用程序有深入的了解才能设计基于模型的测试。因此,基于模型的测试可以加深对功能交互,以及这些交互对代码的影响的了解,只要考虑到应用程序的测试过程,即可写出更好的代码。
    所有这些都表明,只有你才能决定基于模型的测试是否符合项目或公司的需求。 如果你的团队早已习惯在最后的部署期限前高负荷运转,引入基于模型的测试可能还会增加多余的压力。

基于模型测试实践:输入问题

    作为开始,可以选择应用程序中一个小且易于描述的子集进行测试。选择五到十个初始状态,为其编写输入语句,并至少运行这个测试几小时甚至几天时间,观察测试中发现的问题。这只是测试技术的初步,不管测试确实发现了一些以前未发现的bug,或者什么也没发现,都不能认为你已经掌握了基于模型的测试过程。继续扩大子集的范围,直到可以确定输入的准确性,这时才能正确分析测试的结果。
    刚开始设计输入时,可能会希望找出应用程序的所有使用方式、潜在使用方式,以及破解时可能用到的方式。由于Web应用的成功很大程度上依赖于用户对其表现性能的评价,因此在寻找安全缺陷的同时还需要测试可扩展性和稳定性。
    基于模型的测试并不需要程序员或测试人员预测或确定每种可能发生的交互情况。而只需确定应用程序的状态、操作和转换方式。因此没有必要考虑用户可能以什么方式来使用或破解程序。对应用程序的宏观掌控和细节把握已经足够确定每种可能的输入情况。这些确定以后,便可以使用模型产生测试用例了。
    下一步只需确定初始测试目标。如果是刚开始使用基于模型的测试方法,这还不会成为问题,因为你只是在很小的子集上对应用程序进行有限的测试。但当你决定将这个方法引入测试过程时,测试开始前就必须有一个明确的目标。因为在基于模型的测试中可能会进行无数的测试,所以最好先进行风险分级。先判定最高风险区域再研究测试目标,这样依次进行测试。在测试过程中,分析结果并修正bug,修改模型,直到满足测试目标为止。一定要记录过程中发现的问题和解决方案。
    总之,基于模型的测试是提高测试效率的有效途径。你可能需要在其它测试过程中对程序进行测试,比如,对于Java程序显然需要确定其在Web浏览器中的运行情况,或者在移动系统中能否正常运作。这可能需要进行可扩展性测试,观察程序在高负载状态下的运行情况。并且,你肯定也注意到,有许多出色的Java应用测试工具(包括很多开源工具)和验证程序。 只需要选择符合程序和应用方式的工具即可。如果你在为一个客户开发应用程序,你可能需要与他们协商是否需要在测试过程中对程序做一些特性分析。如果程序是用于移动市场,你可能要在UTC标准(统一测试标准)下进行一套移动工业认证的自动化测试流程,检查程序加载、功能、运行、用户界面、安全性、网络和本地化功能,这时才能在销售产品时使用“Java Powered(Java认证)”的标志。
  基于模型的测试并不是一颗可以迅速发现程序每个漏洞的子弹,也不会比标准的自动化测试流程更有效或更经济。它的作用是在输入准确的前提下为复杂的项目(比如实时或嵌入式程序设计)实现有实际价值的、非重复性模拟测试。

0
相关文章