【问题标题】:Postman test to find a keyword in a response arrayPostman 测试以在响应数组中查找关键字
【发布时间】:2019-10-04 23:16:25
【问题描述】:

我正在邮递员中创建一个测试,以检查 JSON 中每个“名称”字段中的关键字“怀孕”。如果 JSON 中的每个 'name' 字段都包含关键字,则通过测试,否则失败。

在下面找到我尝试使用的脚本

var jsonData = pm.response.json(); 

var resultCount = jsonData.length;
for (i=0;i<resultCount;i++){
    var modelString = jsonData[i].name;
    if(modelString.indexOf("Pregnancy") > 0)
    {
       tests["Each organisation name field " +i+ " contains   \"Pregnancy\""] = modelString.has("Pregnancy");
    }
    else
    {
       pm.expect.fail("failed");
    }
}
console.log("")

[
    {
        "id": "1-116992830",
        "name": "British Pregnancy Advisory Service      (BPAS)",
        "numberOfLocations": 78
    },
    {
        "id": "1-1560082724",
        "name": "PAMS Pregnancy Ultrasound Centre      (PAMS 3D &     4D Baby Imaging)",
        "numberOfLocations": 1
    },
    {
        "id": "1-2458518720",
        "name": "Pregnancy Ultrasound Ltd      (Babyface4d)",
        "numberOfLocations": 1
    },
    {
        "id": "1-101728376",
        "name": "National Unplanned Pregnancy Advisory Service     Limited",
        "numberOfLocations": 23
    },
    {
        "id": "1-3578030817",
        "name": "Private Pregnancy Ultrasound Services Ltd trading as Expectancy Scanning Studios Ltd      (Expectancy Scanning Studios Ltd)",
        "numberOfLocations": 2
    },
    {
        "id": "1-1412821832",
        "name": "Foundation For Life (Salisbury)      (Pregnancy Advice Salisbury)",
        "numberOfLocations": 1
    },
    {
        "id": "1-2028907839",
        "name": "Miscarriage Clinic Limited      (Centre for     Reproductive Immunolgy and Pregnancy)",
        "numberOfLocations": 1
    },
    {
        "id": "1-744810951",
        "name": "Foundation For Life      (Tyneside Pregnancy Advice Centre)",
        "numberOfLocations": 1
    }
]

我的期望是,如果每个数组字段中缺少“怀孕”,它应该无法通过测试

【问题讨论】:

  • 您的问题到底是什么?我将从将搜索查询和您正在测试的字符串转换为小写开始,以便 indexOf 方法适用于“怀孕”和“怀孕”。此外,字符串 'pregnancy' 可以在索引 0 处,因此您应该检查它是否大于 -1。

标签: javascript postman postman-collection-runner postman-testcase


【解决方案1】:

我将您的 JSON 添加到 https://api.myjson.com/bins/13qh7i 以在 Postman 下创建一个用于测试的 API,并在数组中添加了一个额外的对象,其名称中没有“怀孕”一词,因此您可以看到测试在行动。

如果您遍历并检查 objects name 属性中的单词“pregnancy”,并存储在 hasPregnancy array 中找到的那些,然后您可以检查 @ 的 length 987654329@ 与 API 响应 object arraylength 对比,查看每个 object 是否确实包含关键字“怀孕”。

下面是我在测试中使用的JS代码。我还将您的indexOf 更新为includes,因为您应该在寻找&gt; -1 with indexOf。我还让modelString 变量在name 上应用toLowerCase(),以确保检查不关心大小写等。

// Get response
var jsonData = pm.response.json();
var resultCount = jsonData.length;

// Test arrays
var hasPregnancy = [];
var doesntHavePregnancy = [];

// Loop through and set arrays with matching data
for (i = 0; i < resultCount; i++) {
  var id = jsonData[i].id;
  var modelString = jsonData[i].name.toLowerCase();
  if (modelString.includes("pregnancy")) {
    hasPregnancy.push({
      "id": id,
      "hasPregnancy": modelString.has("pregnancy")
    });
  } else {
    doesntHavePregnancy.push({
      "id": id
    });
  }
}

// Check that each object in response contained keyword and length matches from test
pm.test("Expect response to contain pregnancy in each object", function() {
  console.log(hasPregnancy);
  console.log(doesntHavePregnancy);
  pm.expect(hasPregnancy.length).to.equal(resultCount);
});

【讨论】:

  • 不客气。如果它对您有用,请接受答案。谢谢!
  • 感谢您的回答,这也对我有所帮助.. 询问是否要计算怀孕人数和未怀孕人数的人数.. 因为在我的测试我想获取包含它的那些的 id,因为并非所有对象都会包含它...谢谢
【解决方案2】:

使用 ES6 reduce 函数,在迭代响应时,会累加每个项目的名称是否包含“怀孕”的结果。

const jsonData = pm.response.json();
tests[`Each organisation name field contains \"Pregnancy\"`] = jsonData
  .reduce((acc, org) => acc && org.name.toLowerCase().includes("pregnancy"));
  • 您会发现像 map 和 reduce 这样的 ES6 函数通常更具表现力
  • 使用inlcudesindexOf 更清楚你的意图
  • 我添加了toLowerCase(),所以匹配项不区分大小写

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多