jq:从空手道surfire报表转换json结果,获得更简单的步骤状态

问题描述 投票:0回答:1

我想知道如何使用jq转换json,但我不太了解如何获得理想的结果;从此内容开始(我通过surfire-report测试自动化从karate获得):

来源:

[
    {
        "line": 1,
        "elements": [
            {
                "line": 3,
                "name": "",
                "description": "",
                "type": "background",
                "keyword": "Background",
                "steps": [
                    {
                        "name": "url 'http:\/\/be-service.test.svc.cluster.local\/SVC_INTERFACE_V1'",
                        "result": {
                            "duration": 256885,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "*",
                        "line": 4,
                        "doc_string": {
                            "content_type": "",
                            "value": "10:54:12.945 karate.env",
                            "line": 4
                        }
                    }
                ]
            },
            {
                "line": 9,
                "name": "",
                "description": "",
                "id": "SoapEsbBackEnd1",
                "type": "scenario",
                "keyword": "Scenario",
                "steps": [
                    {
                        "name": "request",
                        "result": {
                            "duration": 92526141,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "Given",
                        "line": 11,
                        "doc_string": {
                            "content_type": "",
                            "value": "<soap:Envelope xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\">\n   <\/soap:Envelope>",
                            "line": 11
                        }
                    },
                    {
                        "name": "header Content-Type = 'application\/soap+xml; charset=utf-8'",
                        "result": {
                            "duration": 1834255,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "And",
                        "line": 74
                    },
                    {
                        "name": "method post",
                        "result": {
                            "duration": 102112259,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "When",
                        "line": 76,
                        "doc_string": {
                            "content_type": "",
                            "value": "10:54:13.140 request:\n1 > POST http:\/\/be-service.test.svc.cluster.local\/SVC_INTERFACE_V1",
                            "line": 76
                        }
                    },
                    {
                        "name": "status 200",
                        "result": {
                            "duration": 49328,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "Then",
                        "line": 77
                    },
                    {
                        "name": "def envelope = response['soapenv:Envelope']",
                        "result": {
                            "duration": 591138,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "*",
                        "line": 79
                    },
                    {
                        "name": "def body = response['soapenv:Envelope']['_']['soapenv:Body']",
                        "result": {
                            "duration": 470207,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "*",
                        "line": 81
                    },
                    {
                        "name": "def result = body['NS1:monitoraggioJBossResponse']._",
                        "result": {
                            "duration": 354671,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "*",
                        "line": 83
                    },
                    {
                        "name": "def esito = result.esito",
                        "result": {
                            "duration": 296656,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "*",
                        "line": 87
                    },
                    {
                        "name": "match esito == 'ERR'",
                        "result": {
                            "duration": 249327,
                            "status": "passed"
                        },
                        "match": {
                            "location": "karate",
                            "arguments": []
                        },
                        "keyword": "*",
                        "line": 89
                    }
                ],
                "tags": [
                    {
                        "name": "@esb",
                        "line": 6
                    },
                    {
                        "name": "@esb_svc_monitoraggio_ko",
                        "line": 6
                    },
                    {
                        "name": "@ko",
                        "line": 6
                    }
                ]
            }
        ],
        "name": "features\/esb-be1.feature",
        "description": "esb be first request",
        "id": "esb-be-first-request",
        "keyword": "Feature",
        "uri": "features\/esb-be1.feature"
    }
]

我想要得到的是:

    [
        { "name":  "url 'http://be-service.test.svc.cluster.local/SVC_INTERFACE_V1'" , "status": "passed" },
        { "name":  "request" , "status": "passed" },
        { "name":  "header Content-Type = 'application/soap+xml; charset=utf-8'" , "status": "passed" },
        { "name":  "method post" , "status": "passed" },
        { "name":  "status 200" , "status": "passed" },
        { "name":  "def envelope = response['soapenv:Envelope']" , "status": "passed" },
        { "name":  "def body = response['soapenv:Envelope']['_']['soapenv:Body']" , "status": "passed" },
        { "name":  "def result = body['NS1:monitoraggioJBossResponse']._" , "status": "passed" },
        { "name":  "def esito = result.esito" , "status": "passed" },
        { "name":  "match esito == 'ERR'" , "status": "passed" }
    ]

我从现在开始尝试过的事情:

$ cat $JSON_FILE | jq '.[].elements[].steps[].name,.[].elements[].steps[].result.status'                                                   
"url 'http://be-service.test.svc.cluster.local/SVC_INTERFACE_V1'"
"request"
"header Content-Type = 'application/soap+xml; charset=utf-8'"
"method post"
"status 200"
"def envelope = response['soapenv:Envelope']"
"def body = response['soapenv:Envelope']['_']['soapenv:Body']"
"def result = body['NS1:monitoraggioJBossResponse']._"
"def esito = result.esito"
"match esito == 'ERR'"
"passed"
"passed"
"passed"
"passed"
"passed"
"passed"
"passed"
"passed"
"passed"
"passed"
json jq karate
1个回答
1
投票

仅使对象脱离那些结果。

jq -c '{
    name:(.[].elements[].steps[].name,.[].elements[].steps[].result.status | select(. != "passed"))
}' file

enter image description here


0
投票

我的答案利用了手册中描述的object construction的“快捷语法”。它创建两个对象,然后将它们添加在一起。开头和结尾的方括号将输出放在数组中。

jq '[.[].elements[].steps[]|{name} + (.result|{status})]'

这是等效的,这是值得的。map(x)in the manual的定义说明了原因。

jq 'map(.elements[].steps[]|{name} + (.result|{status}))'
© www.soinside.com 2019 - 2024. All rights reserved.