- UnitTestDecorator should save zero for unit test measure for project, when there is
no values for summarizing and type of analysis is reuse reports or dynamic
- Don't use pom.getPackaging() in AbstractSurefireParser
if (isPositive(tests, true) && isPositive(errors, false) && isPositive(failures, false)) {
Double errorsAndFailuresRatio = (errors + failures) * 100.0 / tests;
context.saveMeasure(CoreMetrics.TEST_SUCCESS_DENSITY, 100.0 - errorsAndFailuresRatio);
+ } else if (tests == null && ResourceUtils.isProject(resource)) {
+ // See http://jira.codehaus.org/browse/SONAR-2371
+ context.saveMeasure(CoreMetrics.TESTS, 0.0);
}
}
}
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
-import org.junit.Test;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.sonar.api.batch.DecoratorContext;
+import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.resources.Project;
public class UnitTestDecoratorTest {
+ private UnitTestDecorator decorator;
+
+ @Before
+ public void setUp() {
+ decorator = new UnitTestDecorator();
+ }
+
@Test
public void generatesMetrics() {
- assertThat(new UnitTestDecorator().generatesMetrics().size(), is(5));
+ assertThat(decorator.generatesMetrics().size(), is(5));
}
@Test
public void doNotDecorateStaticAnalysis() {
Project project = mock(Project.class);
when(project.getAnalysisType()).thenReturn(Project.AnalysisType.STATIC);
- assertThat(new UnitTestDecorator().shouldExecuteOnProject(project), is(false));
+ assertThat(decorator.shouldExecuteOnProject(project), is(false));
when(project.getAnalysisType()).thenReturn(Project.AnalysisType.DYNAMIC);
- assertThat(new UnitTestDecorator().shouldExecuteOnProject(project), is(true));
+ assertThat(decorator.shouldExecuteOnProject(project), is(true));
}
+
+ /**
+ * See http://jira.codehaus.org/browse/SONAR-2371
+ */
+ @Test
+ public void shouldSaveZeroOnProject() {
+ DecoratorContext context = mock(DecoratorContext.class);
+ Project project = new Project("");
+ project.setAnalysisType(Project.AnalysisType.DYNAMIC);
+
+ decorator.decorate(project, context);
+
+ verify(context).saveMeasure(CoreMetrics.TESTS, 0.0);
+ }
+
}
import org.sonar.plugins.surefire.data.UnitTestClassReport;
import org.sonar.plugins.surefire.data.UnitTestIndex;
-import javax.xml.stream.XMLStreamException;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Map;
+import javax.xml.stream.XMLStreamException;
+
/**
* @since 2.4
*/
public void collect(Project project, SensorContext context, File reportsDir) {
File[] xmlFiles = getReports(reportsDir);
- if (xmlFiles.length == 0) {
- insertZeroWhenNoReports(project, context);
- } else {
+ if (xmlFiles.length != 0) {
parseFiles(context, xmlFiles);
}
}
});
}
- private void insertZeroWhenNoReports(Project project, SensorContext context) {
- if (!StringUtils.equalsIgnoreCase("pom", project.getPackaging())) {
- context.saveMeasure(CoreMetrics.TESTS, 0.0);
- }
- }
-
private void parseFiles(SensorContext context, File[] reports) {
UnitTestIndex index = new UnitTestIndex();
parseFiles(reports, index);
sanitize(index);
save(index, context);
-
}
private void parseFiles(File[] reports, UnitTestIndex index) {
}
}
-
private void saveMeasure(SensorContext context, Resource resource, Metric metric, double value) {
if (!Double.isNaN(value)) {
context.saveMeasure(resource, metric, value);
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.junit.Test;
-import org.mockito.internal.matchers.StartsWith;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
parser.collect(new Project("foo"), context, getDir("noReports"));
- verify(context).saveMeasure(CoreMetrics.TESTS, 0.0);
+ verifyZeroInteractions(context);
}
@Test