package org.jbehave.jenkins; import java.io.File; import java.io.FileNotFoundException; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.custommonkey.xmlunit.XMLUnit; import org.custommonkey.xmlunit.XpathEngine; import org.jbehave.core.configuration.Configuration; import org.jbehave.core.configuration.MostUsefulConfiguration; import org.jbehave.core.embedder.Embedder; import org.jbehave.core.embedder.EmbedderControls; import org.jbehave.core.failures.SilentlyAbsorbingFailure; import org.jbehave.core.io.CodeLocations; import org.jbehave.core.io.LoadFromClasspath; import org.jbehave.core.reporters.Format; import org.jbehave.core.reporters.StoryReporterBuilder; import org.jbehave.core.steps.InstanceStepsFactory; import org.jbehave.core.steps.MarkUnmatchedStepsAsPending; import org.jbehave.core.steps.StepFinder; import org.jbehave.core.steps.StepFinder.ByLevenshteinDistance; import org.junit.Ignore; import org.junit.Test; import org.w3c.dom.Document; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; public class ReportTransformBehaviour { private static final String TESTCASE_COUNT = "count(//testcase)"; private static final String TESTCASE_FAILURE = "count(//testcase/failure)"; private static final String TESTCASE_IGNORED = "count(//testcase/skipped)"; private static final String TESTSUITE_SKIPPED_ATTRIBUTE = "/testsuite/@skipped"; private static final String TESTSUITE_TESTS_ATTRIBUTE = "/testsuite/@tests"; private static final String TESTSUITE_NAME_ATTRIBUTE = "/testsuite/@name"; private static final String TESTSUITE_FAILURES_ATTRIBUTE = "/testsuite/@failures"; private static XpathEngine engine = XMLUnit.newXpathEngine(); // Might be running inside IDEA or Eclipse. Can't assume current directory. private File cd = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile()) .getParentFile().getParentFile(); @Test public void transformSuccessfulStoryReport() throws Throwable { runStories("all_successful.story"); Document document = tranformReport("all_successful.xml"); assertEquals("0", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("3", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); } @Test public void transformStoryReportWithNoTitle() throws Throwable { runStories("all_successful.story"); Document document = tranformReport("all_successful.xml"); assertFalse("Test suite name is empty", engine.evaluate(TESTSUITE_NAME_ATTRIBUTE, document).isEmpty()); } @Test public void transformFailedStoryReport() throws FileNotFoundException, Throwable { runStories("all_failed.story"); Document document = tranformReport("all_failed.xml"); assertEquals("1", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("1", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); } @Test public void transformStoryWithExamplesReport() throws FileNotFoundException, Throwable { runStories("examples_table_with_failure.story"); Document document = tranformReport("examples_table_with_failure.xml"); assertEquals("6", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("3", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("1", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); assertEquals("6", engine.evaluate(TESTCASE_COUNT, document)); assertEquals("3", engine.evaluate(TESTCASE_FAILURE, document)); assertEquals("1", engine.evaluate(TESTCASE_IGNORED, document)); } @Test public void transformGivenStoryReport() throws FileNotFoundException, Throwable { runStories("given_story.story"); Document document = tranformReport("given_story.xml"); assertEquals("0", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("1", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); assertEquals("1", engine.evaluate(TESTCASE_COUNT, document)); } @Test public void transformFailedGivenStoryReport() throws FileNotFoundException, Throwable { runStories("given_failing_story.story"); Document document = tranformReport("given_failing_story.xml"); assertEquals("1", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("1", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); assertEquals("1", engine.evaluate(TESTCASE_COUNT, document)); assertEquals("1", engine.evaluate(TESTCASE_FAILURE, document)); } @Test public void transformFailureFollowedByGivenStoryReport() throws FileNotFoundException, Throwable { runStories("failure_followed_by_given_story.story"); Document document = tranformReport("failure_followed_by_given_story.xml"); assertEquals("1", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("2", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); assertEquals("2", engine.evaluate(TESTCASE_COUNT, document)); assertEquals("1", engine.evaluate(TESTCASE_FAILURE, document)); } @Test @Ignore("Filtered stories not run anymore") public void transformFilterScenarioReport() throws FileNotFoundException, Throwable { runStories("filter_scenario.story"); Document document = tranformReport("filter_scenario.xml"); assertEquals("1", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("2", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); assertEquals("2", engine.evaluate(TESTCASE_COUNT, document)); assertEquals("1", engine.evaluate(TESTCASE_FAILURE, document)); } @Test @Ignore("Filtered stories not run anymore") public void transformFilterStoryReport() throws FileNotFoundException, Throwable { runStories("filter_story.story"); Document document = tranformReport("filter_story.xml"); assertEquals("0", engine.evaluate(TESTSUITE_FAILURES_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_TESTS_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTSUITE_SKIPPED_ATTRIBUTE, document)); assertEquals("0", engine.evaluate(TESTCASE_COUNT, document)); assertEquals("0", engine.evaluate(TESTCASE_FAILURE, document)); } @Test public void testsuiteNameTitle() throws FileNotFoundException, Throwable { runStories("title.story"); Document document = tranformReport("title.xml"); assertEquals("title.story", engine.evaluate(TESTSUITE_NAME_ATTRIBUTE, document)); } private void runStories(String... storyPaths) { StoryReporterBuilder storyReporterBuilder = new StoryReporterBuilder().withDefaultFormats() .withCodeLocation(CodeLocations.codeLocationFromClass(ReportTransformBehaviour.class)) .withFormats(Format.XML); Configuration configuration = new MostUsefulConfiguration() .useStoryLoader(new LoadFromClasspath(this.getClass())).useStoryReporterBuilder(storyReporterBuilder) .useFailureStrategy(new SilentlyAbsorbingFailure()) .useStepCollector(new MarkUnmatchedStepsAsPending(new StepFinder(new ByLevenshteinDistance()))); Embedder embedder = new Embedder(); embedder.useEmbedderControls(new EmbedderControls().doGenerateViewAfterStories(false)); embedder.useConfiguration(configuration); embedder.useCandidateSteps(new InstanceStepsFactory(configuration, new MySteps()).createCandidateSteps()); embedder.useMetaFilters(asList("-skip true")); try { embedder.runStoriesAsPaths(asList(storyPaths)); } catch (Exception e) { e.printStackTrace(); } } private Document tranformReport(String path) throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException { File report = new File(cd, "/target/jbehave/" + path); Source xml = new StreamSource(report); Source xslt = new StreamSource(new File(cd, "src/main/resources/org/jbehave/jenkins/"+new JBehaveInputMetric().getXslName())); Result resultOutput = new StreamResult(System.out); DOMResult result = new DOMResult(); Transformer transformer = TransformerFactory.newInstance().newTransformer(xslt); transformer.transform(xml, result); transformer.transform(xml, resultOutput); return (Document) result.getNode(); } }