JQ 格式 jenkins testreport json 到 csv

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

我有以下基本文件(试图使其尽可能小) 来自詹金斯夜间测试报告

{
  "_class" : "hudson.tasks.junit.TestResult",
  "testActions" : [
    
  ],
  "duration" : 9408.876,
  "empty" : false,
  "failCount" : 4,
  "passCount" : 147,
  "skipCount" : 1040,
  "suites" : [
    {
      "cases" : [
        {
          "testActions" : [
            
          ],
          "age" : 0,
          "className" : "Main testsuite 1",
          "duration" : 17.281,
          "errorDetails" : null,
          "errorStackTrace" : null,
          "failedSince" : 0,
          "name" : "testcase 1.1",
          "properties" : {
            
          },
          "skipped" : false,
          "skippedMessage" : null,
          "status" : "PASSED",
          "stderr" : null,
          "stdout" : null
        },
        {
          "testActions" : [
            
          ],
          "age" : 0,
          "className" : "Main testsuite 1",
          "duration" : 40.538,
          "errorDetails" : null,
          "errorStackTrace" : null,
          "failedSince" : 0,
          "name" : "testcase 1.2",
          "properties" : {
            
          },
          "skipped" : false,
          "skippedMessage" : null,
          "status" : "PASSED",
          "stderr" : null,
          "stdout" : null
        }
      ],
      "duration" : 170.714,
      "enclosingBlockNames" : [
        "Blockname 1",
        "Blockname 2"
      ],
      "enclosingBlocks" : [
        "52",
        "25"
      ],
      "id" : null,
      "name" : "Main testsuite 1",
      "nodeId" : "67",
      "properties" : {
        
      },
      "stderr" : null,
      "stdout" : null,
      "timestamp" : null
    },
      {
      "cases" : [
        {
          "testActions" : [
            
          ],
          "age" : 0,
          "className" : "Main testsuite 2",
          "duration" : 17.781,
          "errorDetails" : null,
          "errorStackTrace" : null,
          "failedSince" : 0,
          "name" : "testcase 2.1",
          "properties" : {
            
          },
          "skipped" : false,
          "skippedMessage" : null,
          "status" : "FIXED",
          "stderr" : null,
          "stdout" : null
        },
        {
          "testActions" : [
            
          ],
          "age" : 1,
          "className" : "Main testsuite 2",
          "duration" : 184.508,
          "errorDetails" : "short error message",
          "errorStackTrace" : "longer error message",
          "failedSince" : 2410,
          "name" : "testcase 2.2",
          "properties" : {
            
          },
          "skipped" : false,
          "skippedMessage" : null,
          "status" : "FAILED",
          "stderr" : null,
          "stdout" : "Random pretty long error message"
        }
      ],
      "duration" : 215.862,
      "enclosingBlockNames" : [
        "Others",
        "Blockname 2"
      ],
      "enclosingBlocks" : [
        "98",
        "25"
      ],
      "id" : null,
      "name" : "Main testsuite 2",
      "nodeId" : "113",
      "properties" : {
        
      },
      "stderr" : null,
      "stdout" : null,
      "timestamp" : null
    }
]
 
}
  1. 我需要根据这个 json 创建一个 csv 文件
  2. 文件顶部的
  3. passCount
    failCount
    ,包括值(仅显示一次)
  4. 仅具有
    "status": "FAILED"
  5. 的测试用例“案例”
  6. 通常只有以下键/值对:
    className, name, errorDetail, status

我设法制作了我的部分要求,但不是一次性全部制作完成,尤其是不是在 csv 文件中

json jq
1个回答
0
投票

请先修正输入数据。它包含两个

"className" : "className" : …
实例,这破坏了 JSON 有效性。

迭代数组项并构造相应的数组,然后使用

@csv
-r
标志创建 CSV 输出:

jq -r '
  [.passCount, .failCount] + (
    .suites[].cases[] | select(.status == "FAILED")
    | [.className, .name, .errorDetails, .status]
  ) | @csv
'
147,4,"Main testsuite 2","testcase 2.2","short error message","FAILED"

演示

© www.soinside.com 2019 - 2024. All rights reserved.