Cucumber\Rest 放心:如何获取请求规格?
Cucumber\Rest Assured: How to get the request specs?
我有以下步骤:
@Given("Request specifications are set with base uri {string}")
public void setRequestsSpec(String baseUri){
requestSpecification = new RequestSpecBuilder()
.setBaseUri(baseUri)
.addFilter(new ResponseLoggingFilter())//log request and response for better debugging. You can also only log if a requests fails.
.addFilter(new RequestLoggingFilter())
.addFilter(new RcAllureFilter())
.build();
那么我有:
@When("^Azure Login Request Executed$")
public void azureLoginExecuted() {
response =
given() //Add x-www-form-urlencoded body params:
.spec(testContext().getRequestSpec())
.formParam(GRANT_TYPE_KEY, GRANT_TYPE_VALUE)
.formParam(AUTO_TEAM_CLIENT_ID_KEY, AUTO_TEAM_CLIENT_ID_VALUE)
.formParam(AUTO_TEAM_CLIENT_SECRET_KEY, AUTO_TEAM_CLIENT_SECRET_VALUE)
.formParam(RESOURCE_KEY, RESOURCE_VALUE)
.when()
.post(AUTO_TEAM_TENANT_ID + RESOURCE); //Send the request along with the resource
setAuthorizationToken();
}
如何从中提取请求的详细信息,例如 URI、headers 和参数?
我找不到可以从中提取请求详细信息的 class。
在 RequestSpecification class 中,我在这个 class 中几乎找不到任何 getter 函数。
我需要这些值来构建格式化的日志消息。
还有别的办法吗?
如果您试图从请求规范中获取详细信息,那么您可以像这样使用。
RequestSpecification spec = new RequestSpecBuilder().setContentType(ContentType.JSON).addHeader("h1", "h2")
.build();
QueryableRequestSpecification queryable = SpecificationQuerier.query(spec);
System.out.println(" Content is " + queryable.getContentType());
System.out.println(" Header is " + queryable.getHeaders().getValue("h1"));
但在您的场景中,您还需要请求详细信息。所以,最好的方法是使用一个 requestlogging 过滤器,它接受一个 PrintStream (它又可以与 ByteArrayOutPutStream 一起工作,它可以转换为一个 String )。基本思想是,将 RequestLoggingFilter 与 PRintStream 一起使用,然后使用任何代码将 PrintStream 保存到 String。你也可以使用 StringWriter。
RequestSpecification spec = new RequestSpecBuilder().build();
StringWriter requestWriter = new StringWriter();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(baos);
Response response = given().spec(spec).contentType(ContentType.JSON)
.filter(new RequestLoggingFilter(printStream)).get("https://jsonplaceholder.typicode.com/todos/1");
printStream.flush();
System.out.println(baos);
我有以下步骤:
@Given("Request specifications are set with base uri {string}")
public void setRequestsSpec(String baseUri){
requestSpecification = new RequestSpecBuilder()
.setBaseUri(baseUri)
.addFilter(new ResponseLoggingFilter())//log request and response for better debugging. You can also only log if a requests fails.
.addFilter(new RequestLoggingFilter())
.addFilter(new RcAllureFilter())
.build();
那么我有:
@When("^Azure Login Request Executed$")
public void azureLoginExecuted() {
response =
given() //Add x-www-form-urlencoded body params:
.spec(testContext().getRequestSpec())
.formParam(GRANT_TYPE_KEY, GRANT_TYPE_VALUE)
.formParam(AUTO_TEAM_CLIENT_ID_KEY, AUTO_TEAM_CLIENT_ID_VALUE)
.formParam(AUTO_TEAM_CLIENT_SECRET_KEY, AUTO_TEAM_CLIENT_SECRET_VALUE)
.formParam(RESOURCE_KEY, RESOURCE_VALUE)
.when()
.post(AUTO_TEAM_TENANT_ID + RESOURCE); //Send the request along with the resource
setAuthorizationToken();
}
如何从中提取请求的详细信息,例如 URI、headers 和参数? 我找不到可以从中提取请求详细信息的 class。 在 RequestSpecification class 中,我在这个 class 中几乎找不到任何 getter 函数。 我需要这些值来构建格式化的日志消息。 还有别的办法吗?
如果您试图从请求规范中获取详细信息,那么您可以像这样使用。
RequestSpecification spec = new RequestSpecBuilder().setContentType(ContentType.JSON).addHeader("h1", "h2")
.build();
QueryableRequestSpecification queryable = SpecificationQuerier.query(spec);
System.out.println(" Content is " + queryable.getContentType());
System.out.println(" Header is " + queryable.getHeaders().getValue("h1"));
但在您的场景中,您还需要请求详细信息。所以,最好的方法是使用一个 requestlogging 过滤器,它接受一个 PrintStream (它又可以与 ByteArrayOutPutStream 一起工作,它可以转换为一个 String )。基本思想是,将 RequestLoggingFilter 与 PRintStream 一起使用,然后使用任何代码将 PrintStream 保存到 String。你也可以使用 StringWriter。
RequestSpecification spec = new RequestSpecBuilder().build();
StringWriter requestWriter = new StringWriter();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(baos);
Response response = given().spec(spec).contentType(ContentType.JSON)
.filter(new RequestLoggingFilter(printStream)).get("https://jsonplaceholder.typicode.com/todos/1");
printStream.flush();
System.out.println(baos);