我们已有CI job把单元测试结果发布到Sonar中,但Sonar的界面,你懂的。我们希望只关注我们部门相关项目的CodeCoverage数据,以及具体不达标项目的模块。
查阅了Sonar的API文档,http://nemo.sonarqube.org/api_documentation。api/resources 可以利用。
例子:
请求:http://sonar.vip.qa.ebay.com/api/resources?resource=Scala&depth=0&metrics=coverage,test_success_density,it_coverage,total-quality&format=json&callback=jQuery19108647494609467685_1419918769346&_=1419918769347
回复:jQuery19108647494609467685_1419918769346([{"id":312828,"key":"Scala","name":"Scala","scope":"PRJ","qualifier":"SVW","date":"2014-12-29T20:31:18-0700","creationDate":"2014-07-25T12:06:48-0700","lname":"Scala","lang":"none","msr":[{"key":"coverage","val":76.0,"frmt_val":"76.0%"},{"key":"total-quality","val":86.6,"frmt_val":"86.6%"}]}]);
通过这个请求,我们就得到相应的覆盖率等数据。
我们只需要用javascript利用jQuery的Ajax调用,分析返回的数据,然后用表格的形式展示出来。
具体的代码很简单:
<!DOCTYPE html> <html> <head> <script src="../javascripts/jquery.js" type="text/javascript"></script> <link href="http://ir.qa.ebaystatic.com/z/mk/q0km4qa2bizklor5ltdsqgthq.css?dataUri=true" type="text/css" rel="stylesheet"></head> <body bgcolor="transparent"> </head> <body> <style> .table th {text-align:center} </style> <div class="span14"> <div id="divother"></div> </div> <script> $(document).ready(function(){ //alert("hi"); populateQualityConfidenceTable(); }); function sortByProperty(property) { //'use strict'; return function (a, b) { var sortStatus = 0; if (a[property] < b[property]) { sortStatus = -1; } else if (a[property] > b[property]) { sortStatus = 1; } return sortStatus; }; } function printTableHeader(val){ var tableheader = ""; if(val.msr[0]!=undefined && val.msr[1]!=undefined){ if((val.lname.replace(/ /g,"") == "Scala") ) { tableheader = '<tr class="table" style="text-align:center"><th colspan="1"><font color="blue"><a id="test" href="#" onclick="openPage(\'http://sonar.vip.qa.ebay.com/dashboard/index/' + val.key + '\');return false;">' + val.lname.replace(/ /g,"") + '</a></font></th><th></th><th colspan="1">' + val.msr[0].frmt_val + '</th><th colspan="1">0.00</th><th colspan="1">0.00</th><th colspan="1">' + val.msr[1].frmt_val + '</th></tr>'; tableheader = tableheader + '<tr><td colspan="7" align="center"><b>' + val.lname.replace(/ /g,"") + ' Sub Components</b></td></tr>'; tableheader = tableheader + '<tr><th>Product</th><th colspan="1">Module</th><th>UT Coverage</th><th>Pass</th><th>FT Coverage</th><th><a id="qc" href="#" onclick="openPage(\'http://docs.codehaus.org/display/SONAR/Total+Quality+Plugin\');return false;">Quality Confidence</a></th></tr>'; }else{ if(val.msr[1].frmt_val.replace(/%/,"")>=85){ tableheader = tableheader + '<tr bgcolor="#dedede"><td><a id="test" href="#" onclick="openPage(\'http://sonar.vip.qa.ebay.com/dashboard/index/' + val.key + '\');return false;">' + val.lname.replace(/ /g,"") + '</a></td><td></td><td>' + val.msr[1].frmt_val + '</td><td>0.00</td><td>0.00</td><td >' + val.msr[0].frmt_val + '</td></tr>'; }else{ tableheader = tableheader + '<tr bgcolor="#dedede"><td><a id="test" href="#" onclick="openPage(\'http://sonar.vip.qa.ebay.com/dashboard/index/' + val.key + '\');return false;">' + val.lname.replace(/ /g,"") + '</a></td><td></td><td bgcolor="red">' + val.msr[1].frmt_val + '</td><td>0.00</td><td>0.00</td><td >' + val.msr[0].frmt_val + '</td></tr>'; } } } return tableheader; } function populateQualityConfidenceTable(){ sonar_baseurl_head = "http://sonar.vip.qa.ebay.com/api/resources?resource="; var sonar_baseurl_tail_withzerodepth = "&depth=0&metrics=coverage,test_success_density,it_coverage,total-quality&format=json"; var sonar_baseurl_tail_withonedepth = "&depth=1&metrics=scoverage,test_success_density,it_coverage,total-quality&format=json"; var metric_scala_coverage = sonar_baseurl_head + "Scala" + sonar_baseurl_tail_withzerodepth; var metric_sub_polyglot_coverage = sonar_baseurl_head + "Scala" + sonar_baseurl_tail_withonedepth; var requestUrl = ""; var modules = 0; //alert(metric_scala_coverage); var table = '<table style="width:100%">'; $.ajax({ url : metric_scala_coverage + "&callback=?", async : false, dataType: 'json', success: function(polyjson) { $.ajax({ url : metric_sub_polyglot_coverage + "&callback=?", async : false, dataType: 'json', success: function(subpolyjson) { polyData = polyjson.concat(subpolyjson.sort(sortByProperty('lname'))); var dataArray = [polyData]; table = table + '<tr><th colspan="1">Product</th><th colspan="1">Module</th><th colspan="1">UT Coverage</th><th colspan="1">Pass</th><th colspan="1">FT Coverage</th><th colspan="1"><a id="qc" href="#" onclick="openPage(\'http://docs.codehaus.org/display/SONAR/Total+Quality+Plugin\');return false;">Quality Confidence</a></th></tr>'; for (var j = 0; j < dataArray.length; j++) { $.each(dataArray[j], function(i, val) { if(val.lname.replace(/ /g,"") == "Scala"){ table = table + printTableHeader(val); } else{ if(val.lname.replace(/ /g,"") == "higgins"){ requestUrl = sonar_baseurl_head + "com.ebay.higgins" + sonar_baseurl_tail_withonedepth; }else if(val.lname.replace(/ /g,"") == "squbs"){ requestUrl = sonar_baseurl_head + "com.ebay.squbs" + sonar_baseurl_tail_withonedepth; }else if(val.lname.replace(/ /g,"") == "rocksqubs"){ requestUrl = sonar_baseurl_head + "com.ebay.rocksqubs" + sonar_baseurl_tail_withonedepth; }else{ requestUrl = sonar_baseurl_head + "com.ebay.squbs.chnlsvc" + sonar_baseurl_tail_withonedepth; } $.ajax({ url : requestUrl + "&callback=?", async : false, dataType: 'json', success: function(json) { scalaData = json//.sort(sortByProperty('lname')); var dataArray = [scalaData]; var subtable = "" for (var k = 0; k < dataArray.length; k++) { $.each(dataArray[k], function(l, val2) { if(parseFloat(val2.msr[1].frmt_val.replace(/%/,""))>=85){ subtable = subtable + '<tr id="'+val2.lname.replace(/ /g,"")+'"><td></td><td><a id="test" href="#" onclick="openPage(\'http://sonar.vip.qa.ebay.com/dashboard/index/' + val2.key + '\');return false;">' + val2.lname.replace(/ /g,"") + '</a></td><td>' + val2.msr[1].frmt_val + '</td><td>0.00</td><td>0.00</td><td >' + val2.msr[0].frmt_val + '</td></tr>'; }else{ subtable = subtable + '<tr bgcolor="yellow" id="'+val2.lname.replace(/ /g,"")+'"><td></td><td><a id="test" href="#" onclick="openPage(\'http://sonar.vip.qa.ebay.com/dashboard/index/' + val2.key + '\');return false;">' + val2.lname.replace(/ /g,"") + '</a></td><td >' + val2.msr[1].frmt_val + '</td><td>0.00</td><td>0.00</td><td >' + val2.msr[0].frmt_val + '</td></tr>'; } }); } var tableheader = printTableHeader(val); table = table + tableheader + subtable; modules = modules + 1; //alert(modules); if(modules==4){ //alert("final"); table = table + '</table>'; var qc = $('<div class="coverageTable"><div id="coverageTable" style="border-color: #4271A5" align="center">' +'<div align="center" id="tabletarget" style="width:99%;overflow: auto;">' + table + '</div></div></div>'); $('#divother').append(qc); } } }); } }); } } }); } }); } </script> </body> </html>
这里需要注意的是,Table的拼凑部分必须放在最里层的ajax回调函数中,否则不能保证先后顺序,会导致表格出现一些错乱。
由于我们的项目是Scala项目, 所以使用了Scoverage来做unit test,所以请求中,用scoverage替换了coverage
相关推荐
该资源提供了sonar webAPI的方式创建用户、删除用户、项目权限赋值等相关脚本实现方式
利用java代码,调用sonar接口,实现在sonar里面创建,更改,用户,组,权限等一系列操作
### Sonar Code Quality Testing Essentials #### 一、书籍概述与目标读者 《Sonar Code Quality Testing Essentials》是一本专为Java开发者和团队管理者设计的书籍,旨在帮助他们通过使用Sonar工具来提升代码质量...
标题 "sonar-plugin-api-3.6.2.zip" 提供了我们正在处理的是一个SonarQube插件API的特定版本,这里是3.6.2。SonarQube是一款强大的开源代码质量管理工具,用于静态代码分析和软件度量。它的插件API允许开发者创建...
通过SonarJava API,开发者可以获取到详细的代码质量问题报告,然后利用Annovention对问题进行有针对性的处理。这样的配合不仅提高了开发效率,也提升了代码的整体质量。 在实际应用中,我们可以将Annovention集成...
标题中的"sonar-check-api-3.7.4.zip"是一个开源项目的压缩包,它包含了SonarQube检查API的一个特定版本,即3.7.4。SonarQube是一款强大的静态代码分析和代码质量管理工具,它能帮助开发者在编码阶段发现并修复代码...
7. 糟糕的设计 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测藕合。
sonar eclipse插件sonarlint,原先的插件已经被启用,这是最新的,如果连接本地sonar服务器,需要在eclipse.ini中配置启动参数,参数为org.sonarlint.eclipse.core/server_url 值为sonar服务器地址,如果不配置默认...
《Fisher Sonar数据集与线性判别分析在分类中的应用》 Fisher Sonar数据集,全称为fisher_sonar或fishersonar,是机器学习领域中一个广泛使用的分类问题实例,主要应用于训练和测试算法的性能。这个数据集源自声纳...
### Sonar实战:从入门到进阶 #### 知识点概述 Sonar是一个功能强大的代码质量管理平台,专为软件开发团队设计,旨在帮助他们监控、管理和改进代码质量。Sonar不仅提供了静态代码分析,还涵盖了动态分析(如单元...
总的来说,“调用sonar.rar”这个资源为开发者提供了一个深入了解和实践SonarQube API的机会,帮助他们更好地集成代码质量检查到自己的开发流程中,从而提升软件的质量和安全性。通过学习和应用这些知识,开发者可以...
4. **跨平台支持**:除了Eclipse之外,SonarLint还支持其他IDE,如IntelliJ IDEA、Visual Studio Code等,确保开发者无论使用何种环境都能享受到一致的体验。 5. **自定义规则**:用户可以根据项目的特殊需求自定义...
1. **初始化客户端**:创建一个 `SonarClient` 实例,通常需要提供 SonarQube 服务器的 URL 和认证信息(如 API 密钥)。 2. **调用 API**:使用 `SonarClient` 的方法,如 `get()` 或 `post()` 来执行 API 调用。...
此外,需要创建一个新的数据库供Sonar使用,并为该数据库分配适当的权限。 - 创建数据库:通过MySQL命令行工具执行 `CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;` - 授予权限:继续执行 ...
<propertyName>it.coverage.agent ``` 接下来,我们需要配置SonarQube插件,告诉它在哪里找到JaCoCo生成的覆盖率数据,并在分析时将其包含进来: ```xml <groupId>org.sonarsource.scanner....
SonarLint是一款代码检测插件,它能够集成到Eclipse和IntelliJ IDEA这类的集成开发环境(IDE)中,帮助开发者实时地在IDE上检测代码中的问题。SonarLint可以检测多种编程语言,如Java、JavaScript、PHP和Python等,...
这些参数可以通过创建或编辑`sonar.properties`文件来设定,例如指定SonarQube服务器的URL、项目Key、源代码路径等。 ```properties # 示例sonar.properties配置 sonar.host.url=http://your.sonarqube.server.com ...