繁体   English   中英

如何使用通用代码从 REST Assured 响应中提取 cookie

[英]How to extract cookies from a REST Assured response using common code

使用 REST Assured(4.3.3,来自 Java)我可以自由地操作基础测试类中的请求和响应规范对象,这样当实际测试需要请求规范来执行实际调用时,它是“预配置”的常见的说法。 例如:

public abstract class TestBase
    protected RequestSpecification request() {
        return given()
                .cookies(globalCookies)
                .port(serverPort)
                .log().ifValidationFails()
                .then()
                .log().ifValidationFails()
                .given();
    }
}
public class ActualTest extends TestBase {
  @Test
  public void test1() {
    String content = request().get("/some").then()
           .statusCode(200)
           .extract()
           .body().asString();
  }
}

我现在想做的是“预配置”规范以在请求之间保留 cookie。 我正在使用RequestSpecification.cookies(Cookies)要发送的 cookie 列表,但我找不到任何方法来指示规范在获取Response实例之前提取返回的 cookie。 但是,此类实例仅在调用RequestSender方法之一后才可用,而我无法在基本代码中执行此操作。

下面概述了我考虑过的解决此问题的方法,但前两个非常笨拙,第三个可能完全错误,因为它与“内部”子包中的类发​​生冲突。 有没有“正确”的方法来做到这一点?

  1. 添加一个基本方法saveCookies() ,它接受ValidatableResponse一个实例,它可以在该实例上调用extract()并获取 cookie。 然后每次测试都必须使用该方法。
public abstract class TestBase
  // ...
  protected ValidatableResponse saveCookies(ValidatableResponse r) {
    saveGlobalCookies(r.extract().detailedCookies());
    return r;
  }
}
public class ActualTest extends TestBase {
  @Test
  public void test1() {
    String content = saveCookies(request().get("/some").then())
           .statusCode(200)
           .extract()
           .body().asString();
  }
}
  1. 使用接受 lambdas 的基本方法,以便可以拦截潜在的中间ValidatableResponse ,并将最终结果(如果需要)返回给调用者。
public abstract class TestBase
  // ...
  <T> T cookieRequest(Function<RequestSender, ValidatableResponse> exec, Function<ValidatableResponse, T> post) {

        ValidatableResponse vr = exec.apply(request());
        saveGlobalCookies(vr.extract().detailedCookies());
        return post.apply(vr);

    }
}
public class ActualTest extends TestBase {
  @Test
  public void test1() {
    String content = cookieRequest(r->r.get("/some").then(),
       r->r.extract().body().asString());
  }
}
  1. 实例化ResponseSpecificationImpl扩展实例(拖动RequestSpecificationImplTestSpecificationImpl )。

您可以使用CookieFilter来满足您的需求。

cookie 过滤器可用于跟踪服务器发送的所有 cookie 并在后续请求中使用它们

您可以通过两种方式使用此类:

  1. 静态设置:
RestAssured.filters(new CookieFilter());
  1. 指定您想要的请求:
CookieFilter cookieFilter = new CookieFilter();

//Request 1  
given().filter(cookieFilter).get("/x");

//Request 2
given().filter(cookieFilter).get("/y");

想要查询更多的信息:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM