使用 Java 随机更改每个 "Post" 请求主体的 JSON 值

Randomly changing the JSON Values for every "Post" Request Body using Java

这可能是一个重复的问题,但我无法在任何地方找到我的解决方案。因此,发布它。

我正在尝试简单地 POST 请求学生帐户创建方案。我确实有一个 JSON 文件,其中包含创建学生帐户所需的所有“键:值”。

这是文件 student_Profile.json 的样子:

{
   "FirstName":"APi1-Stud-FN",
   "MiddleInitial":"Q",
   "LastName":"APi1-Stud-LN",
   "UserAlternateEmail":"",
   "SecretQuestionId":12,
   "SecretQuestionAnswer":"Scot",
   "UserName":"APi1-stud@xyz.com",
   "VerifyUserName":"APi1-stud@xyz.com",
   "Password":"A123456",
   "VerifyPassword":"A123456",
   "YKey":"123xyz",
   "YId":6,
   "Status":false,
   "KeyCode":"",
   "SsoUserName":"APi1-stud@xyz.com",
   "SsoPassword":"",
   "BirthYear":2001
}

因此,从“放心”的角度来看,发布请求的所有内容看起来都很好,只是我想使用 [=35 从上面的 JSON 正文中更新一些值=] 这样我就可以在每次 运行 我的函数时创建一个新的学生资料,而不必手动更改正文。

对于每个 POST 学生帐户创建方案,我需要更新值 以下密钥,以便可以创建新的测试学生用户帐户:

  1. 名字
  2. 姓氏和
  3. 用户名//“VerifyUserName”和“SSO UserName”将与用户名保持相同

我修改了答案以获取随机值并将它们传递给 json 正文。随机值生成取自 this question.

的已接受答案
public void testMethod() {

    List<String> randomValueList = new ArrayList<>();

    for (int i = 0; i < 3; i++) {
        String SALTCHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        StringBuilder salt = new StringBuilder();
        Random rnd = new Random();
        while (salt.length() < 18) { // length of the random string.
            int index = (int) (rnd.nextFloat() * SALTCHARS.length());
            salt.append(SALTCHARS.charAt(index));
        }
        randomValueList.add(salt.toString());
    }

    String jsonBody = "{\n" +
            "   \"FirstName\":\"" + randomValueList.remove(0) + "\",\n" +
            "   \"MiddleInitial\":\"Q\",\n" +
            "   \"LastName\":\"" + randomValueList.remove(0) + "\",\n" +
            "   \"UserAlternateEmail\":\"\",\n" +
            "   \"SecretQuestionId\":12,\n" +
            "   \"SecretQuestionAnswer\":\"Scot\",\n" +
            "   \"UserName\":\"" + randomValueList.remove(0) + " \",\n" +
            "   \"VerifyUserName\":\"APi1-stud@xyz.com\",\n" +
            "   \"Password\":\"A123456\",\n" +
            "   \"VerifyPassword\":\"A123456\",\n" +
            "   \"YKey\":\"123xyz\",\n" +
            "   \"YId\":6,\n" +
            "   \"Status\":false,\n" +
            "   \"KeyCode\":\"\",\n" +
            "   \"SsoUserName\":\"APi1-stud@xyz.com\",\n" +
            "   \"SsoPassword\":\"\",\n" +
            "   \"BirthYear\":2001\n" +
            "}";

    Response response = RestAssured
            .given()
            .body(jsonBody)
            .when()
            .post("api_url")
            .then()
            .extract()
            .response();

    // Do what you need to do with the response body
}

我们可以使用基于 pojo 的方法非常轻松地完成某些事情。无论有效载荷有多复杂,序列化和柴油化都是最好的答案。我已经为 api 自动化创建了一个框架模板,我们可以通过将所需的 POJO 放在路径中来使用它:

https://github.com/tanuj-vishnoi/pojo_api_automation

为了制作pojo,我也准备了好吃的给你:

https://github.com/tanuj-vishnoi/pojo_generator_using_jsonschema2pojo

以上问题可以参考JsonPath库https://github.com/json-path/JsonPath,使用这段代码:

String mypayload = "{\n" + 
                "   \"FirstName\":\"APi1-Stud-FN\",\n" + 
                "   \"MiddleInitial\":\"Q\",\n" + 
                "   \"LastName\":\"APi1-Stud-LN\"}";
    Map map = JsonPath.parse(mypayload).read("$",Map.class);
    System.out.println(list);

一旦有效负载转换为地图,您可以根据要求仅更改所需的值

生成随机字符串可以参考lib org.apache.commons.lang3.RandomStringUtils;

public static String generateUniqueString(int lenghtOfString){
         return 
 RandomStringUtils.randomAlphabetic(lenghtOfString).toLowerCase();
 }

我建议将负载存储在单独的文件中并在运行时加载它。