如果我想提取 JSON 响应值并避免在开始时使用静态变量,如何在 RestAssured 中使用 HashMaps?
How to use HashMaps in RestAssured if I want to extract the JSON response value and avoid using static variables at the beginning?
现在我正在使用 JSON 路径函数来获取 JSON 响应值,例如 placeid、profileid,然后将其声明为静态的,因为我需要在 clickProfile( ) 和 clickPlace() 函数。展望未来,我将有很多值,如 placeid、profileid、contentid 等,我想避免那些在开始时声明为静态字符串的值。相反,我想在这里继续使用 Maps 概念,并希望从框架 Utility 中使用它。
我是 HashMap 的新手。有人可以在这里帮助我实现地图概念吗?
public static String placeid;
public static String profileid;
public void extractplaceId()
{
placeid = getJsonPath("results.place_id");
System.out.println(placeid);
}
public void extractpleId()
{
profileid = getJsonPath("results.profile_id");
System.out.println(profileid);
}
public Response clickProfile() throws IOException
{
config.setProperty("APIendPoints.properties");
PROFILE_URL = config.getConfig().getProperty("CLICK_PROFILE") + profileid + ".json";
response = requestSpec.when().get(PROFILE_URL);
return response;
}
public Response clickPlace() throws IOException
{
config.setProperty("APIendPoints.properties");
PLACE_URL = config.getConfig().getProperty("CLICK_PLACE") + placeid + ".json";
response = requestSpec.when().get(PLACE_URL);
return response;
}
框架实用程序:
public String getJsonPath(String key)
{
String resp = response.asString();
JsonPath js = new JsonPath(resp);
return js.get(key).toString();
}
我假设您想要一些类似所有变量的包,您希望稍后保存和检索这些变量。我下面的 POC 只适用于单线程,不确定多线程。
- 一个class到add/get/edit/remove个变量。它包装了一个 Map 来完成这个技巧。
public class EnvironmentVariable {
private static final Map<String, Object> variables = new HashMap<>();
public static void add(String key, Object value) {
variables.put(key, value);
}
public static Object get(String key) {
return variables.get(key);
}
public static void edit(String key, Object value) {
variables.put(key, value);
}
public static Object remove(String key) {
return variables.remove(key);
}
}
- ExtractUtil class 提供函数
extract
或 extractAndSave
public class ExtractUtils {
public static Object extractFrom(Response res, String query){
return res.jsonPath().get(query);
}
public static void extractAndSave(Response res, String query, String key) {
Object value = res.jsonPath().get(query);
EnvironmentVariable.add(key, value);
}
}
- 测试客户端
public class TestClient {
public Response test() {
return given().get("https://auto-test-challenges.herokuapp.com/challenge3restassured");
}
@Test
void name() {
Response res = test();
ExtractUtils.extractAndSave(res, "data.key1.number", "key1_number");
given().log().all().get("https://postman-echo.com/get?a=" + EnvironmentVariable.get("key1_number"));
}
@Test
void name2() {
Response res = test();
int key2_number = (Integer) ExtractUtils.extractFrom(res, "data.key2.number");
EnvironmentVariable.add("key2_number", key2_number);
given().log().all().get("https://postman-echo.com/get?a=" + EnvironmentVariable.get("key2_number"));
}
}
因为我希望我的地图可以保存任何对象,所以我使用Map<String,Object>
。它需要强制转换才能从地图中获取价值,例如 int key2_number = (Integer) ExtractUtils.extractFrom(res, "data.key2.number");
现在我正在使用 JSON 路径函数来获取 JSON 响应值,例如 placeid、profileid,然后将其声明为静态的,因为我需要在 clickProfile( ) 和 clickPlace() 函数。展望未来,我将有很多值,如 placeid、profileid、contentid 等,我想避免那些在开始时声明为静态字符串的值。相反,我想在这里继续使用 Maps 概念,并希望从框架 Utility 中使用它。
我是 HashMap 的新手。有人可以在这里帮助我实现地图概念吗?
public static String placeid;
public static String profileid;
public void extractplaceId()
{
placeid = getJsonPath("results.place_id");
System.out.println(placeid);
}
public void extractpleId()
{
profileid = getJsonPath("results.profile_id");
System.out.println(profileid);
}
public Response clickProfile() throws IOException
{
config.setProperty("APIendPoints.properties");
PROFILE_URL = config.getConfig().getProperty("CLICK_PROFILE") + profileid + ".json";
response = requestSpec.when().get(PROFILE_URL);
return response;
}
public Response clickPlace() throws IOException
{
config.setProperty("APIendPoints.properties");
PLACE_URL = config.getConfig().getProperty("CLICK_PLACE") + placeid + ".json";
response = requestSpec.when().get(PLACE_URL);
return response;
}
框架实用程序:
public String getJsonPath(String key)
{
String resp = response.asString();
JsonPath js = new JsonPath(resp);
return js.get(key).toString();
}
我假设您想要一些类似所有变量的包,您希望稍后保存和检索这些变量。我下面的 POC 只适用于单线程,不确定多线程。
- 一个class到add/get/edit/remove个变量。它包装了一个 Map 来完成这个技巧。
public class EnvironmentVariable {
private static final Map<String, Object> variables = new HashMap<>();
public static void add(String key, Object value) {
variables.put(key, value);
}
public static Object get(String key) {
return variables.get(key);
}
public static void edit(String key, Object value) {
variables.put(key, value);
}
public static Object remove(String key) {
return variables.remove(key);
}
}
- ExtractUtil class 提供函数
extract
或extractAndSave
public class ExtractUtils {
public static Object extractFrom(Response res, String query){
return res.jsonPath().get(query);
}
public static void extractAndSave(Response res, String query, String key) {
Object value = res.jsonPath().get(query);
EnvironmentVariable.add(key, value);
}
}
- 测试客户端
public class TestClient {
public Response test() {
return given().get("https://auto-test-challenges.herokuapp.com/challenge3restassured");
}
@Test
void name() {
Response res = test();
ExtractUtils.extractAndSave(res, "data.key1.number", "key1_number");
given().log().all().get("https://postman-echo.com/get?a=" + EnvironmentVariable.get("key1_number"));
}
@Test
void name2() {
Response res = test();
int key2_number = (Integer) ExtractUtils.extractFrom(res, "data.key2.number");
EnvironmentVariable.add("key2_number", key2_number);
given().log().all().get("https://postman-echo.com/get?a=" + EnvironmentVariable.get("key2_number"));
}
}
因为我希望我的地图可以保存任何对象,所以我使用Map<String,Object>
。它需要强制转换才能从地图中获取价值,例如 int key2_number = (Integer) ExtractUtils.extractFrom(res, "data.key2.number");