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

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

Using REST Assured (4.3.3, from Java) 我可以在基础测试中自由操作请求和响应规范对象class,这样当实际测试需要请求规范时执行实际的调用,它是用某些通用语句“预配置”的。例如:

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 方法之一后可用,我无法在基本代码中执行此操作。

下面概述了我考虑过的解决此问题的方法,但前两个非常笨拙,第三个可能完全错误,因为它干扰了“内部”子中的 classes包。有这样做的“正确”方法吗?

  1. 添加一个接受 ValidatableResponse 实例的基本方法 saveCookies(),它可以在该实例上调用 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. 使用接受 lambda 的基本方法,以便可以拦截潜在的中间 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 来满足您的需求。

The cookie filter can be used to keep track of all the cookies sent by the server and use them in subsequent requests

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

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

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

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

更多信息: