Free, open-source Allure reporting for Katalon Studio : no plugin, zero test-script changes

Katalon has no first-party Allure adapter (unlike its TestNG/JUnit support), and every DIY attempt I’ve seen hits the same wall: Allure’s transitive Jackson clashing with Katalon’s bundled one, results landing in different folders depending on whether you’re running from the IDE, CLI, or CI, and a reporting bug risking the actual test outcome.

I built a small bridge that solves all of that using Katalon’s own public Test Listener API — install with one double-click (Windows/macOS/Linux), no changes to existing Test Cases or Test Suites, and you get a self-contained Allure HTML report generated automatically after every run. Verified working on Azure Pipelines, GitHub Actions, and GitLab CI, with ready-to-copy configs for each.

Apache 2.0, source and install instructions here: GitHub - montbaga/allure-katalon-bridge: Zero-touch Allure reporting for Katalon Studio : No plugin, No OSGi packaging, No test script changes. · GitHub

Happy to answer questions if anyone runs into issues wiring it up.

Feature Details
Issue Katalon lacks first-party Allure adapter, leading to issues with Jackson clashes, varied result folders, and a reporting bug.
Solution A bridge using Katalon’s Test Listener API, requiring no changes to existing test setups. Generates Allure HTML report automatically.
Compatibility Works on Windows, macOS, Linux. Verified with Azure Pipelines, GitHub Actions, GitLab CI.
License Apache 2.0
Source & Instructions GitHub Repository

good one. can we get architectural overview how this was implemented?

Did you try it, let me know your feedback pls :slight_smile: @dineshh

Just pushed the ARCHITECTURE.md

hi @Monty_Bagati
noticed one small thing with the CI examples

the GitHub Actions, GitLab CI, and Azure Pipelines examples install/use Allure CLI, but don’t mention that the Allure-Katalon Bridge needs to be installed in the Katalon project first

maybe worth adding a small note about this, otherwise someone might think copying the CI config is enough

one more suggestion: maybe add a small example Katalon project with the bridge already installed

so people can just clone it, run a test, and see the Allure report working right away. I think it would make the setup much easier to understand

As we all are well aware, the Reports directory of a Katalon project has a layer of subdirectory of timestamp each contains the report of Test Suites launched at that timing.

On the other hand, the allure-results directory does NOT have the subdirectories of timestamp. The allure-report directory does not have it either.

I suppose that, if introduced, the layer of subdirectories of timestamp under the allure-results would make the design of allure.AllureReportBridge class simpler a lot, especially for the processing of TestSuite Collections in parallel mode.

Well , I need some users first who would actually use this and that would make some sense to me to build this further.

But thx for the feedback :smiley:

I tried the allure-katalon-bridge v1.0.0 developed by Monty_Bagati. Let me report what I experienced.

My environment:

  • macOS Tahoe 26.5.2
  • Katalon Studio IDE Free 11.3.0 (I did not use Katalon Runtime Engine)

I confirmed that the “allure” command is installed and operational on my machine. In the Terminal I did:

$ allure --version
2.43.0

I checked the location of the “allure” executable:

$ which allure
/Users/kazurayam/.volta/bin/allure

Problem 1: the report was not generated

I created a new Katalon project based on the Sample WebUI project (Healthcare sample).

I downloaded the allure-katalon-bridge-main.zip from the GitHub Releases v1.0.0; unzipped it.

I followed the doc.

I needed to do chmod +x xxxx for two shell files, then I double-clicked the allure-katalon-bridge/macOS/Install.command. In the dialog, I selected my “Healthcare example” project. The allure-katalon-bridge worked and imported sevaral files into the project.

I started Katalon Studio IDE; I opened the Healthcare tests project; I chose the healthcare-tests/Test Suites/healthcare-tests - TS_RegressionTest. I ran it. The Test Suite ran as usual.

I saw several new folders and files created in the Healthcare project. I found the allure-results folder with the following content:

