본문 바로가기
초보 개발자/QA

[QA] #3. 소나큐브 결과 출력하기 (Json)

by 랩장 2021. 11. 14.

# 소나큐브 SonarQube 분석 결과 출력하기

 앞선 포스팅과 같이 정상적으로 소나큐브 설치 및 프로젝트 분석을 수행하셨다면, 경우에 따라서 수백 수천 개의 이슈들을 확인하실 수 있습니다. 좋습니다. 그런데 가끔 이 결과를 별도의 xls 이나 txt 파일로 저장 혹은 관리해야 할 경우가 있습니다. 특히 저 같은 QA 담당자의 경우는 품질 검수를 통해 확인된 오류들의 Issue Tracking을 위해 Jira혹은 별도의 툴을 사용하고 있는데요, SonarQube 같은 경우는 dashboard를 통해 간단히 확인은 가능합니다만 결과물을 정리하기에는 다소 어려움이 있습니다. 물론 엔터프라이즈 버전을 구입할 경우에는 별도의 리포팅 툴이 제공되는 것으로 알고 있습니다. 

SonarQube Issues 보기에는 좋지만 정리하기에 어려움이 있습니다.

 

# Web API 를 사용한 소나큐브 SonarQube 분석 결과 출력하기

Web API를 통해 SonarQube 분석 결과를 가져오는 방법은 간단합니다.

http://localhost:9000/api/issues/search?pageSize=500&componentKeys=TestProject   

pageSize          : 불러들일 page size
componentKeys : 결과를 가져올 Project 명 혹은 ProjectKey

위 주소를 웹 브라우저에 그대로 복붙하시면 Json 형식으로 SonarQube의 Issue 들을 확인해보실 수 있습니다. 제 경우는, 

SonarQube Issues Json 결과

# 소나큐브 SonarQube 분석 결과 Json 형태 변환 

 내친 김에, Json 형태의 SonarQube 결과 값을 텍스트 형식으로 변환하는 파싱 프로그램을 만들어 보았습니다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;


public class sonarQubeRsltParse {
        
        private static HttpURLConnection testHttpUrlConnection() throws MalformedURLException, IOException {
            
            long startTime = System.currentTimeMillis();            
            URL url = new URL("http://localhost:9000/api/issues/search?pageSize=500&componentkeys=TestProject");            
            HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
            long endTime   = System.currentTimeMillis();
            
            int statusCode = httpConn.getResponseCode();
        
            String pf = "";
            
            
            if (statusCode == 200){
            	// 성공했을 경우 응답 코드 200
                pf = "Success";
            }else{
                pf = "Fail";                
            }
        
            System.out.println("1.connection " + pf + " in " + (endTime - startTime) +" millisecond");
            System.out.println("2.resposecode : " + statusCode);
            
            return httpConn;
        
        }       
        
        private static int getResponseStatus() throws MalformedURLException, IOException {
            
            URL url = new URL("http://localhost:9000/api/issues/search?pageSize=500&componentkeys=TestProject");
            HttpURLConnection httpCon = (HttpURLConnection)url.openConnection();            
            int responseCode = httpCon.getResponseCode();
            
            return responseCode;
        }
        
        
        private static String getJsonObjectString(BufferedReader br) throws MalformedURLException, IOException, ParseException{
        
            JSONParser jsonPar = new JSONParser();
            JSONObject jsonObj = (JSONObject)jsonPar.parse(br);
            
            JSONObject outputJsonObj = new JSONObject();
            
            outputJsonObj.put("total", jsonObj.get("total").toString());
            
            JSONArray rsltpathArray = (JSONArray)jsonObj.get("components");
            
            for (int i = 0; i < rsltpathArray.size(); i++){
                JSONObject rsltObject = (JSONObject)rsltpathArray.get(i);               
                System.out.println(rsltObject.get("path"));
            }
            
            JSONArray rsltissueArray = (JSONArray) jsonObj.get("issues");
            
            // 결과값 출력
            for (int i = 0; i  < rsltissueArray.size(); i ++){
                JSONObject rsltObject = (JSONObject) rsltissueArray.get(i);
                System.out.println("****************************************************************");    
                System.out.println("component : " + rsltObject.get("component"));
                System.out.println("severity  : " + rsltObject.get("severity"));
                System.out.println("line      : " + rsltObject.get("line"));
                System.out.println("message   : " + rsltObject.get("message"));
                System.out.println("type      : " + rsltObject.get("type"));
                System.out.println("textRange : " + rsltObject.get("textRange"));
                System.out.println("status    : " + rsltObject.get("status"));           
            }
            
            String outputString = outputJsonObj.toJSONString();
            
            return outputString;
        
        }
        
        
        public static void main(String[] ars) throws MalformedURLException, IOException, ParseException{            
        
            HttpURLConnection httpConn = testHttpUrlConnection();
            int statusCode = getResponseStatus();
            
            String res = null;
            
            if (statusCode == 200){
           	// 성공했을 경우 응답 코드 200
                BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
                
                res = getJsonObjectString(br);
                
                System.out.println("result string : "+ res);
            }
        }       
}

결과는 다음과 같습니다.

소나큐브 결과를 Json 형식으로 가져온 후, 파싱을 통해 text 형태로 변환해 보았습니다. 추후에는 소나큐브 SonarQube의 룰 세팅에 대해 정리해 보겠습니다. 혹여나 잘못된 부분이 있으면 댓글 남겨주시면 감사하겠습니다.

반응형

댓글