【问题标题】:POSTMAN: How to Check in Json response Array if a key:value existPOSTMAN:如果键:值存在,如何检查 Json 响应数组
【发布时间】:2018-09-16 02:20:36
【问题描述】:

如果 key:value 存在,我想检查我的 JSON 响应 Array如果找到 key:value 我想要退出循环并获得测试结果。 你能支持我怎么做吗?

例如我有以下回应:

[
    {
        "persID": "personID_1",
        "vip": false,
        "account": {
            "contactName": "value1",
        },
        "premium": {
            "Name": "value2",
            "Director": "value3",
            "company": "value7",
            "homePage": "value6",
            "address": {
                "country": "value8",
                "city": "value9"
            },
            "photo": value10
        }
    },
    {
        "persID": "personID_2",
        "vip": false,
        "account": {
            "contactName": "value11",
        },
        "premium": {
            "Name": "value12",
            "Director": "value13",
            "company": "value17",
            "homePage": "value16",
            "address": {
                "country": "value18",
                "city": "value19"
            },
            "photo": value110
        }
    },
    .....
    .....// dynamic response can be "n" elements!!!!
    ]

我想检查这个数组中是否存在 ("persID": "personID_3") 的键值。 (例如,对于 persID_3,结果应该是失败,而 persID_2 通过

我尝试了以下但没有结果:

var jsonArray = pm.response.json();
var persID = "persID_3";
pm.test("2. tets check if persdID exist in array", function () {
 var i=0;
 for(i; i<jsonArray.length;i++){

                pm.expect(jsonArray).to.have.property(jsonArray[i].persID, persID);
                // pm.expect(jsonArray[i]).to.have.property(jsonArray[i].persID, persID);

 }
});

也试过了 var jsonArray = JSON.parse(responseBody); 和 pm.expect(jsonArray[i]).to.have.property(jsonArray[i].persID, persID);

但没有结果

感谢您的支持。

【问题讨论】:

    标签: postman


    【解决方案1】:

    您可以使用Lodash 循环遍历数组并检查响应中的值:

    pm.test('Matches personID property value', () => {
        _.each(pm.response.json(), (arrItem) => {
            if (arrItem.persID === 'personID_2') {
                throw new Error(`Array contains ${arrItem.persID}`)
            }
        })
    });
    

    如果personID_2 属性存在,这应该会导致测试失败,但该值可以是您喜欢的任何值。我使用了您的响应数据并创建了一个快速 API 路由来向您展示这项工作。

    我将值添加到错误消息中,以便在测试输出中更具描述性。

    【讨论】:

    • 感谢 Danny 的回答,但我尝试了以下希望与您提到的相同:var jsonArray = pm.response.json();变量 i=0; for(i; i
    • 让我在本地看看,我看看有没有东西给你 - 只是为了确认一下,你想检查一下属性,如果它在那里,你想让测试失败吗?
    • 实际上,我想检查一个带有 Key AND Value X 的属性是否出现在数组列表中,如果是,则测试结果应该通过,否则失败。 (不仅是键(如果使用属性,您的意思是键也是值)仅供参考,该属性始终在数组中,但我想查看特殊键是否存在,例如 persID 总是响应但想要检查是否存在 persID = 3 的所有数组元素。谢谢
    • 该代码不符合您的要求吗?它在整个数组中循环,如果属性perID具有一定的值,在这种情况下personID_2,它将退出测试并失败。如果它没有找到{"persID": "personID_2},那么测试将通过。如果这不是您真正需要的,您可能需要重新审视您的问题,因为它太令人困惑而无法理解您现在真正需要的内容。
    【解决方案2】:

    Postman 使用 chai 的扩展实现 库。 https://github.com/postmanlabs/chai-postman

    你可以用这样的东西来检查

    我正在对响应对象进行硬编码。您可以使用 pm.response 从 API 响应中解析它...

    let resp = [{
        "persID": "personID_1",
        "vip": false,
        "account": {
            "contactName": "value1",
        },
        "premium": {
            "Name": "value2",
            "Director": "value3",
            "company": "value7",
            "homePage": "value6",
            "address": {
                "country": "value8",
                "city": "value9"
            },
            "photo": "value10"
        }
    }, {
        "persID": "personID_2",
        "vip": false,
        "account": {
            "contactName": "value11",
        },
        "premium": {
            "Name": "value12",
            "Director": "value13",
            "company": "value17",
            "homePage": "value16",
            "address": {
                "country": "value18",
                "city": "value19"
            },
            "photo": "value110"
        }
    }];
    
    pm.test('Finding person ID', function() {
        let personId = "personID_1";
    
        _.forEach(resp, (respObj, index) => {
            if (respObj.persID === personId) { // or do the vice-versa
                console.log('Found', respObj);
                throw new Error('Found it!'); // This will make the test fail
            }
        });
        // If not found then the test will pass... 
    });
    

    【讨论】:

      【解决方案3】:

      谢谢,Danny 和 Sivcan, 在您的支持下,我可以找到我需要的东西,也许不是很好的编码,但它确实有效。我无法了解您的功能(来自 Danny)如何摆脱循环。所以这个解决方案对我有用:

      // Check if the netry with Key:value persID:regDB_persID exist in Array
      var jsonArray = pm.response.json();
      var var_regDB_persID = pm.environment.get("regDB_persID");  // environment var from registration
      
      var flag = false;
       // var i=0;
          for(var i=0; i<jsonArray.length;i++){
              _.each(pm.response.json(), (arrItem) => {
                  if (arrItem.persID === (var_regDB_persID)){
                      // throw new Error(`Array contains ${arrItem.persID}`)
                  console.log(flag = true);
                  }
              });
          }
      
          pm.test('2. Get Info for all accepted User from Admin - Matches personID property value', function(){
              if (flag === true) {                        
                  return;}  // persID was in response with value   
                  else {
                   throw new Error("Array Does NOT contains" + var_regDB_persID)}
          });
      

      在这种情况下,如果有值的属性存在,它将通过这种情况。

      【讨论】:

      • 哇,那是一堆不需要的代码。我不知道为什么你有一个for loop,然后是另一个循环(_.each()) - 这些是完全相同的东西。我提供的内容将通过 whole 数组loop,如果该值在那里,则失败。只需将“personID_2”替换为pm.environment.get("regDB_persID")。如果您需要查看测试期间发生的情况,请在 _.each() 语句下添加 console.log(arrItem.persID) 以查看正在检查的项目。你的问题让人难以理解,似乎你在中途改变了主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 2018-01-25
      • 2021-07-02
      • 2010-11-25
      • 2016-07-27
      • 1970-01-01
      相关资源
      最近更新 更多