$ pwd
/Users/kazurayam/katalon-workspace/healthcare-tests
$ ls
allure-diag.txt			Drivers				Profiles			test.prj
allure-report			GlobalVariables.glbl		README.md			thumbnail.png
allure-results			Include				Reports				thumbnail@2x.png
allure-step-diag.txt		katatlon-test.sh		Scripts				View Allure Report.bat
bin				Keywords			settings			View Allure Report.command
Checkpoints			Libs				Test Cases			view-allure-report.sh
console.properties		Object Repository		Test Listeners
Data Files			Plugins				Test Suites
$ tree allure-results
allure-results
├── 14325c1e-5250-46f9-92a9-5c868634e1dd-result.json
├── 8aad0c96-0eb8-42d7-a8a4-6d4577395766-result.json
├── 98371daa-1595-4abe-acc8-961757a8d519-result.json
├── categories.json
├── environment.properties
└── executor.json

1 directory, 6 files

I checked the allure-report folder and found it contained nothing.

$ tree allure-report
allure-report

0 directories, 0 files

No HTML report was created! Why? I investigated a bit…

I wanted to see the log out of the allure.AllureReportBridge class. I looked into the Console of Katalon Studio IDE, but found no log from the class recorded. I wanted to set the logger to output logs. So I edited the healthcare-tests/Include/config/log.properties file to have a line:

logging.level.allure=DEBUG

and re-ran the Test Suite. Then I noticed several interesting logs.

...
2026-08-09 10:14:23.451 INFO  c.k.katalon.core.main.TestCaseExecutor   - END Test Cases/Main Test Cases/TC3_Visual Testing Example
2026-08-09 10:14:23.454 INFO  allure.AllureReportBridge                - [Allure] Suite finished. Results: /Users/kazuakiurayama/katalon-workspace/healthcare-tests/allure-results
2026-08-09 10:14:23.456 INFO  allure.AllureReportBridge                - [Allure][diag] run at Sun Aug 09 10:14:23 JST 2026\ntestSuiteContext.getTestSuiteId()               = 'Test Suites/healthcare-tests - TS_RegressionTest'\nRunConfiguration.getExecutionSourceName()        = 'healthcare-tests - TS_RegressionTest'\nRunConfiguration.getExecutionSource()            = '/Users/kazuakiurayama/katalon-workspace/healthcare-tests/Test Suites/healthcare-tests - TS_RegressionTest.ts'\nRunConfiguration.getExecutedEntity()             = 'TestSuite'\n=> resolved name = 'healthcare-tests - TS_RegressionTest' (via getExecutionSourceName())\n
2026-08-09 10:14:23.613 WARN  allure.AllureReportBridge                - [Allure] Could not auto-generate the HTML report - is 'allure' on PATH? (Cannot run program "allure": error=2, No such file or directory)
java.io.IOException: Cannot run program "allure": error=2, No such file or directory
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
	at allure.AllureReportBridge.runAllureGenerate(AllureReportBridge.groovy:269)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
	at allure.AllureReportBridge.generateHtmlReport(AllureReportBridge.groovy:197)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
	at allure.AllureReportBridge.finishSuite(AllureReportBridge.groovy:157)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
	at AllureTestListener.afterTestSuite(AllureTestListener.groovy:41)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1254)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:814)
	at groovy.lang.GroovyObject.invokeMethod(GroovyObject.java:39)
	at com.kms.katalon.core.context.internal.TestHooker.invokeMethod(TestHooker.java:111)
	at com.kms.katalon.core.context.internal.TestHooker.lambda$3(TestHooker.java:95)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at com.kms.katalon.core.context.internal.TestHooker.invokeContextMethods(TestHooker.java:94)
	at com.kms.katalon.core.context.internal.TestListenerCollector.lambda$3(TestListenerCollector.java:88)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
	at com.kms.katalon.core.context.internal.TestListenerCollector.handleListenerEvent(TestListenerCollector.java:85)
	at com.kms.katalon.core.context.internal.ExecutionEventManager.publicEvent(ExecutionEventManager.java:47)
	at com.kms.katalon.core.main.TestSuiteExecutor.executeListenerAfterTestSuite(TestSuiteExecutor.java:126)
	at com.kms.katalon.core.main.TestSuiteExecutor.execute(TestSuiteExecutor.java:114)
	at com.kms.katalon.core.main.TestCaseMain.startTestSuite(TestCaseMain.java:206)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
	at S0809_2.run(S0809_2.groovy:40)
	at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:254)
	at groovy.lang.GroovyShell.run(GroovyShell.java:360)
	at groovy.lang.GroovyShell.run(GroovyShell.java:349)
	at groovy.ui.GroovyMain.processOnce(GroovyMain.java:652)
	at groovy.ui.GroovyMain.run(GroovyMain.java:398)
	at groovy.ui.GroovyMain.access$1400(GroovyMain.java:68)
	at groovy.ui.GroovyMain$GroovyCommand.process(GroovyMain.java:322)
	at groovy.ui.GroovyMain.processArgs(GroovyMain.java:142)
	at groovy.ui.GroovyMain.main(GroovyMain.java:115)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:117)
	at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:39)
