您的位置 首页 java

自动生成接口测试代码

自动生成接口测试代码

这里用之前用过的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>  

还需要解决的问题

  1. GET传参组合和POST的传参
  2. 实例中参数是写死的
  3. 第二步不能一步到位引入第一步生成的包
  4. 接口参数和地址需要人工输入

解决办法:

  1. 可以外部拼装参数组合,之后生成对应的用例
  2. 生成用例前,完成参数拼装,用到的参数使用动态传参
  3. 通过封装函数,利用泛型入参做到依赖包自动导入
  4. 通过Swagger等接口调试工具,拿到接口信息,分析提取接口地址和参数,从而生成参数和用例

通过这个工具虽然不能解决完全自动生成,但是主要的文件和部分测试入参是可以的。

完成后只需要改写下断言和复制用例再改写一下其他参数,效率提高不少

javapoet的使用方法自行学习

文章来源:智云一二三科技

文章标题:自动生成接口测试代码

文章地址:https://www.zhihuclub.com/193751.shtml

关于作者: 智云科技

热门文章

网站地图