Skip to content

Commit

Permalink
Rule builder logging change.
Browse files Browse the repository at this point in the history
  • Loading branch information
z0rb committed Apr 4, 2016
1 parent 630f694 commit 0e40fe9
Show file tree
Hide file tree
Showing 9 changed files with 145 additions and 110 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.camunda.bpm.extension.process_test_coverage.listeners.FlowNodeHistoryEventHandler;
import org.camunda.bpm.extension.process_test_coverage.listeners.PathCoverageParseListener;
import org.camunda.bpm.extension.process_test_coverage.model.ClassCoverage;
import org.camunda.bpm.extension.process_test_coverage.model.Coverage;
import org.camunda.bpm.extension.process_test_coverage.model.MethodCoverage;
import org.camunda.bpm.extension.process_test_coverage.util.CoverageReportUtil;
import org.hamcrest.Matcher;
Expand Down Expand Up @@ -58,7 +59,7 @@ public class TestCoverageProcessEngineRule extends ProcessEngineRule {
/**
* Log class and test method coverages?
*/
private boolean reportCoverageWhenFinished = false;
private boolean detailedCoverageLogging = false;

/**
* Matchers to be asserted on the class coverage percentage.
Expand Down Expand Up @@ -252,10 +253,12 @@ private void handleTestMethodCoverage(Description description) {
final String testName = description.getMethodName();
final MethodCoverage testCoverage = coverageTestRunState.getTestMethodCoverage(testName);

logCoverage(testCoverage);

double coveragePercentage = testCoverage.getCoveragePercentage();
logger.info(testName + " process coverage is " + coveragePercentage);

// Log coverage percentage
logger.info(testName + " test method coverage is " + coveragePercentage);

logCoverageDetail(testCoverage);

// Create graphical report
CoverageReportUtil.createCurrentTestMethodReport(processEngine, coverageTestRunState);
Expand Down Expand Up @@ -288,7 +291,12 @@ private void handleClassCoverage(Description description) {
classCoverage.assertAllDeploymentsEqual();

final double classCoveragePercentage = classCoverage.getCoveragePercentage();
logger.info("finishing @ClassRule execution with coverage " + classCoveragePercentage);

// Log coverage percentage
logger.info(
coverageTestRunState.getTestClassName() + " test class coverage is: " + classCoveragePercentage);

logCoverageDetail(classCoverage);

// Create graphical report
CoverageReportUtil.createClassReport(processEngine, coverageTestRunState);
Expand All @@ -307,23 +315,25 @@ private void assertCoverage(double coverage, Collection<Matcher<Double>> matcher

}

private void logCoverage(MethodCoverage deploymentCoverage) {

if (deploymentId != null) {

if (logger.isLoggable(Level.FINE) || isReportCoverageWhenFinished()) {
logger.log(Level.ALL, deploymentCoverage.toString());
}
/**
* Logs the string representation of the passed coverage object.
*
* @param coverage
*/
private void logCoverageDetail(Coverage coverage) {

if (logger.isLoggable(Level.FINE) || isDetailedCoverageLogging()) {
logger.log(Level.INFO, coverage.toString());
}

}

public boolean isReportCoverageWhenFinished() {
return reportCoverageWhenFinished;
public boolean isDetailedCoverageLogging() {
return detailedCoverageLogging;
}

public void setReportCoverageWhenFinished(boolean reportCoverageWhenFinished) {
this.reportCoverageWhenFinished = reportCoverageWhenFinished;
public void setDetailedCoverageLogging(boolean detailedCoverageLogging) {
this.detailedCoverageLogging = detailedCoverageLogging;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,70 +1,95 @@
package org.camunda.bpm.extension.process_test_coverage.junit.rules;

/**
* Fluent Builder for TestCoverageProcessEngineRule.
*
*/
public class TestCoverageProcessEngineRuleBuilder {

/**
* If you set this property to a ratio (e.g. "1.0" for full coverage),
/**
* If you set this property to a ratio (e.g. "1.0" for full coverage),
* the @ClassRule will fail the test run if the coverage is less.<br>
* Example parameter for running java:<br>
* <code>-Dorg.camunda.bpm.extension.process_test_coverage.ASSERT_AT_LEAST=1.0</code>
*/
public static final String DEFAULT_ASSERT_AT_LEAST_PROPERTY = "org.camunda.bpm.extension.process_test_coverage.ASSERT_AT_LEAST";

TestCoverageProcessEngineRule rule = new TestCoverageProcessEngineRule();

/** @return a builder with typical method @Rule configuration */
public static TestCoverageProcessEngineRuleBuilder create() {
return createBase()
.optionalAssertCoverageAtLeastProperty(DEFAULT_ASSERT_AT_LEAST_PROPERTY);

private TestCoverageProcessEngineRule rule = new TestCoverageProcessEngineRule();

/**
* Creates a TestCoverageProcessEngineRuleBuilder with the default class
* coverage assertion property activated.
*
* @return
*/
public static TestCoverageProcessEngineRuleBuilder create() {
return createBase().optionalAssertCoverageAtLeastProperty(DEFAULT_ASSERT_AT_LEAST_PROPERTY);
}

/**
* Set the system property name for minimal class coverage assertion.
*
* @param key
* System property name.
* @return
*/
public TestCoverageProcessEngineRuleBuilder optionalAssertCoverageAtLeastProperty(String key) {

String assertAtLeast = System.getProperty(key);
if (assertAtLeast != null) {
try{

final MinimalCoverageMatcher minimalCoverageMatcher = new MinimalCoverageMatcher(Double.parseDouble(assertAtLeast));
try {

final MinimalCoverageMatcher minimalCoverageMatcher = new MinimalCoverageMatcher(
Double.parseDouble(assertAtLeast));
rule.addClassCoverageAssertionMatcher(minimalCoverageMatcher);

}catch(NumberFormatException e) {
throw new RuntimeException("BAD TEST CONFIGURATION: optionalAssertCoverageAtLeastProperty( \"" + key + "\" ) must be double");

} catch (NumberFormatException e) {
throw new RuntimeException("BAD TEST CONFIGURATION: optionalAssertCoverageAtLeastProperty( \"" + key
+ "\" ) must be double");
}
}
return this;
}

/** @return a builder with typical method @ClassRule configuration */
public static TestCoverageProcessEngineRuleBuilder createClassRule() {
return createBase().reportCoverageAfter()
.optionalAssertCoverageAtLeastProperty(DEFAULT_ASSERT_AT_LEAST_PROPERTY);
}
/** @return a basic builder with nothing preconfigured */
public static TestCoverageProcessEngineRuleBuilder createBase() {
return new TestCoverageProcessEngineRuleBuilder();
}

/**
* Enables detailed logging of individual class and method coverage objects.
*
* @return
*/
public TestCoverageProcessEngineRuleBuilder withDetailedCoverageLogging() {
rule.setDetailedCoverageLogging(true);
return this;
}

/**
* Asserts if the class coverage is greater than the passed percentage.
*
* @param percentage
* @return
*/
public TestCoverageProcessEngineRuleBuilder assertClassCoverageAtLeast(double percentage) {

/** @return a basic builder with nothing preconfigured */
public static TestCoverageProcessEngineRuleBuilder createBase() {
return new TestCoverageProcessEngineRuleBuilder();
}
if (0 > percentage || percentage > 1) {
throw new RuntimeException(
"BAD TEST CONFIGURATION: coverageAtLeast " + percentage + " (" + 100 * percentage + "%) ");
}

public TestCoverageProcessEngineRuleBuilder reportCoverageAfter() {
rule.setReportCoverageWhenFinished(true);
return this;
}
rule.addClassCoverageAssertionMatcher(new MinimalCoverageMatcher(percentage));
return this;

public TestCoverageProcessEngineRuleBuilder assertGlobalCoverageAtLeast(double percentage) {

if (0 > percentage || percentage > 1) {
throw new RuntimeException("BAD TEST CONFIGURATION: coverageAtLeast " + percentage + " (" + 100*percentage + "%) ");
}

rule.addClassCoverageAssertionMatcher(new MinimalCoverageMatcher(percentage));
return this;

}
}

public TestCoverageProcessEngineRule build() {
return rule;
}
/**
* Builds the coverage rule.
*
* @return
*/
public TestCoverageProcessEngineRule build() {
return rule;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ public class BpmnBusinessRuleTaskCoverageTest {

@ClassRule
@Rule
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder.createClassRule() //
.reportCoverageAfter().build();
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder.create().build();

@Test
@Deployment(resources = "businessRuleTask.bpmn")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@
import org.junit.Rule;
import org.junit.Test;

/** Also deploys businessRuleTask.bpmn, but doesn't cover anything and expecting zero coverage. This is for checking side-effects by the other test class. */
/**
* Also deploys businessRuleTask.bpmn, but doesn't cover anything and expecting
* zero coverage. This is for checking side-effects by the other test class.
*/
public class BpmnBusinessRuleTaskNotCoveredTest {

@ClassRule
@Rule
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder.createClassRule() //
.reportCoverageAfter().build();
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder.create()
.withDetailedCoverageLogging().build();

@Test
@Deployment(resources = "businessRuleTask.bpmn")
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,19 @@

/**
* Test case starting an in-memory database-backed Process Engine.<br>
* In your tests don't set the property using <code>System.setProperty</code>
* - use your runtime environment to do that.
* In your tests don't set the property using <code>System.setProperty</code> -
* use your runtime environment to do that.
*/
public class ClassCoverageSystemPropertyTest {

static final double EXPECTED = PATH_B_ELEMENTS.length;
static final double ALL = ALL_ELEMENTS.length;
static final double EXPECTED_COVERAGE = EXPECTED / ALL;
static final double EXPECTED_COVERAGE = EXPECTED / ALL;

static {
setSysProperty();
}

public static void setSysProperty() {
System.setProperty(TestCoverageProcessEngineRuleBuilder.DEFAULT_ASSERT_AT_LEAST_PROPERTY,
"" + EXPECTED_COVERAGE);
Expand All @@ -41,23 +41,22 @@ public static void setSysProperty() {
public static void delSysProperty() {
System.clearProperty(TestCoverageProcessEngineRuleBuilder.DEFAULT_ASSERT_AT_LEAST_PROPERTY);
}

@ClassRule
@Rule
public static TestCoverageProcessEngineRule classRule =
TestCoverageProcessEngineRuleBuilder.createClassRule()
.optionalAssertCoverageAtLeastProperty(TestCoverageProcessEngineRuleBuilder.DEFAULT_ASSERT_AT_LEAST_PROPERTY)
.build();
TestCoverageProcessEngineRuleBuilder.create()
.optionalAssertCoverageAtLeastProperty(TestCoverageProcessEngineRuleBuilder.DEFAULT_ASSERT_AT_LEAST_PROPERTY)
.build();

@Test
@Deployment(resources = BPMN_PATH)
public void testPathB() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "B");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);

classRule.addTestMethodCoverageAssertionMatcher("testPathB", lessThan(EXPECTED_COVERAGE + 0.0001));
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,23 @@ public class ClassCoverageTest {
// test without the others, it will probably fail
@Rule
@ClassRule
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder
.createClassRule().assertGlobalCoverageAtLeast(1.0).build();
public static TestCoverageProcessEngineRule rule = TestCoverageProcessEngineRuleBuilder.create()
.assertClassCoverageAtLeast(1.0).build();

@Test
@Deployment(resources = BPMN_PATH)
public void testPathA() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "A");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
rule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
}

@Test
@Deployment(resources = BPMN_PATH)
public void testPathB() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "B");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
rule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,32 @@
* Test case starting an in-memory database-backed Process Engine.
*/
public class ClassHalfCoverageTest {
private static final double EXPECTED = PATH_B_ELEMENTS.length;
private static final double ALL = ALL_ELEMENTS.length;
private static final double EXPECTED_COVERAGE = EXPECTED / ALL;

// Note, if you assert a coverage on the ClassRule, it means if you run a
// test without the others, it will probably fail
@ClassRule
@Rule
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder.createClassRule()
.assertGlobalCoverageAtLeast(EXPECTED_COVERAGE).build();
@Test
@Deployment(resources = BPMN_PATH)
public void testPathB() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "B");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
}

@Test
@Deployment(resources = BPMN_PATH)
public void testPathBAgain() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "B");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
}

private static final double EXPECTED = PATH_B_ELEMENTS.length;
private static final double ALL = ALL_ELEMENTS.length;
private static final double EXPECTED_COVERAGE = EXPECTED / ALL;

// Note, if you assert a coverage on the ClassRule, it means if you run a
// test without the others, it will probably fail
@ClassRule
@Rule
public static TestCoverageProcessEngineRule classRule = TestCoverageProcessEngineRuleBuilder.create()
.assertClassCoverageAtLeast(EXPECTED_COVERAGE).build();

@Test
@Deployment(resources = BPMN_PATH)
public void testPathB() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "B");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
}

@Test
@Deployment(resources = BPMN_PATH)
public void testPathBAgain() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("path", "B");
classRule.getRuntimeService().startProcessInstanceByKey(PROCESS_DEFINITION_KEY, variables);
}

}

0 comments on commit 0e40fe9

Please sign in to comment.