Caused by: java.io.IOException: error=2, No such file or directory
	at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
	at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:295)
	at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:225)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126)
	... 43 more
2026-08-09 10:14:23.640 INFO  c.k.katalon.core.main.TestSuiteExecutor  - --------------------
2026-08-09 10:14:23.640 INFO  c.k.katalon.core.main.TestSuiteExecutor  - END Test Suites/healthcare-tests - TS_RegressionTest
2026-08-09 10:14:23.640 INFO  c.k.katalon.core.main.TestSuiteExecutor  - ====================

The stack trace showed a fatal error message Cannot run program "allure": error=2, No such file or directory'. It was thrown by allure.AllureReportBridge.runAllureGenerate(AllureReportBridge.groovy` at the line#269.

In the Keywords/allure/AllureReportBridge.groovy file, I found the following fragment

    private static boolean runAllureGenerate(File resultsDir, File outputDir, boolean singleFile) {
        List<String> baseCommand = ['allure', 'generate', resultsDir.absolutePath, '--clean', '-o', outputDir.absolutePath]
        if (singleFile) {
            baseCommand << '--single-file'
        }
        boolean isWindows = System.getProperty('os.name', '').toLowerCase().contains('win')
        List<String> command = isWindows ? (['cmd', '/c'] + baseCommand) : baseCommand

        Process process = new ProcessBuilder(command).redirectErrorStream(true).start()   // <= Exception HERE
        ...

I noticed that the baseCommand starts with a string allure. Is it OK? Maybe not, I thought. I edited the source slightly:

  • Old
        List<String> baseCommand = ['allure', 'generate', resultsDir.absolutePath, '--clean', '-o', outputDir.absolutePath]
  • New
        List<String> baseCommand = ['/Users/kazurayam/.volta/bin/allure', 'generate', resultsDir.absolutePath, '--clean', '-o', outputDir.absolutePath]

I re-run the test suite. This time I got a HTML report in the allure-report folder. Oorah!

$ tree allure-report
allure-report
└── healthcare-tests - TS_RegressionTest_20260809_103416.html

1 directory, 1 file

The report generated this time looked like this:

You can see the report here

As far as I know, the new ProcessBuilder([command]) requires the absolute path of command on the machine.

The ProcessBuilder never parses the environment variable PATH and lookup the location of ‘allure’. The PATH is meant for the shell (sh, bash, etc) only. It is not meant to be a resource for Java’s ProcessBuilder.

How the environment variable PATH is given in Katalon Stuido IDE?

I wrote a Test case Test Cases/echoPATH as follows:

String path = System.getenv("PATH");
println(path);

When I ran the Test Case in the Katalon Studio IDE, I got:

/usr/bin:/bin:/usr/sbin:/sbin

On the other hand, when I ran the same *.groovy script in the Terminal window with bash interpreter, I got …

/Users/kazurayam/.bun/bin:/Users/kazurayam/.volta/bin:/Users/kazurayam/.anyenv/envs/nodenv/shims:/Users/kazurayam/.anyenv/envs/nodenv/bin:/Users/kazurayam/.anyenv/bin:/usr/local/bin:/usr/local/sbin:/Users/kazurayam/.nodebrew/current/bin:/Users/kazurayam/.pyenv/shims:/Users/kazurayam/.pyenv/bin:/Users/kazurayam/.deno/bin:/Users/kazurayam/.volta/bin:/Users/kazurayam/.local/bin:/Users/kazurayam/.nvm/versions/node/v22.14.0/bin:/Users/kazurayam/.sdkman/candidates/springboot/current/bin:/Users/kazurayam/.sdkman/candidates/maven/current/bin:/Users/kazurayam/.sdkman/candidates/kotlin/current/bin:/Users/kazurayam/.sdkman/candidates/java/current/bin:/Users/kazurayam/.sdkman/candidates/groovy/current/bin:/Users/kazurayam/.sdkman/candidates/gradle/current/bin:/Users/kazurayam/.gem/ruby/2.7.4/bin:/Users/kazurayam/.rubies/ruby-2.7.4/lib/ruby/gems/2.7.0/bin:/Users/kazurayam/.rubies/ruby-2.7.4/bin:/Users/kazurayam/.cargo/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/Library/Apple/usr/bin:/opt/homebrew/bin:/usr/local/go/bin:/Users/kazurayam/Library/Android/sdk/platform-tools:.:/Applications/Firefox.app/Contents/MacOS/firefox:/Users/kazurayam/.cargo/bin:/Users/kazurayam/.gvm/bin

The environment variable PATH in Katalon Studio IDE and the PATH in my command line — these had completely different setup.

I think that it is not a good idea if the allure-katalon-bridge depends on the PATH.

In Windows cmd.exe (the Command Prompt), you can use the built-in WHERE command to find where a command or executable is located. It searches your PATH to show matching file locations. In Mac/Linux shell, you can use the built-in which command to find out the location of allure

Problem 2: Test Suite Collection generated a broken Allure HTML report.

In the healthcare-tests project, we have the healthcare-tests/Test Suite/healthcare-tests - TS_RegressionTestCollection. I ran it. The Collection went through fine.

In the Test Explorer of Katalon Studio IDE, I looked into the allure-report directory, found a .html file. So I double clicked it. I got the following Error dialog.

The html seemed to be broken somehow.

I switched to mac Finder, navigated to the allure-report directory, found the html file. So I opend it with Chrome.

It opened, looked ok at a glance, but I found something strange.

I expected the report to contain the results of 2 Test Suites — one executed with Chrome, another with Firefox.

However, the Collection report contained only the result of the Test Suite with Firefox. No report of Chrome found.

Allure report and the built-in report — which one to choose

Now I got 2 instances of Test Suite execution report. One generated using the allure-katalon-bridge. Another generated by Katalon Studio. Which one should I choose?

I found both reports cover the same log information. Both are equally useful.

If you are already familiar with the Allure products and want to see the test results in the Allure report format, the bridge offers you a favourable choice. You would welcome it. If you have a large Test Suite which contains hundreds of component Test Cases, then the rich features of Allure might shine.

To be honest I don’t know Allure; I am not a fan of Allure products. I do not need the pie chart and bar chart for a tiny test execution report. So I would prefer the built-in HTML report of Katalon Studio as it is compact, well-optimized for tiny Katalon tests.

I guess, the html report was still being generated yet. I was too hasty in IDE. I needed to wait for several seconds for the report generation processing to finish. — but there was no progress indication. It is a bit difficult to be kind and on time.

You would not face this problem in Katalon Runtime Engine in command line because KRE would finish only when the bridge module finished generating the html.

@kazurayam thx for your issues. So both the problems you reported are still not working as your latest comment says report was generated

I am asking as I will start looking into it.

I would have to utilise the ci provided mac os only everytime as only the elites have apple products , :joy:

Pushed the fixes , can you check once

I tried the allure-katalon bridge v1.0.1 on my macOS + Katalon Studio v11.3.0. I ran the healthcare-tests - TS_RegressionTestCollection.

The report was successfully generated. I saw a message in the Console:

2026-08-12 09:24:09.448 INFO  allure.AllureReportBridge                - 
    [Allure] Found allure at a common install location:
     /Users/kazurayam/.volta/bin/allure

This indicates that the bridge could find the location of my allure installation.

Great work! Thank you.

Still I have a question.

I tried v1.0.1 on my macOS + Katalon Studio v11.3.0. I ran the healthcare-tests - TS_RegressionTestCollection which bindles 2 Test Suites:

On the other hand, the allure report contains the information of only 1 Test Suite (Run with Firefox).

How can I see the report of the missing Test Suite (Run with Chrome)?


I am afraid that it is difficult to compile a report of a Test Suite Collection with 2 or more component Test Suite. The report can include only the last component Test Suite.

Why?

Remember, the Katalon API’s Test Listener provides the annotations of @beforeTestSuite, @beforeTestCase, @afterTestCase and @afterTestSuite, but it does not enable us to write the event handlers of @beforeTestSuiteCollection and @afterTestSuiteCollection.

The Katalon API is designed as such. The Katalon API is not designed with the external reporting frameworks (Allure, Extent, etc) in mind.

Therefore the allure-katalon-bridge would not have a chance to handle multiple Test Suites in a Collection appropriately. I am afraid, this would be a significant shortage if you have a serious Collection of multiple TestSuites executed in a CI/CD process.

Is the test suite name same ? And both the test suites have 3 test cases in total ? Right?

Collection works fine but if you have the same test suite name , it would show as one but would have test cases from both the test suites , i checked it on multiple test suites in a collection and it works , however there is environment (browser) thing that is not listing properly and i would check that

This behavior breaks the concept of “Test Suite Collection”.
This behavior is unacceptable for Katalon users, I think.

Well I disagree , way of looking from a user perspective but at the same time if even one user gets this confusion , its worth a fix , will check on this and release 1.0.2 soon.

In the Healthcare tests project, I ran the healthcare-tests - TS_RegressionTestCollection which bindles 2 Test Suites. Katalon Studio created a file <project>/Reports/20260812_092245/healthcare-tests - TS_RegressionTestCollection/20260812_092245/20260812_092245.rp, which contains the following information in XML format:

<?xml version="1.0" encoding="UTF-8"?>
<ReportCollectionEntity>
   <description></description>
   <name>20260812_092245</name>
   <tag></tag>
   <displayName>20260812_092245</displayName>
   <reportItemDescriptions>
      <ReportItemDescription>
         <reportLocation>Reports/20260812_092245/healthcare-tests - TS_RegressionTest/20260812_092245</reportLocation>
         <runConfigDescription>
            <groupName>Web Desktop</groupName>
            <profileName>default</profileName>
            <requireConfigurationData>false</requireConfigurationData>
            <runConfigurationId>Chrome</runConfigurationId>
         </runConfigDescription>
         <testCaseAmount>0</testCaseAmount>
      </ReportItemDescription>
      <ReportItemDescription>
         <reportLocation>Reports/20260812_092245/healthcare-tests - TS_RegressionTest/20260812_092246</reportLocation>
         <runConfigDescription>
            <groupName>Web Desktop</groupName>
            <profileName>default</profileName>
            <requireConfigurationData>false</requireConfigurationData>
            <runConfigurationId>Firefox</runConfigurationId>
         </runConfigDescription>
         <testCaseAmount>0</testCaseAmount>
      </ReportItemDescription>
   </reportItemDescriptions>
   <testSuiteCollectionId>Test Suites/healthcare-tests - TS_RegressionTestCollection</testSuiteCollectionId>
</ReportCollectionEntity>

This XML represents the concept of “Test Suite Collection”. This XML stands as the sole entory point of the report of a Test Suite Collection, which internally forks to the 2 individual reports of Test Suites.

I think, the allure-katalon-bridge should generate something like this.

I have fixed these issues and checked on mac os azure pipeline, can you check once