【摘 要】在软件测试中,UI测试是保证软件质量、提高软件可靠性不可或缺的一部分,而基于单元的测试驱动开发对UI的关注度不够,本文探讨了适用于测试驱动开发的UI自动化测试框架需要的性质以及框架结构,并用开源框架KIF展示了UI自动化测试在测试驱动开发中的应用。
【关键词】软件测试,UI测试,测试驱动,极限编程
引言
测试驱动开发是一种新的软件开发方式,它遵守测试先行的原则,既简化了代码,又提高了软件的质量,已经成功的运用到各种项目的开发。现今的软件由于越来越注重软件的用户体验,对UI的测试越来越重要,而现在的测试驱动开发以测试代码单元设计正确性为主的单元测试为主要驱动,极少考虑用户与UI的操作对程序的影响,所以,研究UI测试在测试驱动开发中的应用有重要意义。
1、测试驱动开发
测试驱动开发(Test- Driven Development), 简称TDD, 由 Kent Beck提出的一种软件开发方式。测试驱动开发以测试作为开发过程的中心, 它要求在编写任何产品代码之前, 首先编写用于定义产品代码行为的测试, 而编写的产品代码又要以使测试通过为目标。测试驱动开发要求测试可以完全自动化的运行, 在对代码进行重构前后必须运行测试。
1.1 传统测试方法存在的问题
1)传统的功能性测试存在着漏洞和冗余, 而且同时不能被发现。功能性测试使测试人员离代码过远;
2)传统的结构性测试将代码采用有向图表示和程序路径公式化, 掩盖了代码中的重要信息, 这就在路径分析的方向上走得太远;
3)如果测试编写人员编写测试时所依赖的是文档而不是代码时, 当文档和代码存在任何不一致的地方就会造成问题;
4)测试不是自动运行的, 它们极有可能不会被频繁、经常性地运行, 或每次都以相同的方式来运行。
1.2 测试驱动开发的优点
1)从软件开发的初始阶段, TDD 就强迫开发人员以测试的角度与用户的观点对软件进行审视,因而更能够对软件有全面的认识和把握。
2)由于可以保证编写测试和编写代码的是相同的程序员, 降低了理解代码所花费的成本。
3)减轻了测试的工作量。无论是否进行设计工作, 测试工作都是不可避免的, 先进行单元测试, 可以减少后续的测试工作量。
4)让程序员能够更大程度地控制代码的正确度, 相当于提供了两道的代码审核手段, 在软件成品的质量上提供了一定的保障。
1.3 测试驱动开发步骤
1)根据软件设计需求快速增加一个测试用例;
2)运行所有测试,新增加的测试无法通过;
3)重构代码,做尽量少的改动让测试通过;
4)运行所有测试,保证所有测试都能通过;
5)重构代码,消除重复设计;
6)回到1)直到写完系统所有的功能测试。
2、UI测试
在移动互联网时代 ,用户体验是软件的重中之重,为了保证用户体验的完美必须对软件UI进行严格测试,ui 测试主要分为可用性测试和功能性测试两方面。对于可用性测试,是用来测试软件的用户界面是否符合用户的使用习惯和使用心理,是对用户体验的归纳和总结。用户体验的好坏取决于用户界面是否简单、直观和实用,良好的用户界面可以大大减少可用性测试的成本。对于功能性测试,通过外部UI的内容和展示用来测试软件的内部逻辑正确性。
2.1 自动化测试
根据测试是否需要引入人工干预,软件测试可以分为手工测试和自动化测试两大类。手工测试是指采用手动的方式输入软件测试的数据,然后观察测试的结果,并对测试结果进行分析。相对于自动化测试,手工测试是一种原始的测试方法。自动化测试是指通过编写测试脚本,对软件进行测试,整个过程不需要人工进行干预。手工测试能够根据软件测试的进度,及时的调整测试的策略,改变软件测试的方法。手工测试能够细致的观察到软件运行和输出的结果,当需要对测试结果进行主观判断时,手工测试具有明显的优点。但是,手工测试也存在着自身的不足。相对于自动化测试,手工测试的效率较低,不确定的因素较多。当软件测试需要测试大量的数据时,手工测试的局限性较为明显。完成采用手工测试对软件进行测试,无法满足现代化的软件测试需求。因此,采用手动测试加自动化测试相结合的方式对软件进行测试,可以有效的提高测试效率,缩短测试时间,提高测试的准确性。
自动化测试相对于手工测试,主要有以下几点优势:
1)提高测试效率
手工测试是一个劳动密集型的工作,并且容易出错。引入自动化测试能够用有效、可重复的自动测试环境代替繁琐的手工测试活动,而且能够在更少的时间内完成更多的测试工作,从而提高了测试工程师的工作效率。
2)降低对软件新版本进行回归测试的开销
对于现代软件的迭代增量开发,每一个新版本大部分功能和界面都和上一个版本相似或完全相同,这时要对新版本再次进行已有的测试,这部分工作多为重复工作,特别适合使用自动化测试来完成,从而减小回归测试的开销。
3)完成手工测试不能或难以完成的测试
对于一些非功能型方面的测试,如压力测试、并发测试、大数据量测试、崩溃性测试等,这些测试用手工测试是很难,甚至是不可能完成的。但自动化测试则能方便的执行这些测试,比如并发测试,使用自动化测试工具就可以模拟来自多方的并发操作了。
4)具有一致性和重复性
每次自动化测试运行的脚本是相同的,所以可以进行重复的测试,使得每次的测试具有一致性,手工测试则很难做到这点。
5)更好地利用资源
将繁琐的测试任务自动化,可以使测试人员解脱出来,将精力更多地到测试案例的设计和必要的手工测试当中。并且理想的自动化测试能够按计划完全自动地运行,使得完全可以利用周末和晚上的时间执行自动化测试,每日构建技术日渐普遍。 6)降低风险,增加软件信任度
自动化测试能通过较少的开销获得更彻底的测试效果,从而更好地提高了软件产品地质量。
2.2 自动化测试方法与工具
现在存在着各种各样的UI自动化测试框架,例如SilkTest和UIAutomation,这类软件和软件的开发环境相对独立,一般有自己专用的脚本语言和测试用例描述方法,适合于传统开发模式下的先开发后测试,不符合测试驱动开发的原则。本文用开源框架KIF展示了UI自动化测试在测试驱动开发中的应用。
3、适用于测试驱动开发的UI自动化测试框架
3.1 测试驱动开发对UI测试需求根据测试驱动的开发过程和UI自动化测试的技术的介绍,可以总结出对于适用于测试驱动的UI测试的要求:
1)可视化:普通的单元测试对UI部分功能进行测试,但是只能证明功能的逻辑正确性,却无法看到该功能对UI的影响,通常需要再编译一遍程序,手动来测试UI的正确性。所以,UI测试应用在测试驱动开发时,要求其必须在测试过程中可视化。
2)自动化:即能够模拟用户对界面的操作,如点击、滑动、捏合等手势,这些操作可通过各平台的accessibility功能实现。
语言一致性:由于测试驱动开发遵循“测试先行”的策略,对于测试脚本的通用性要求不高,所以,采用与软件开发一致的语言既能减少开发人员的学习成本,又能充分利用各平台的accessibility功能。
3)集成扩展性:由于现今的开发环境大都紧密集成成熟的单元测试框架,在该框架的基础上集成对UI控件的访问、操作功能,不仅能满足UI测试的需求,还能保证测试框架功能的完备性。同时,由于UI操作方式的多种多样,要求框架必须具备灵活性,要有一定的扩展能力。
3.2 测试框架结构
UI自动化测试框架的基础为成熟的单元测试框架上,并对单元测试进行扩展,另外添加了模拟用户操作的模拟、以及对用户操作对象UI控件的扩展(图1)。
3.3 框架工作流程
根据UI测试框架架构图,可以清晰的看到其工作流程:
1)加载并解析测试用例(假如存在单独的测试用例描述文件);
2)按照测试脚本所描述的操作操作方法对界面进行输入、点击、滑动等操作;
3)通过界面控件的属性与期望结果对比,判断是否执行成功;
4)输出测试结果。
3.4 UI自动化测试驱动程序开发步骤
根据测试驱动的开发步骤,联合以UI为测试核心的需求,总结出基于UI自动化测试的测试驱动开发步骤:
1)根据界面的功能以及用户对界面的操作快速添加相应的测试用例;
2)运行所有测试,新增加的测试无法通过;
3)修改用户界面以及对界面的交互代码,做尽量少的改动让测试通过;
4)运行所有测试,保证所有测试都能通过;
5)重构代码,消除重复设计;
6)回到1)直到写完系统所有的功能测试。
4、测试驱动开发实例
本文通过一个简单的IOS系统的登录界面的实例来展示UI测试驱动开发方法。
4.1 UI界面描述
4.1.1 界面功能描述
登录界面有两个文本框,一个登录按钮。文本框分别用来输入用户名和密码,登录按钮用来确认并提交登录信息。
4.1.2 用户操作要求
1)用户名字符数在3-6之间;
2)密码字符数在6-8之间;
3)用户输入超过上限则只显示前8位;
4)用户输入低于下限则让文本框获得焦点并显示键盘,等待用户继续输入;
5)点击确认按钮,若用户信息不符合要求则让让不符合要求的文本框获取焦点,若符合要求则提交验证;
6)点击界面空白处取消焦点。
4.2 UI自动化测试驱动的开发过程实例
在界面上添加用户控件两个文本框和相应的说明标签,一个按钮,并设置其访问属性,此为程序的初始状态。
4.2.1 用户名输入测试
1)根据用户操作要求,书写用户输入上限的测试代码如下:
代码解释,输入xukaitian超出了上限,所以文本框中应该显示期望值xukait。
2)运行测试,此时测试失败,查看测试日志,提示与预期结果不符:
3)修改界面控制器的代码,给文本框添加输入变化控制代码如下:
4)再次运行测试,此时测试成功:
5)重复上述步骤,分别对用户名输入下限测试以及其他限制条件进行测试开发。
5、结语