RestAssured+Java如何解决请求存文件重复问题并将请求存为字符串
问题1:日志文件仅保留单条请求的解决方法
问题根源是你当前初始化PrintStream时用的是默认覆盖模式,每次调用方法都会清空原有文件内容再写入新日志,自然只能保留最后一次请求的记录,修改方案如下:
- 初始化文件输出流时开启追加模式:
new FileOutputStream("request_log.txt", true),第二个参数设为true即可保留历史日志 - 建议不要直接修改RestAssured全局config,将自定义日志配置绑定到当前请求的
RequestSpecification上,避免多测试用例并行执行时配置冲突
问题2:请求内容保存为String变量的解决方法
可以通过ByteArrayOutputStream承接请求日志的输出内容,执行完请求后直接转成字符串即可。可以使用TeeOutputStream同时将日志输出到文件流和字节流,一次写入同时满足两个需求,不需要重复配置规则。
完整修改后代码
import org.apache.commons.io.output.TeeOutputStream; import java.io.*; import java.nio.charset.StandardCharsets; public static Response PostInstinctQuery() throws IOException, ParseException { // 字节流用于存储请求内容转String ByteArrayOutputStream requestByteStream = new ByteArrayOutputStream(); // 文件输出流开启追加模式,保留历史请求日志 FileOutputStream fileOutputStream = new FileOutputStream("request_log.txt", true); // TeeOutputStream实现一次写入同时输出到两个流 TeeOutputStream teeOutputStream = new TeeOutputStream(requestByteStream, fileOutputStream); PrintStream logPrintStream = new PrintStream(teeOutputStream); // 配置当前请求的参数和日志规则,不修改全局配置避免冲突 RequestSpecification request = RestAssured.given() .config(RestAssured.config().logConfig(LogConfig.logConfig().defaultStream(logPrintStream))) .baseUri(BASEURI) .header("Key", key) .body(getJson()); // 输出所有请求日志到配置的流 request.log().all(); Response response = request.post(PATH); // 得到请求内容的String变量,可直接用于断言或存入测试报告上下文 String requestContent = requestByteStream.toString(StandardCharsets.UTF_8.name()); // 关闭流释放资源 logPrintStream.close(); fileOutputStream.close(); requestByteStream.close(); return response; }
补充说明
- 如果你不想引入commons-io依赖来使用
TeeOutputStream,可以分别配置两次日志输出,先写文件流再写字节流,也可以实现相同效果 - 如果是TestNG参数化测试,可以将得到的
requestContent存入ITestContext或测试类成员变量,方便后续生成测试报告时调用 - 若需要同时记录响应内容到文件和字符串,给
response.log().all()配置相同的输出流即可
内容的提问来源于stack exchange,提问作者Eyal
相关产品推荐
相关产品推荐

