在Java中使用多条记录验证数组JSON响应
我们有API,它给出了以下响应在Java中使用多条记录验证数组JSON响应,java,rest-assured,Java,Rest Assured,我们有API,它给出了以下响应 [ { "subject": "English", "Marks": "79" }, { "subject": "Maths", "Marks&qu
[
{
"subject": "English",
"Marks": "79"
},
{
"subject": "Maths",
"Marks": "89"
}
]
我们需要证实这一点
科目=英语,分数=79
科目=数学,成绩=89分
我们已经试过了,但没有成功
JSONArray jsonarray = new JSONArray(strindentify);
for (int i = 0; i < jsonarray.length(); i++) {
JSONObject jsonobject = jsonarray.getJSONObject(i);
String type = jsonobject.getString("subject");
Assert.assertEquals(type, "English");
String value = jsonobject.getString("Marks");
Assert.assertEquals(value, "79");
System.out.println(" The Subject and Marks:-" +type +"and" +value );
}
JSONArray JSONArray=新的JSONArray(strindentify);
for(int i=0;i
需要断言Subject=English然后Marks=79等您的断言有问题。您必须将两个字符串传递给assertEquals:
Assert.assertEquals(type, "English");
for循环在每次迭代中检查两个主题。相反,您将希望在每次迭代中获得“subject”和“marks”的单个值,并根据主题检查您的条件 例如:
JSONArray jsonarray = new JSONArray(strindentify);
Assert.assertEquals(2, jsonarray.length, "Expected exactly 2 entries in array"); //optional
for (int i = 0; i < jsonarray.length(); i++) {
JSONObject jsonobject = jsonarray.getJSONObject(i);
String type = jsonobject.getString("subject");
String value = jsonobject.getString("Marks");
System.out.println(" The Subject and Marks:-" +type +"and" +value );
switch(type) {
case "English": Assert.assertEquals(value, "79"); break;
case "Maths": Assert.assertEquals(value, "89"); break;
default: throw new RuntimeException("Unexpected subject"); //optional
}
}
JSONArray JSONArray=新的JSONArray(strindentify);
Assert.assertEquals(2,jsonarray.length,“在数组中应该正好有2个条目”)//可选择的
for(int i=0;i
注意“//optional”行,如果数组中有多于或少于2个项目,或者遇到英语或数学以外的任何科目,则分别会导致测试失败。
请注意,如果数组包含2个条目,但都是英语或数学,则此操作不会失败
我使用了一个开关
,它允许您轻松地添加其他主题/标记组合。if/else构造也同样有效。如果使用开关
,请记住断开 @测试
@Test
public void test_validJson() {
String input = "Your_string_json_here";
JSONArray jsonarray = new JSONArray(input);
Assert.assertNotNull(jsonarray);
for (int i = 0; i < jsonarray.length(); i++) {
JSONObject jsonobject = jsonarray.getJSONObject(i);
Assert.assertNotNull(jsonobject);
String subject = jsonobject.getString("subject");
String value = jsonobject.getString("Marks");
Assert.assertNotNull(subject);
Assert.assertNotNull(value);
switch(subject) {
case "English" :
Assert.assertEquals(value, "79");
break;
case "Maths" :
Assert.assertEquals(value, "89");
break;
default:
// Fail on unrecognized subject?
throw new AssertionException();
}
}
}
公共无效测试_validJson(){
String input=“您的字符串在这里”;
JSONArray JSONArray=新JSONArray(输入);
Assert.assertNotNull(jsonarray);
for(int i=0;i
请注意,如果缺少主题和/或值,此操作将失败,对于未知主题也将失败。这并不保证数组的长度或元素的顺序,例如英语必须是第一个数组项等。重复的受试者也不会不通过测试。这只是验证如果给定的受试者包括在响应中,那么他们各自的分数与给定的分数相同
根据你的喜好修改这个
编辑:
如果要仅验证所选主题,请执行以下操作:
List<String> knownSubjects = Arrays.asList("History", "Maths", "English", "whatever");
Assert.assertTrue(knownSubjects.contains(subject));
List knownsobjects=Arrays.asList(“历史”、“数学”、“英语”、“随便什么”);
Assert.assertTrue(knownsobjects.contains(subject));
如果要仅验证具有已知标记的已知主题:
Map<String, String> subjectMarks = new HashMap<>();
subjectMarks.put("English", "89");
subjectMarks.put("Maths", "79");
subjectMarks.put("Whatever", "10");
Assert.assertTrue(subjectMarks.keySet().contains(subject));
Assert.assertEquals(value, subjectMarks.get(subject));
Map subjectMarks=newhashmap();
主语标记。put(“英语”,“89”);
科目分数。把(“数学”,“79”);
主题标记。放上(“无论什么”,“10”);
Assert.assertTrue(subjectMarks.keySet().contains(subject));
Assert.assertEquals(value,subjectMarks.get(subject));
我相信你的意思是“需要声明,如果主题=英语,那么分数=79”。缺少的“if”是这里的关键字,因为要做到这一点,您需要在代码中使用if
语句,而我没有看到这些语句。再试一次。在这个测试用例中,我们可以查看您的导入或hasItem(String)
的来源吗?如果不知道hasItem()
的来源,您就不能确定字符串没有作为参数传入。在您看来,hasItem()
可能会返回字符串值。虽然最好是低效的,但这可能是有效的。但是类型是字符串变量。您必须检查2个字符串的相等性。是的,我同意,但是考虑下面的<代码>公共字符串HASTION(String输入){RetryIdv};}。这就是我说它效率低下的原因。这个例子在这种情况下是可行的(尽管有很多问题)。@Haris我们修改了脚本请检查如果主题不固定,那么切换语句将不起作用,假设主题添加为历史、科学、地理等。我们使用了if和else语句,但需要动态主题。我不确定我是否理解这个问题。如果你有一个应该被接受的科目列表,我已经修改了我的问题,以包括该测试用例。如果您想为该数组包括标记测试(给定主题具有给定标记),则需要使用不同的数据模型。