`
shijunjuan
  • 浏览: 46912 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

利用Sonar API创建自己的Code Coverage报表

 
阅读更多

       我们已有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

  • 大小: 25.7 KB
分享到:
评论

相关推荐

    sonar webAPI脚本实现创建用户、项目权限分配

    该资源提供了sonar webAPI的方式创建用户、删除用户、项目权限赋值等相关脚本实现方式

    java代码集成sonar接口,实现sonar操作的demo

    利用java代码,调用sonar接口,实现在sonar里面创建,更改,用户,组,权限等一系列操作

    Sonar Code Quality Testing Essentials

    ### Sonar Code Quality Testing Essentials #### 一、书籍概述与目标读者 《Sonar Code Quality Testing Essentials》是一本专为Java开发者和团队管理者设计的书籍,旨在帮助他们通过使用Sonar工具来提升代码质量...

    sonar-plugin-api-3.6.2.zip

    标题 "sonar-plugin-api-3.6.2.zip" 提供了我们正在处理的是一个SonarQube插件API的特定版本,这里是3.6.2。SonarQube是一款强大的开源代码质量管理工具,用于静态代码分析和软件度量。它的插件API允许开发者创建...

    sonar-java-api-3.1.1.zip

    通过SonarJava API,开发者可以获取到详细的代码质量问题报告,然后利用Annovention对问题进行有针对性的处理。这样的配合不仅提高了开发效率,也提升了代码的整体质量。 在实际应用中,我们可以将Annovention集成...

    sonar-check-api-3.7.4.zip

    标题中的"sonar-check-api-3.7.4.zip"是一个开源项目的压缩包,它包含了SonarQube检查API的一个特定版本,即3.7.4。SonarQube是一款强大的静态代码分析和代码质量管理工具,它能帮助开发者在编码阶段发现并修复代码...

    Sonar代码规范

    7. 糟糕的设计 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测藕合。

    sonar eclipse插件sonarlint

    sonar eclipse插件sonarlint,原先的插件已经被启用,这是最新的,如果连接本地sonar服务器,需要在eclipse.ini中配置启动参数,参数为org.sonarlint.eclipse.core/server_url 值为sonar服务器地址,如果不配置默认...

    fisher_Sonar数据集_fisher_sonar_fishersonar_分类_数据集sonar_源码

    《Fisher Sonar数据集与线性判别分析在分类中的应用》 Fisher Sonar数据集,全称为fisher_sonar或fishersonar,是机器学习领域中一个广泛使用的分类问题实例,主要应用于训练和测试算法的性能。这个数据集源自声纳...

    【中文版】sonar实战

    ### Sonar实战:从入门到进阶 #### 知识点概述 Sonar是一个功能强大的代码质量管理平台,专为软件开发团队设计,旨在帮助他们监控、管理和改进代码质量。Sonar不仅提供了静态代码分析,还涵盖了动态分析(如单元...

    调用sonar.rar

    总的来说,“调用sonar.rar”这个资源为开发者提供了一个深入了解和实践SonarQube API的机会,帮助他们更好地集成代码质量检查到自己的开发流程中,从而提升软件的质量和安全性。通过学习和应用这些知识,开发者可以...

    sonarlint离线

    4. **跨平台支持**:除了Eclipse之外,SonarLint还支持其他IDE,如IntelliJ IDEA、Visual Studio Code等,确保开发者无论使用何种环境都能享受到一致的体验。 5. **自定义规则**:用户可以根据项目的特殊需求自定义...

    sonar-web-service-client:用于访问 SonarQube 的 Web API 的客户端函数

    1. **初始化客户端**:创建一个 `SonarClient` 实例,通常需要提供 SonarQube 服务器的 URL 和认证信息(如 API 密钥)。 2. **调用 API**:使用 `SonarClient` 的方法,如 `get()` 或 `post()` 来执行 API 调用。...

    sonar runner 进行代码质量监控

    此外,需要创建一个新的数据库供Sonar使用,并为该数据库分配适当的权限。 - 创建数据库:通过MySQL命令行工具执行 `CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;` - 授予权限:继续执行 ...

    SonarCoverage:声纳单元和集成测试覆盖率示例

    &lt;propertyName&gt;it.coverage.agent ``` 接下来,我们需要配置SonarQube插件,告诉它在哪里找到JaCoCo生成的覆盖率数据,并在分析时将其包含进来: ```xml &lt;groupId&gt;org.sonarsource.scanner....

    Sonarlint中文使用手册

    SonarLint是一款代码检测插件,它能够集成到Eclipse和IntelliJ IDEA这类的集成开发环境(IDE)中,帮助开发者实时地在IDE上检测代码中的问题。SonarLint可以检测多种编程语言,如Java、JavaScript、PHP和Python等,...

    sonar-scanner 客户端

    这些参数可以通过创建或编辑`sonar.properties`文件来设定,例如指定SonarQube服务器的URL、项目Key、源代码路径等。 ```properties # 示例sonar.properties配置 sonar.host.url=http://your.sonarqube.server.com ...

Global site tag (gtag.js) - Google Analytics