图 2. 手工上传附件到测试用例
除了手工上传测试用例脚本文件外,还可以通过类似下面的编程代码来实现同样的功能。示例代码如清单 1 所示。需要提供的参数为测试用例对象 TestCase tc,上传文件的本地文件路径 file,上传附件的标题 title,上传附件的描述信息 desc,附件的文件名字 fileName 和上传附件的文件 MIME 类型。对于 XML 文件,文件的类型为 text/xml。调用清单 3 中的方法即可完成附件的上传,代码实现也非常简单。首先,读取本地脚本文件转换为字节数组 byteArray,然后对该字节数组进行 Base64 编码并转换为字符串类型的 fileContent。后,调用 TestLinkAPI 的 uploadTestCaseAttachment() 方法完成附件的上传。代码中使用到了 Commons IO 开源类库文件中的 FileUitls 类。
清单 3. 上传测试用例附件
private static TestLinkAPI api = APIObject.getAPI();
public static void testUpload(TestCase tc, String file, String title,
String desc, String fileName, String fileType) {
File attFile = new File(file);
String fileContent = "";
try {
byte[] byteArray = FileUtils.readFileToByteArray(attFile);
fileContent = new String(Base64.encodeBase64(byteArray));
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
Attachment attachment = api.uploadTestCaseAttachment(
tc.getId(), // 测试用例编号
title, // 上传附件的标题
desc, // 附件的描述信息
fileName, // 附件的文件名称
fileType, // 上传附件的 MIME 文件类型
fileContent); // 附件的文件内容
logger.debug(" 附件上传完成," + attachment.toString());
}
清单 3 的代码是上传附件到测试用例附件区的核心代码,为了批量完成为多个用例分别上传附件,需要在测试用例和需要上传的本地附件文件做一个映射,循环调用清单 3 中的方法依次完成全部的附件上传。具体的代码实现留给读者完成。
需要注意的是,TestLink 的版本管理特性可以对测试用例进行版本控制,但不支持对附件也做版本控制,即一个用例的所有版本都共享同样的附件文件。如果读者需要为用例的不同版本做自动化测试,可以在上传脚本文件时为文件名称附加上版本信息。下载用例脚本文件时,根据版本信息对脚本文件进行过滤。本文假设所有的版本可以共享同一份脚本文件,随时保持附件文件的更新即可。
测试脚本文件下载
通过完成上述操作,自动化测试用例脚本文件已经维护在 TestLink 测试用例附件区。在使用自动化测试工具执行计划的测试用例之前,需要下载测试用例脚本文件到本地文件系统,以方便自动化测试工具对其进行解析运行。使用 TestLink 管理自动化测试用例脚本的优势之一是,通过编写简单的代码很容易完成脚本文件的下载。下载用例脚本文件的代码见清单 4,为下载方法指定 TestCase tc 参数,即可完成该测试用例的附件下载任务。代码很简单,首先根据测试用例实例 tc 获取附件数组 atts,对数组进行循环,依次获取附件 att 的文件名称和文件内容,并保存到本地工作目录下的 UseCases 文件夹下。
清单 4. 下载测试用例附件
private static TestLinkAPI api = APIObject.getAPI();
public static void getAttachments(TestCase tc) {
String dir = System.getProperty("user.dir") + File.separator
+ "UseCases";
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
Attachment[] atts = api.getTestCaseAttachments(tc.getId(), null);
for (Attachment att : atts) {
byte[] decoded = Base64.decodeBase64(att.getContent().getBytes());
FileOutputStream fos;
try {
fos = new FileOutputStream(new File(dir + File.separator
+ att.getFileName()));
logger.debug(" 测试用例附件保存为 =" + dir + File.separator
+ att.getFileName());
fos.write(decoded);
fos.close();
} catch (FileNotFoundException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
测试脚本执行
下载完毕测试用例脚本文件,下一环节是使用自动化测试工具执行这些用例文件。关于如何运行基于 XML 格式的自动化测试用例,推荐读者阅读 IBM developerWorks 文章《使用 XML 维护 Selenium 自动化测试脚本》。测试用例执行完毕,自动化测试工具生成执行日志信息、测试结果信息等。相应测试用例的执行结果状态,如 passed、failed、blocked 等,需要传给下一环节,用于自动修改 TestLink 上测试用例的执行结果状态,完成标示结果的工作。
回传测试结果
上述步骤中,通过使用第三方自动化测试工具执行完毕自动化测试用例,收集到测试结果。下面需要进行的是,通过编写代码自动化地修改维护在 TestLink 上的自动化测试用例的执行结果状态。代码如清单 5 所示,运行下面的代码会自动把 TestLink 中测试计划下的测试用例在构建"my build"上运行的测试执行结果标记为"通过"。演示程序中,测试计划编号等数据为硬编码,读者需要根据自己的情况去完善回传测试结果的程序。如果运行失败,测试结果则标为"失败"状态,并和集成的缺陷管理系统进行自动化进行缺陷数据同步。
清单 5. 自动上传测试结果的代码清单
private static TestLinkAPI api = APIObject.getAPI();
public static void testReport() {
// 测试计划
Integer planID = 7;
// 测试测试的构建
String buildName="my build";
// 测试计划
Integer tcID = 3;
ReportTCResultResponse response = api.reportTCResult(tcID, null,
planID, ExecutionStatus.PASSED, null, buildName,
" 自动化上传结果的备注 ", null, null, null, null, null, null);
logger.debug("response=" + response);
}
结束语
通过上面对 TestLink 的介绍,我们了解到了如何基于 TestLink 管理自动化测试过程。本文详细介绍了基于 TestLink 的自动化测试解决方案的核心实现,分析了架构流程图并对主要的部分给出了代码示例。关于如何使用 TestLink 管理功能测试过程,请参考本系列文章的第一部分。