自动生成接口测试代码
这里用之前用过的Retrofit2 工具为基础,生成service和用例文件
第一步:首先生成service接口类
1、设定入参为4个参数 “101010100”, “101010101”, “”,”101010103″
2、断言用同样的语句,每个用例断言不相同,生成断言难度很大,这里只生成断言语句,没有实际的校验
String url = "www.weather.com.cn";
String[] city = {"101010100", "101010101", "","101010103"};
TypeSpec.Builder builder = TypeSpec.classBuilder("AutoCreate Request Test")
.add Java doc("Auto Create")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
int total = 0;
for (String queryWord : city) {
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("test_field_" + (++total));
String httpUtilsParamName = "request";
String httpServiceParamName = "ser";
String responseParamName = "res";
String requestCreateParamName = "create";
String executeName = "execute()";
String ServiceClassName = "AutoCreate service ";
String servicePathMethodName = "getWeatherByCityUseJson";
methodBuilder.addStatement("$T $L = new $T()",
HttpUtils.class,
httpUtilsParamName,
HttpUtils.class)
.addStatement("$L $L = $L.$L($S, $L.class)", ServiceClassName,
httpServiceParamName,
httpUtilsParamName,
requestCreateParamName,
url,
ServiceClassName)
.addStatement("$T<$T> $L = $L.$L($S).$L", Response.class, JSONObject.class, responseParamName, httpServiceParamName, servicePathMethodName, queryWord, executeName)
.addStatement("$T.out.println($L)", System.class, "res.body().getString("data")")
.addStatement("$T.assertTrue($S,$L)", Assert.class, "判断是否测试通过", true);
MethodSpec myMethod = methodBuilder
.addModifiers(Modifier.PUBLIC)
.returns( void .class)
.add Annotation (Test.class)
.add Exception (IOException.class)
.build();
builder.addMethod(myMethod);
}
TypeSpec createClass = builder.build();
JavaFile java File = JavaFile
.builder("cases", createClass)
.build();
javaFile.writeTo(System.out);
javaFile.writeTo(new File("./src/test/java"));
}
执行后得到service文件如下
这里看一看到 相关的依赖包已经导入,不需要人工导入,文件可以直接引用
第二步:生成 测试用例 类
String url = "www.weather.com.cn";
String[] city = {"101010100", "101010101", "","101010103"};
TypeSpec.Builder builder = TypeSpec.classBuilder("AutoCreateRequestTest")
.addJavadoc("Auto Create")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL);
int total = 0;
for (String queryWord : city) {
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("test_field_" + (++total));
String httpUtilsParamName = "request";
String httpServiceParamName = "ser";
String responseParamName = "res";
String requestCreateParamName = "create";
String executeName = "execute()";
String ServiceClassName = "AutoCreateService";
String servicePathMethodName = "getWeatherByCityUseJson";
methodBuilder.addStatement("$T $L = new $T()",
HttpUtils.class,
httpUtilsParamName,
HttpUtils.class)
.addStatement("$L $L = $L.$L($S, $L.class)", ServiceClassName,
httpServiceParamName,
httpUtilsParamName,
requestCreateParamName,
url,
ServiceClassName)
.addStatement("$T<$T> $L = $L.$L($S).$L", Response.class, JSONObject.class, responseParamName, httpServiceParamName, servicePathMethodName, queryWord, executeName)
.addStatement("$T.out.println($L)", System.class, "res.body().getString("data")")
.addStatement("$T.assertTrue($S,$L)", Assert.class, "判断是否测试通过", true);
MethodSpec myMethod = methodBuilder
.addModifiers(Modifier.PUBLIC)
.returns(void.class)
.addAnnotation(Test.class)
.addException(IOException.class)
.build();
builder.addMethod(myMethod);
}
TypeSpec createClass = builder.build();
JavaFile javaFile = JavaFile
.builder("cases", createClass)
.build();
javaFile.writeTo(System.out);
javaFile.writeTo(new File("./src/test/java"));
执行生成用例文件
可以看到 代码已经生成并在指定的路径写好文件,但是之前自定义的包没有导入,需要人工导入下
执行用例,请求发送成功
备注:
生成工具为Javapoet, pom 需要引入
<dependency>
<groupId>com.squareup</groupId>
<artifactId>javapoet</artifactId>
<version>1.13.0</version>
</dependency>
还需要解决的问题
- GET传参组合和POST的传参
- 实例中参数是写死的
- 第二步不能一步到位引入第一步生成的包
- 接口参数和地址需要人工输入
解决办法:
- 可以外部拼装参数组合,之后生成对应的用例
- 生成用例前,完成参数拼装,用到的参数使用动态传参
- 通过封装函数,利用泛型入参做到依赖包自动导入
- 通过Swagger等接口调试工具,拿到接口信息,分析提取接口地址和参数,从而生成参数和用例
通过这个工具虽然不能解决完全自动生成,但是主要的文件和部分测试入参是可以的。
完成后只需要改写下断言和复制用例再改写一下其他参数,效率提高不少
javapoet的使用方法自行学习