本系列文章适用于需要为测试团队寻找测试过程管理解决方案的测试设计、测试管理人员。目前,开源理念在国内外越来越深入人心,开源软件大大推动了软件研发行业的快速发展。TestLink 作为软件测试管理类开源软件中的佼佼者,在中小型的软件测试项目组中得到了普遍应用,项目组的测试效率得到了很大的提升。本文作为使用 TestLink 管理软件测试过程系列文章的第二部分,主要介绍如何使用该工具管理软件自动化测试过程。首先探讨设计自动化测试框架时需要考虑的几个关键点,接着介绍基于 TestLink 的自动化测试解决方案。后,详细介绍了基于 TestLink 的自动化测试解决方案的核心实现技术,即如何通过编程的方式自动化的从测试计划中获取测试用例信息、如何上传、下载、执行测试用例脚本文件和如何回传测试结果信息到 TestLink 等。本系列文章的第一部分已对如何使用 TestLink 管理软件功能测试过程进行介绍。 首先,探讨一下设计自动化测试框架时,需要慎重考虑的几个关键设计点。 设计自动化测试框架的关键点 在设计自动化测试框架时,测试架构设计师需要考虑很多关键设计点,这些关键点决定着测试框架的成败。本文中,我们主要关注以下三点:如何维护测试用例脚本文件、如何汇总展示测试结果统计报表和自动化测试框架如何与其他研发管理平台的集成。 如何维护自动化测试脚本文件是需要考虑的重要关键点之一。从实际自动化测试项目来看,维护自动化测试用例脚本文件的方式主要有以下两种: 文件系统 使用自动化测试工具录制、编写完毕自动化测试脚本,自动化测试工具会把脚本文件维护在本地文件夹。为了在测试团队之间共享,会进一步把脚本文件维护在服务器共享文件系统上,甚至会维护在 FTP 服务器。在执行那些脚本文件之前,需要预先复制那些脚本文件到执行环境。比如:自动化脚本存储在服务器 A,如果计划在服务器 B 和服务器 C 上分别运行不同的脚本。一般的做法是:先将相应的脚本文件手工从服务器 A 分别复制到服务器 B 和服务器 C,然后再在服务器 B 和服务器 C 上分别运行自动化测试。如果还有更多的服务器需要运行脚本,采用类似的方法复制,运行即可。除了手工干预,编写 DOS 批处理脚本、Shell 脚本或者编程等自动完成复制,会更加有效率。 版本配置管理软件 SVN 等 使用版本配置管理软件 SVN 管理自动化测试脚本文件,比使用服务器文件系统管理更加灵活。可以充分利用 SVN 的版本控制特性,维护脚本文件的多个版本;还可以利用 SVN 的权限设置特性,为测试套件设置访问权限。需要执行自动化测试的时候,手工检出脚本,或者编写脚本自动化检出。 上面所描述的维护自动化测试脚本文件的两种方式有很多局限,比如,测试用例文档和测试用例脚本文件分隔开来,无法实现一一对应。查看脚本文件时,需要去别处查找测试用例文档。再比如,使用上述两种方式维护自动化测试用例脚本文件,需要花费很多精力去设计脚本维护模块与自动化测试框架其他功能模块单元的集成。本文会分享一种使用 TestLink 维护自动化测试脚本文件的解决方案,通过 Web 方式在线访问存取测试用例脚本文件,而且测试用例和测试脚本很容易一一对应,在同一个页面实现对两者的访问。TestLink 的丰富功能模块,版本管理、权限设置、结果报表等功能模块都可以为自动化测试框架所复用。 一个用户体验良好的测试框架必须拥有一个良好的汇总展示测试结果统计报表的设计与实现。目前流行的自动化测试工具通常会把测试执行结果保存在测试工具所运行的服务器上。如果多台机器同时运行,会产生不同的分散结果,这会遇到结果查询与汇总的问题。如果脚本执行结果分散在不同的机器上,需要复制到同一个服务器上进行汇总;由于不同的测试框架所产生的测试结果数据格式不统一,需要进行提取与分析;结果数据解析汇总后又会遇到统一管理维护与展示问题;测试结果也无法实时更新,不能满足用户实时查询等问题。为了解决这些问题,在设计自动化测试框架时,不得不花费时间与精力额外设计与开发测试结果汇总解析与展示模块,用于向测试管理人员与执行人员展示测试结果报表数据。 设计的测试框架时,还不得不考虑自动化测试框架如何与其他研发管理平台的集成。目前大多数测试团队的自动化测试框架,很难与其他研发测试管理平台进行数据共享与同步,比如:自动化测试执行完成后,其自动化脚本所覆盖的测试用例的执行结果信息,仍然需要在测试用例管理平台上通过手工标记 Pass、Failed、NotRun 等进行变更;同样对缺陷管理平台也是如此,有 Failed 的测试用例,仍然需要手工在缺陷管理平台中填入缺陷信息,而不能自动同步到缺陷管理平台中去。本文提出的基于 TestLink 的自动化测试解决方案可以自动回传自动化执行结果到 TestLink 服务器,并能与第三方开源缺陷管理平台进行良好的集成。 接下来,让我们一起探讨一下把测试框架与 TestLink 进行集成的解决方案。该方案的显著特征为:使用 TestLink 的测试用例附件功能模块来维护自动化测试脚本文件,利用 TestLink 的测试结果报表功能模块来汇总展示自动化测试执行结果。通过扩展,自动化实现 TestLink 与第三方开源缺陷平台的进行集成。 基于 Testlink 的自动化测试解决方案 针对上文提到的测试框架设计关键点,在开发自动化测试框架时,基于 TestLink 进行二次开发是个很的解决方案,它具有如下优势: 测试过程管理平台的统一,功能测试和自动化测试使用统一的平台 使用统一的平台,可以避免测试工作复杂化。对于现有的在 TestLink 中维护的功能测试用例,如果需要执行自动化测试,很容易将其转化为自动化测试用例。在测试规约 Test Specification 页面,选择测试用例,编辑其执行类型 Execution Type, 由手工类型 Manual 改成自动化执行类型 Automated,并上传该用例的自动化测试脚本文件作为附件即可。 可以充分利用 TestLink 的现有特性对自动化测试用例进行管理 比如,可以使用 TestLink 的版本管理特性,维护自动化测试用例的不同版本;可以使用 TestLink 的结果报表特性来展示自动化测试执行的结果报表。还通过扩展,借助 SOAP、REST、XML-RPC 接口,可以与第三方开源缺陷管理工具、项目管理工具进行集成,比如 Bugzilla、MantisBT、JIRA 等等。 图 1 是使用 TestLink 管理自动化测试过程的流程图,它包括自动化用例维护和自动化用例执行两部分。自动化测试用例维护部分的流程图包括: 对 TestLink 上的功能测试用例做规划,决定哪些应该被自动化执行。编辑其执行类型,改为自动化测试用例。 编写自动化测试用例的脚本。脚本文件的编写依赖于自动化测试工具,在本文中,自动化测试用例脚本文件是业界流行的基于 XML 格式的文件,该脚本文件可以被基于 Selenium 开发的自动化测试框架识别,关于该框架请参考 IBM DeveloperWorks 文章《使用 XML 维护 Selenium 自动化测试脚本》。 自动化测试用例脚本上传。上传自动化测试用例脚本文件到测试用例的附件部分,可以使用 TestLink 来维护自动化测试用例的脚本文件。 完成全部的自动化用例脚本的编写,并把脚本文件上传到 TestLink 自动化测试用例的附件部分。 创建测试计划,把自动化用例添加到测试计划中,完成测试用例的维护。TestLink 也提供了为测试用例设置执行顺序的特性,读者们可以根据自己项目组的实际情况进行设置。 自动化用例执行部分的流程包括: 选取测试计划、维护构建信息,获取要执行的测试用例信息。 在 TestLink 中,测试用例的执行是为测试用例标记测试结果信息,包括是否执行通过,额外的描述信息等。在执行之前,需要设置执行依赖的版本构建信息。在 TestLink 管理自动化测试时,需要首先通过 TestLink 的测试计划信息,自动化的获取该测试计划包含的测试用例信息,进而获取测试用例的脚本文件信息。 下载测试用例的脚本文件到本地。 正如上文所述,在 TestLink 中,测试用例的执行仅仅是标记测试结果信息。测试脚本文件的具体执行需要依赖第三方自动化测试工具。需要预先把测试用例的测试脚本文件下载到本地以供自动化测试工具自动调用执行。 执行下载到本地的测试用例脚本文件。 把下载到本地的测试用例脚本文件位置作为参数传递给第三方自动化测试工具,完成自动化测试用例的具体执行任务。执行完毕,生成测试结果信息。根据项目组使用的不同第三方自动化测试工具,灵活处理该部分,本文不再赘述。 完成测试计划下包含的全部自动化用例脚本的下载与执行,生成测试结果信息。 向 TestLink 回传测试用例的执行结果。通过编程,自动化地完成标记测试用例的结果。完成该部分,可以利用 TestLink 的结果报表模块查询分析测试结果。
图 1. 与 TestLink 集成的自动化测试流程图
接下来,展开讨论基于 TestLink 的自动化测试解决方案的核心技术实现。为读者们讲述如何通过编程调用 TestLink 提供的 XML-RPC 接口,实现自动化从测试计划中获取测试用例信息,测试用例脚本文件的上次与下载,回传用例的执行结果等。 从测试计划中获取测试用例信息 测试计划 TestPlan 是使用 TestLink 管理自动化测试过程的切入点,通过指定测试计划的名称作为参数,编写代码自动化获取测试用例的信息,进而获取测试用例的脚本文件信息并完成脚本文件的执行。本部分介绍如何通过编程从测试计划中获取测试用例信息。本文使用第三方 Java 程序 TestLink Java API 请参考本系列的第一部分。 在调用 TestLink Java API 之前,需要先实例化 TestLinkAPI 实例对象,代码清单如下。关于如何获取个人访问密钥 devKey ,请参考本系列文章的第一部分。 清单 1. 获取 TestLinkAPI 实例 public class APIObject { private static Logger logger = Logger.getLogger(APIObject.class); private static TestLinkAPI api = null; public static TestLinkAPI getAPI() { if (null == api) { String url = "http://localhost/testlink/lib/api/xmlrpc.php"; String devKey = "92b9cc5fc38e1ebde8813ff219ce5a07"; logger.debug("URL=" + url); logger.debug("devKey=" + devKey); try { api = new TestLinkAPI(new URL(url), devKey); } catch (TestLinkAPIException te) { logger.error(te.getMessage(), te); } catch (MalformedURLException mue) { logger.error(mue.getMessage(), mue); } } return api; } } 借助上述实例化 api 对象,接着可以获取测试计划中的测试用例信息。使用测试计划获取测试用例信息的代码清单如下。需要指定的参数为测试项目的名称和测试计划的名称,返回的是测试用例数组。。在调用 getTestCasesForTestPlan() 方法时,只使用了执行类型 ExecutionType.AUTOMATED 对返回的测试用例数组进行过滤,可以根据项目组情况,添加更多的过滤条件。 清单 2. 获取测试用例信息 String planName="kenneth 测试计划 "; String projectName= " 测试演示 "; TestLinkAPI api = APIObject.getAPI(); TestPlan tl = api.getTestPlanByName(planName,projectName); TestCase[] tcs=api.getTestCasesForTestPlan(tl.getId(), null, null,null,null,null, null,null,ExecutionType.AUTOMATED,null,null); for(TestCase tc:tcs){ logger.debug(tc.toString()); } 测试脚本上传 使用 TestLink 管理自动化测试脚本的优势之一是,很容易复用维护在 TestLink 上的功能自动化测试用例。自动化测试团队负责对现有的测试用例进行分析,划定需要作为自动化测试执行的用例部分。编写自动化测试用例脚本,并上传到相应的测试用例的附件部分。这样自动化测试与其相应的自动化测试脚本文件可以一一对应起来。编写完毕自动化测试脚本后,访问 Testlink 站点,点击主页的 Test Specification 链接,导航到相应的测试用例节点上,双击定位到的用例,可以进入用例编辑页面。手工上传附件非常简单,如图 2 所示。上传之后,显示附件的标题,附件的文件名称,文件大小,文件的 MIME 类型和附件的上传日期等。点击附件标题超链接可以下载附件到本地。
图 2. 手工上传附件到测试用例
除了手工上传测试用例脚本文件外,还可以通过类似下面的编程代码来实现同样的功能。示例代码如清单 1 所示。需要提供的参数为测试用例对象 TestCase tc,上传文件的本地文件路径 file,上传附件的标题 title,上传附件的描述信息 desc,附件的文件名字 fileName 和上传附件的文件 MIME 类型。对于 XML 文件,文件的类型为 text/xml。调用清单 3 中的方法即可完成附件的上传,代码实现也非常简单。首先,读取本地脚本文件转换为字节数组 byteArray,然后对该字节数组进行 Base64 编码并转换为字符串类型的 fileContent。后,调用 TestLinkAPI 的 uploadTestCaseAttachment() 方法完成附件的上传。代码中使用到了 Commons IO 开源类库文件中的 FileUitls 类。