{"id":29334556,"url":"https://github.com/reportportal/agent-java-jbehave","last_synced_at":"2026-03-16T22:06:05.853Z","repository":{"id":11763050,"uuid":"70480074","full_name":"reportportal/agent-java-jbehave","owner":"reportportal","description":"JBehave reporters for Report Portal","archived":false,"fork":false,"pushed_at":"2025-06-16T10:17:39.000Z","size":1058,"stargazers_count":7,"open_issues_count":1,"forks_count":6,"subscribers_count":7,"default_branch":"develop","last_synced_at":"2025-07-08T06:03:35.600Z","etag":null,"topics":["java","jbehave","reportportal"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/reportportal.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-10-10T11:08:35.000Z","updated_at":"2025-06-16T10:17:43.000Z","dependencies_parsed_at":"2025-06-13T12:33:55.573Z","dependency_job_id":null,"html_url":"https://github.com/reportportal/agent-java-jbehave","commit_stats":null,"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/reportportal/agent-java-jbehave","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reportportal%2Fagent-java-jbehave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reportportal%2Fagent-java-jbehave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reportportal%2Fagent-java-jbehave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reportportal%2Fagent-java-jbehave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/reportportal","download_url":"https://codeload.github.com/reportportal/agent-java-jbehave/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/reportportal%2Fagent-java-jbehave/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268240319,"owners_count":24218356,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-01T02:00:08.611Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","jbehave","reportportal"],"created_at":"2025-07-08T04:19:22.190Z","updated_at":"2026-03-16T22:06:05.846Z","avatar_url":"https://github.com/reportportal.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Report Portal Java reporter for JBehave tests\n\n\u003e **DISCLAIMER**: We use Google Analytics for sending anonymous usage information such as agent's and client's names,\n\u003e and their versions after a successful launch start. This information might help us to improve both ReportPortal\n\u003e backend and client sides. It is used by the ReportPortal team only and is not supposed for sharing with 3rd parties.\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.epam.reportportal/agent-java-jbehave.svg?label=Maven%20Central)](https://central.sonatype.com/artifact/com.epam.reportportal/agent-java-jbehave)\n[![CI Build](https://github.com/reportportal/agent-java-jbehave/actions/workflows/ci.yml/badge.svg)](https://github.com/reportportal/agent-java-jbehave/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/reportportal/agent-java-jbehave/graph/badge.svg?token=BCglguEcoR)](https://codecov.io/gh/reportportal/agent-java-jbehave)\n[![Join Slack chat!](https://img.shields.io/badge/slack-join-brightgreen.svg)](https://slack.epmrpp.reportportal.io/)\n[![stackoverflow](https://img.shields.io/badge/reportportal-stackoverflow-orange.svg?style=flat)](http://stackoverflow.com/questions/tagged/reportportal)\n[![Build with Love](https://img.shields.io/badge/build%20with-❤%EF%B8%8F%E2%80%8D-lightgrey.svg)](http://reportportal.io?style=flat)\n\nThe latest version: 5.5.4. Please use `Maven Central` link above to get the agent. **For JBehave version 5.0 and\nhigher**\n\n## Overview: How to Add ReportPortal Logging to Your JBehave Java Project\n\nTo start using Report Portal with JBehave framework please do the following steps:\n\n1. [Configuration](#configuration)\n    * Create/update the `reportportal.properties` configuration file\n    * Build system configuration\n2. Logging configuration\n    * [Logback Framework](#logback-framework)\n        * Create/update the `logback.xml` file\n        * Add Logback dependencies\n3. [Running tests](#test-run)\n    * Add test runner class\n    * Build system commands\n\nAdditionally, you may want to configure [Step reporter or Scenario reporter](#steps-vs-scenarios). They are regulate how\nReport Portal count your tests. Step reporter posts statistics per a test step (each test step is counted in 'total'\ncolumn). Scenario reporter posts statistics per a scenario.\n\n## Configuration\n\n### 'reportportal.properties' configuration file\n\nTo start using Report Portal you need to create a file named `reportportal.properties` in your Java project in a source\nfolder `src/main/resources` or `src/test/resources` (depending on where your tests are located):\n\n**reportportal.properties**\n\n```\nrp.endpoint = http://localhost:8080\nrp.api.key = e0e541d8-b1cd-426a-ae18-b771173c545a\nrp.launch = JBehave Tests\nrp.project = default_personal\n```\n\n**Property description**\n\n* `rp.endpoint` - the URL for the report portal server (actual link).\n* `rp.api.key` - an access token for Report Portal which is used for user identification. It can be found on your report\n  portal user profile page.\n* `rp.project` - a project ID on which the agent will report test launches. Must be set to one of your assigned\n  projects.\n* `rp.launch` - a user-selected identifier of test launches.\n\nThe full list of supported properties is located here in client-java library documentation (a common library for all\nJava agents): https://github.com/reportportal/client-java\n\n\n### Build system configuration\n\n#### Maven\n\n`pom.xml`\n\n```xml\n\n\u003cproject\u003e\n    \u003c!-- project declaration omitted --\u003e\n\n    \u003cproperties\u003e\n        \u003cproject.build.sourceEncoding\u003eUTF-8\u003c/project.build.sourceEncoding\u003e\n        \u003cmaven.compiler.target\u003e1.8\u003c/maven.compiler.target\u003e\n        \u003cmaven.compiler.source\u003e1.8\u003c/maven.compiler.source\u003e\n        \u003cjbehave.core.version\u003e5.1.1\u003c/jbehave.core.version\u003e \u003c!-- JBehave binaries version --\u003e\n        \u003cembeddables\u003e**/*Stories.java\u003c/embeddables\u003e \u003c!-- JBehave story filter --\u003e\n        \u003cmeta.filter\u003e-skip\u003c/meta.filter\u003e \u003c!-- Skip tests tagged with '@skip' tag --\u003e\n    \u003c/properties\u003e\n\n    \u003cdependencies\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003ecom.epam.reportportal\u003c/groupId\u003e\n            \u003cartifactId\u003eagent-java-jbehave\u003c/artifactId\u003e\n            \u003cversion\u003e5.5.4\u003c/version\u003e\n        \u003c/dependency\u003e\n\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.jbehave\u003c/groupId\u003e\n            \u003cartifactId\u003ejbehave-core\u003c/artifactId\u003e\n            \u003cversion\u003e${jbehave.core.version}\u003c/version\u003e\n        \u003c/dependency\u003e\n    \u003c/dependencies\u003e\n\n    \u003cbuild\u003e\n        \u003cpluginManagement\u003e\n            \u003cplugins\u003e\n                \u003cplugin\u003e\n                    \u003cgroupId\u003eorg.apache.maven.plugins\u003c/groupId\u003e\n                    \u003cartifactId\u003emaven-compiler-plugin\u003c/artifactId\u003e\n                    \u003cversion\u003e3.5.1\u003c/version\u003e\n                \u003c/plugin\u003e\n            \u003c/plugins\u003e\n        \u003c/pluginManagement\u003e\n        \u003cplugins\u003e\n            \u003cplugin\u003e\n                \u003cgroupId\u003eorg.jbehave\u003c/groupId\u003e\n                \u003cartifactId\u003ejbehave-maven-plugin\u003c/artifactId\u003e\n                \u003cversion\u003e${jbehave.core.version}\u003c/version\u003e\n                \u003cexecutions\u003e\n                    \u003cexecution\u003e\n                        \u003cid\u003eembeddable-stories\u003c/id\u003e\n                        \u003cphase\u003etest\u003c/phase\u003e\n                        \u003cconfiguration\u003e\n                            \u003cincludes\u003e\n                                \u003cinclude\u003e${embeddables}\u003c/include\u003e\n                            \u003c/includes\u003e\n                            \u003cexcludes/\u003e\n                            \u003cignoreFailureInStories\u003etrue\u003c/ignoreFailureInStories\u003e\n                            \u003cignoreFailureInView\u003efalse\u003c/ignoreFailureInView\u003e\n                            \u003cthreads\u003e1\u003c/threads\u003e\n                            \u003cmetaFilters\u003e\n                                \u003cmetaFilter\u003e${meta.filter}\u003c/metaFilter\u003e\n                            \u003c/metaFilters\u003e\n                        \u003c/configuration\u003e\n                        \u003cgoals\u003e\n                            \u003cgoal\u003erun-stories-as-embeddables\u003c/goal\u003e\n                        \u003c/goals\u003e\n                    \u003c/execution\u003e\n                \u003c/executions\u003e\n            \u003c/plugin\u003e\n        \u003c/plugins\u003e\n    \u003c/build\u003e\n\u003c/project\u003e\n```\n\n#### Gradle\n\n`build.gradle`\n\n```groovy\n\nplugins {\n    id 'java'\n}\n\nsourceCompatibility = JavaVersion.VERSION_11\ntargetCompatibility = JavaVersion.VERSION_11\n\nrepositories {\n    mavenCentral()\n}\n\ndef jbehaveVersion = '5.1.1'\ndependencies {\n    testCompile \"org.jbehave:jbehave-core:${jbehaveVersion}\"\n    testCompile \"org.jbehave:jbehave-navigator:${jbehaveVersion}\"\n    testCompile 'com.epam.reportportal:agent-java-jbehave:5.5.4'\n    testCompile 'com.epam.reportportal:logger-java-logback:5.2.2'\n}\n\ntest {\n    outputs.upToDateWhen { return false }\n    testLogging.showStandardStreams = true\n\n    // Setup execution filters, ignore scenarios with '@skip' tag\n    systemProperty \"metaFilters\", System.getProperty(\"filter\", \"-skip\")\n    systemProperty \"story\", System.getProperty(\"story\", \"*.story\")\n\n    doFirst {\n        file('target').mkdirs() // JBehave doesn't work without this folder\n    }\n    doLast {\n        // copy all style and javascript files to get fancy report\n        def jbehave = \"${classpath.find { it.name.contains('jbehave-core') }}\"\n        def jbehaveStyle = \"${classpath.find { it.name.contains('jbehave-navigator') }}\"\n        copy {\n            from(zipTree(jbehave)) {\n                include \"style/*\"\n            }\n            into(\"build/classes/java/jbehave/view\")\n        }\n        copy {\n            from(zipTree(jbehaveStyle)) {\n                include \"js/**/*\"\n                include \"style/**/*\"\n                include \"images/*\"\n            }\n            into(\"build/classes/java/jbehave/view\")\n        }\n\n        // the folder will be empty folder, so remove it\n        file('target').delete()\n    }\n}\n```\n\n## Logging configuration\n\n### Logback Framework\n\n#### 'logback.xml' file\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cconfiguration\u003e\n    \u003c!-- Send debug messages to System.out --\u003e\n    \u003cappender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\"\u003e\n        \u003c!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --\u003e\n        \u003cencoder\u003e\n            \u003cpattern\u003e%d{HH:mm:ss.SSS} %-5level %logger{5} - %thread - %msg%n\u003c/pattern\u003e\n        \u003c/encoder\u003e\n    \u003c/appender\u003e\n\n    \u003cappender name=\"RP\" class=\"com.epam.reportportal.logback.appender.ReportPortalAppender\"\u003e\n        \u003cencoder\u003e\n            \u003c!--Best practice: don't put time and logging level to the final message. Appender do this for you--\u003e\n            \u003cpattern\u003e%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n\u003c/pattern\u003e\n            \u003cpattern\u003e[%t] - %msg%n\u003c/pattern\u003e\n        \u003c/encoder\u003e\n    \u003c/appender\u003e\n\n    \u003c!--'additivity' flag is important! Without it logback will double-log log messages--\u003e\n    \u003clogger name=\"binary_data_logger\" level=\"TRACE\" additivity=\"false\"\u003e\n        \u003cappender-ref ref=\"RP\"/\u003e\n    \u003c/logger\u003e\n\n    \u003c!-- Mute Report Portal messages --\u003e\n    \u003clogger name=\"com.epam.reportportal.service\" level=\"WARN\"/\u003e\n    \u003clogger name=\"com.epam.reportportal.utils\" level=\"WARN\"/\u003e\n\n    \u003c!-- By default, the level of the root level is set to DEBUG --\u003e\n    \u003croot level=\"DEBUG\"\u003e\n        \u003cappender-ref ref=\"RP\"/\u003e\n        \u003c!-- Uncomment if you want to see console logs --\u003e\n        \u003c!-- \u003cappender-ref ref=\"STDOUT\"/\u003e --\u003e\n    \u003c/root\u003e\n\u003c/configuration\u003e\n```\n\n#### Add Logback dependencies\n\n##### Gradle\n\nTo route your logs into Report Portal you should add `logger-java-logback` dependency into the corresponding section:\n\n```build.gradle```\n\n```groovy\n// inside 'dependencies' section\ntestCompile 'com.epam.reportportal:logger-java-logback:5.2.2'\n```\n\nIt should be already here if you used gradle configuration listed above.\n\n## Test run\n\n### Test runner class\n\nJBehave requires runtime configuration, to do this place the following class into your `src/main/java` (for Maven)\nor `src/test/java`\n(for Gradle) folders. Notice that you need replace step initialization in `stepsFactory` method with your own:\n\n`MyStories.java`\n\n```java\nimport com.epam.reportportal.example.jbehave.steps.*;\nimport com.epam.reportportal.jbehave.ReportPortalStepFormat;\nimport org.jbehave.core.Embeddable;\nimport org.jbehave.core.configuration.Configuration;\nimport org.jbehave.core.configuration.MostUsefulConfiguration;\nimport org.jbehave.core.i18n.LocalizedKeywords;\nimport org.jbehave.core.io.CodeLocations;\nimport org.jbehave.core.io.LoadFromClasspath;\nimport org.jbehave.core.io.StoryFinder;\nimport org.jbehave.core.junit.JUnitStories;\nimport org.jbehave.core.model.ExamplesTableFactory;\nimport org.jbehave.core.model.TableTransformers;\nimport org.jbehave.core.parsers.RegexStoryParser;\nimport org.jbehave.core.reporters.StoryReporterBuilder;\nimport org.jbehave.core.steps.InjectableStepsFactory;\nimport org.jbehave.core.steps.InstanceStepsFactory;\nimport org.jbehave.core.steps.ParameterConverters;\nimport org.jbehave.core.steps.ParameterConverters.DateConverter;\nimport org.jbehave.core.steps.ParameterConverters.ExamplesTableConverter;\n\nimport java.text.SimpleDateFormat;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport static java.util.Optional.ofNullable;\nimport static org.jbehave.core.io.CodeLocations.codeLocationFromClass;\nimport static org.jbehave.core.io.CodeLocations.getPathFromURL;\nimport static org.jbehave.core.reporters.Format.CONSOLE;\nimport static org.jbehave.core.reporters.Format.HTML;\n\n/**\n * \u003cp\u003e\n * {@link Embeddable} class to run multiple textual stories via JUnit.\n * \u003c/p\u003e\n * \u003cp\u003e\n * Stories are specified in classpath and correspondingly the {@link LoadFromClasspath} story loader is configured.\n * \u003c/p\u003e\n */\npublic class MyStories extends JUnitStories {\n\n\tpublic MyStories() {\n\t\tconfiguredEmbedder().embedderControls()\n\t\t\t\t.doGenerateViewAfterStories(true)\n\t\t\t\t.doIgnoreFailureInStories(true)\n\t\t\t\t.doIgnoreFailureInView(true)\n\t\t\t\t.useThreads(1)\n\t\t\t\t.useStoryTimeouts(\"60\");\n\t}\n\n\t@Override\n\tpublic Configuration configuration() {\n\t\tClass\u003c? extends Embeddable\u003e embeddableClass = this.getClass();\n\t\t// Start from default ParameterConverters instance\n\t\tParameterConverters parameterConverters = new ParameterConverters();\n\n\t\tTableTransformers tableTransformers = new TableTransformers();\n\t\t// factory to allow parameter conversion and loading from external resources (used by StoryParser too)\n\t\tExamplesTableFactory examplesTableFactory = new ExamplesTableFactory(new LocalizedKeywords(),\n\t\t\t\tnew LoadFromClasspath(embeddableClass),\n\t\t\t\ttableTransformers\n\t\t);\n\t\t// add custom converters\n\t\tparameterConverters.addConverters(new DateConverter(new SimpleDateFormat(\"yyyy-MM-dd\")),\n\t\t\t\tnew ExamplesTableConverter(examplesTableFactory)\n\t\t);\n\t\treturn new MostUsefulConfiguration().useStoryLoader(new LoadFromClasspath(embeddableClass))\n\t\t\t\t.useStoryParser(new RegexStoryParser(examplesTableFactory))\n\t\t\t\t.useStoryReporterBuilder(new StoryReporterBuilder().withCodeLocation(CodeLocations.codeLocationFromClass(\n\t\t\t\t\t\tembeddableClass)).withFormats(CONSOLE, HTML, ReportPortalStepFormat.INSTANCE))\n\t\t\t\t.useParameterConverters(parameterConverters);\n\t}\n\n\t@Override\n\tpublic InjectableStepsFactory stepsFactory() {\n\t\treturn new InstanceStepsFactory(configuration(),\n\t\t\t\t// Your steps instantiation go here\n\t\t\t\tnew LogLevelTest(),\n\t\t\t\tnew ReportAttachmentsTest(),\n\t\t\t\tnew ReportsStepWithDefectTest(),\n\t\t\t\tnew ReportsTestWithParameters(),\n\t\t\t\tnew ApiSteps()\n\t\t);\n\t}\n\n\t@Override\n\tpublic List\u003cString\u003e storyPaths() {\n\t\tString storyPatternToRun = ofNullable(System.getProperty(\"story\")).filter(s -\u003e !s.isEmpty())\n\t\t\t\t.map(s -\u003e \"**/\" + s)\n\t\t\t\t.orElse(\"**/*.story\");\n\t\treturn new StoryFinder().findPaths(getPathFromURL(codeLocationFromClass(this.getClass())),\n\t\t\t\t\t\tstoryPatternToRun,\n\t\t\t\t\t\t\"**/excluded*.story\"\n\t\t\t\t)\n\t\t\t\t.stream()\n\t\t\t\t.distinct()\n\t\t\t\t.collect(Collectors.toList());\n\t}\n}\n```\n\n### Build system commands\n\nWe are set. To run set we just need to execute corresponding command in our build system.\n\n#### Maven\n\n`mvn test` or `mvnw test` if you are using Maven wrapper\n\n#### Gradle\n\n`gradle test` or `gradlew test` if you are using Gradle wrapper\n\n## Steps vs scenarios\n\nLet's take a look on a simple example:\n\n```\nScenario: Stock trade alert\n\nGiven a stock of symbol \u003csymbol\u003e and a threshold \u003cthreshold\u003e\nWhen the stock is traded at price \u003cprice\u003e\nThen the alert status should be status \u003cstatus\u003e\n\nExamples:\n|symbol|threshold|price|status|\n|STK1|10.0|5.0|OFF|\n|STK1|10.0|11.0|ON|\n```\n\n### Step reporter\n\nStep reporter posts statistics per test step. On example above Report Portal display 6 test units. Each example row will\nbe a suite,\nas on screenshots below and each test step will be marked as a test.\n\n![Story](https://raw.githubusercontent.com/reportportal/agent-java-jbehave/develop/doc/screen-01.png)\n![Examples](https://raw.githubusercontent.com/reportportal/agent-java-jbehave/develop/doc/screen-02.png)\n![Steps](https://raw.githubusercontent.com/reportportal/agent-java-jbehave/develop/doc/screen-03.png)\n\nTo use Step reporter you need to set `ReportPortalStepFormat.INSTANCE` constant as your story reporter format in\nconfiguration:\n\n```java\nnew MostUsefulConfiguration().useStoryLoader(new LoadFromClasspath(embeddableClass))\n        .useStoryParser(new RegexStoryParser(examplesTableFactory))\n        .useStoryReporterBuilder(new StoryReporterBuilder()\n        .withCodeLocation(CodeLocations.codeLocationFromClass(embeddableClass))\n        .withDefaultFormats()\n        .withFormats(ReportPortalStepFormat.INSTANCE))\n        .useParameterConverters(parameterConverters);\n```\n\n### Scenario reporter\n\nScenario reporter posts statistics per a scenario. On example above Report Portal display 2 test units. Each example row\nwill be a test,\nas on screenshots below and each test step will be a nested step.\n\n![Story](https://raw.githubusercontent.com/reportportal/agent-java-jbehave/develop/doc/screen-04.png)\n![Examples](https://raw.githubusercontent.com/reportportal/agent-java-jbehave/develop/doc/screen-05.png)\n![Steps](https://raw.githubusercontent.com/reportportal/agent-java-jbehave/develop/doc/screen-06.png)\n\nTo use Scenario reporter you need to set `ReportPortalScenarioFormat.INSTANCE` constant as your story reporter format in\nconfiguration:\n\n```java\nnew MostUsefulConfiguration().useStoryLoader(new LoadFromClasspath(embeddableClass))\n\t\t.useStoryParser(new RegexStoryParser(examplesTableFactory))\n\t\t.useStoryReporterBuilder(new StoryReporterBuilder()\n\t\t.withCodeLocation(CodeLocations.codeLocationFromClass(embeddableClass))\n\t\t.withDefaultFormats()\n\t\t.withFormats(ReportPortalScenarioFormat.INSTANCE))\n\t\t.useParameterConverters(parameterConverters);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freportportal%2Fagent-java-jbehave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Freportportal%2Fagent-java-jbehave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Freportportal%2Fagent-java-jbehave/lists"}