基于Java实现代码级集成测试
对于代码级接口测试来说,我们可以按照接口的调用顺序分为自上而下或者自下而上。通常情况下我们建议大家按照自下而上的策略来进行接口测试,这样可以保证测试的完整性,同时代码出现问题时定位更加容易。但是所付出的时间成本也是比较高的。所以,集成测试方法便应运而生。
实验简介
对于代码级接口测试来说,我们可以按照接口的调用顺序分为自上而下或者自下而上。通常情况下我们建议大家按照自下而上的策略来进行接口测试,这样可以保证测试的完整性,同时代码出现问题时定位更加容易。但是所付出的时间成本也是比较高的。所以,集成测试方法便应运而生。
实验目的
(1) 掌握集成测试的价值。
(2) 理解代码级集成测试的实施过程。
实验流程
1. 什么是集成测试
比如有A,B,C三个接口,其调用关系为:A->B->C。通常这种情况下,接口A更多用于控制,接口C更多是实现算法,大家也可以参考ArrayCompare里面的接口调用关系图,来验证这种说法。
我们通过先测试C接口,再测试B接口,最后测试A接口,这就是自下而上,这样可以保证所有接口都能够被测试到位,当然,所消耗的时间当然更长。但是也有一种效率更高的测试方法,直接对A接口进行测试,那么此时自然而然就会把B和C接口一并进行了测试。只要A接口没有问题,我们就可以不再对B和C进行测试,有问题的情况下,我们再对B进行测试。这就是自上而下的测试,也是集成测试的核心,可以大大提升测试效率,当然,代价就是测试是不完整的。
事实上,从这一角度来说,无论是后续的界面级测试还是协议级测试,都是集成测试的一种体现。唯一的不同仅在于,驱动该接口执行的手段是通过直接调用接口,还是通过发送协议,或者是通过操作某个界面上的按钮而已。
2. 分析上层接口mainCompare
在ArrayCompare项目中,我们可以看到有一个这样的上层接口“mainCompare()”,其代码的调用关系为:mainCompare -> mainCheck -> arrayCompare和arraySort。所以我们按照集成测试的策略,从上而下进行,如果我们对mainCompare进行集成测试,一旦考虑到所有的测试用例的情况下都能工作正常,那么我们将不再需要对另外三个下层的接口进行测试,相信这个原理大家是能够理解的。
那么现在的问题来了,mainCompare接口的参数是两个String型的数组,返回值类型为一个String型的结果。数组是一个引用类型,不是基本类型,我们能不能要求用户在某一个文本框或者命令行里面输入一个数组呢?当然是不可能的。通常情况下,用户通过键盘进行输入的数据无非两类:数字和字符。所以,针对两个字符串类型的参数,我们应该如何转换为标准的用户可输入的数据进行处理呢?
3. 集成测试代码实现
package com.woniuxy.test;
import java.text.SimpleDateFormat; import java.util.Date; import com.woniuxy.compare.*;
public class IntegrationTest { // 输出一些附加信息,用于测试结果报告 public void printExtraInfo() { System.out.println("被测版本: 6.1.7600"); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date date = new Date(); String datetime = formatter.format(date.getTime()); System.out.println("测试时间: " + datetime); System.out.println(""); } // 模拟用户输入数字的情况来完成参数的拼装和调用 public String testMainCompare(int a1, int a2, int a3, int b1, int b2, int b3) { CompareHandle ch = new CompareHandle(); String result = ""; Integer[] sourcea = {a1, a2, a3}; Integer[] sourceb = {b1, b2, b3};
result = ch.mainCompare(sourcea, sourceb); return result; } // 实现测试驱动程序 public void assertMainCompare(String expect, String actual) { if (expect == actual) { System.out.println("接口: CompareHandle->MainCompare 测试通过. "); System.out.println("返回结果: " + actual); System.out.println(""); } else { System.out.println("接口: CompareHandle->MainCompare 测试失败. "); System.out.println("期望值: " + expect); System.out.println("实际值: " + actual); System.out.println(""); } } public static void main(String args[]) { IntegrationTest it = new IntegrationTest(); it.printExtraInfo(); it.assertMainCompare("结果: 数组相同.", it.testMainCompare(2, 3, 1, 2, 3, 1)); it.assertMainCompare("结果: 数组排序后相同.", it.testMainCompare(2, 3, 1, 3, 2, 1)); } } |
思考练习
(1) 为什么不直接为mainCompare传递数组作为参数,还要先进行参数的拼装处理?
(2) 代码级集成测试与模块级或系统级集成测试有什么区别?