testbench2robotframework 0.9.0a1__tar.gz → 0.9.1a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/.gitignore +2 -1
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/ExampleConfiguration/json_config.json +2 -2
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/ExampleConfiguration/pyproject_example.toml +1 -1
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/ExampleConfiguration/toml_config.toml +1 -1
- testbench2robotframework-0.9.1a2/PKG-INFO +158 -0
- testbench2robotframework-0.9.1a2/README.md +131 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/libs/json_config.py +2 -2
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/__init__.py +1 -1
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/cli.py +5 -5
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/config.py +3 -3
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/model.py +33 -33
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/result_writer.py +79 -79
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/testbench2rf.py +149 -149
- testbench2robotframework-0.9.0a1/PKG-INFO +0 -311
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/CreatePiPWheel.bat +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/CreatePiPWheel.sh +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/DEVELOPMENT.md +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/LICENSE +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/MANIFEST.in +0 -0
- /testbench2robotframework-0.9.0a1/README.md → /testbench2robotframework-0.9.1a2/README_old.md +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/json_config_tests/1_tfs.robot +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/libs/pyproject_config.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/resources/file_management.resource +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/resources/testbench2robotframework_cli.resource +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/rf_tests/cli_interface/write/json_config.robot +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/rf_tests/cli_interface/write/no_config_argument.robot +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/atest/robot/rf_tests/cli_interface/write/toml_config.robot +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/create_json_schema.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/LibrarySubdivision.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/Unbenannt.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/generated.png +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/libraries.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/resources.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/rfLibraryRootsTestBench.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/testbench_rfLibraryRegex.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/testbench_rfResourceRegex.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/images/testthemen.PNG +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/oldModel.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/pydantic_model.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/pyproject.toml +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/requirements.txt +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/robot.toml +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/tasks.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench-tools.zip +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/__main__.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/execution_artifacts.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/html_parser.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/json_reader.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/json_writer.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/log.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/model_utils.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/robotframework2testbench.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/testbench2robotframework.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/testsuite_write.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/testbench2robotframework/utils.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/tests/test_data/configurations/invalid_config.json +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/tests/test_data/configurations/valid_config.json +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/tests/test_missing_files.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/tests/test_robot_files_should_not_contain_invalid_characters.py +0 -0
- {testbench2robotframework-0.9.0a1 → testbench2robotframework-0.9.1a2}/tests/test_zip_file_generation.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"library-root": [
|
|
3
|
-
"
|
|
3
|
+
"Keywords",
|
|
4
4
|
"RF-Library"
|
|
5
5
|
],
|
|
6
6
|
"resource-root": [
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"log-suite-numbering": true,
|
|
12
12
|
"resource-directory": "{root}/Resources",
|
|
13
13
|
"clean": true,
|
|
14
|
-
"compound-
|
|
14
|
+
"compound-keyword-logging": "GROUP",
|
|
15
15
|
"library-mapping": {
|
|
16
16
|
"SeleniumLibrary": "SeleniumLibrary timeout=10 implicit_wait=1 run_on_failure=Capture Page Screenshot",
|
|
17
17
|
"SuperRemoteLibrary": "Remote http://127.0.0.1:8270 WITH NAME SuperRemoteLibrary"
|
|
@@ -7,7 +7,7 @@ fully-qualified = false
|
|
|
7
7
|
output-directory = "{root}/Generated"
|
|
8
8
|
log-suite-numbering = false
|
|
9
9
|
clean = true
|
|
10
|
-
compound-
|
|
10
|
+
compound-keyword-logging = true
|
|
11
11
|
resource-directory = "{root}/Resources"
|
|
12
12
|
testcase-split-regex = ".*StopWithRestart.*"
|
|
13
13
|
phase-pattern = "{testcase} : Phase {index}/{length}"
|
|
@@ -7,7 +7,7 @@ fully-qualified = false
|
|
|
7
7
|
output-directory = "{root}/Generated"
|
|
8
8
|
log-suite-numbering = false
|
|
9
9
|
clean = true
|
|
10
|
-
compound-
|
|
10
|
+
compound-keyword-logging = true
|
|
11
11
|
resource-directory = "{root}/Resources"
|
|
12
12
|
testcase-split-regex = ".*StopWithRestart.*"
|
|
13
13
|
phase-pattern = "{testcase} : Phase {index}/{length}"
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: testbench2robotframework
|
|
3
|
+
Version: 0.9.1a2
|
|
4
|
+
Summary: Robot Framework Code Generator from Keyword-Driven Tests in imbus TestBench 3.0 and newer
|
|
5
|
+
Author-email: imbus AG <support@imbus.de>
|
|
6
|
+
Requires-Python: >= 3.10
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: click >= 8.0
|
|
10
|
+
Requires-Dist: robotframework >= 5.0
|
|
11
|
+
Requires-Dist: tomli; python_version < '3.11'
|
|
12
|
+
Requires-Dist: build ; extra == "dev"
|
|
13
|
+
Requires-Dist: check-manifest ; extra == "dev"
|
|
14
|
+
Requires-Dist: flit ; extra == "dev"
|
|
15
|
+
Requires-Dist: invoke ; extra == "dev"
|
|
16
|
+
Requires-Dist: mypy ; extra == "dev"
|
|
17
|
+
Requires-Dist: pylint ; extra == "dev"
|
|
18
|
+
Requires-Dist: pytest ; extra == "dev"
|
|
19
|
+
Requires-Dist: pytest-cov ; extra == "dev"
|
|
20
|
+
Requires-Dist: pytest-spec ; extra == "dev"
|
|
21
|
+
Requires-Dist: robotframework-tidy ; extra == "dev"
|
|
22
|
+
Requires-Dist: ruff ; extra == "dev"
|
|
23
|
+
Requires-Dist: twine ; extra == "dev"
|
|
24
|
+
Project-URL: Repository, https://github.com/imbus/testbench2robotframework
|
|
25
|
+
Provides-Extra: dev
|
|
26
|
+
|
|
27
|
+
# TestBench2RobotFramework
|
|
28
|
+
|
|
29
|
+
**TestBench2RobotFramework** is a CLI tool used to convert a TestBench JSON report into Robot Framework test suites and to write the execution results provided by Robot Framework to the TestBench report.
|
|
30
|
+
|
|
31
|
+
## Installation
|
|
32
|
+
|
|
33
|
+
You can install TestBench2RobotFramework via pip using the following command:
|
|
34
|
+
|
|
35
|
+
```powershell
|
|
36
|
+
pip install testbench2robotframework
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Python 3.10 or higher is required to run this tool.
|
|
40
|
+
|
|
41
|
+
## Remark
|
|
42
|
+
TestBench2RobotFramework requires TestBench version >= 4. If you're running an older version please contact the TestBench support for information on how to connect your Version of TestBench to Robot Framework. The TestBench Report can be either be exported via the TestBench Rest API with tools like the testbench-cli-reporter or directly from the client.
|
|
43
|
+
|
|
44
|
+
## Usage
|
|
45
|
+
|
|
46
|
+
TestBench2RobotFramework supports two main use cases, which are described in more detail in the following sections:
|
|
47
|
+
|
|
48
|
+
1. Generating Robot Framework test suites from a TestBench report.
|
|
49
|
+
2. Fetching results from a Robot Framework output XML file and saving them back to a TestBench report.
|
|
50
|
+
|
|
51
|
+
### Generating Robot Framework Test Suites
|
|
52
|
+
To generate Robot Framework test suites, use the `generate-tests` subcommand:
|
|
53
|
+
|
|
54
|
+
```powershell
|
|
55
|
+
testbench2robotframework generate-tests TESTBENCH_REPORT
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This command generates a Robot Framework test suite for each test case set specified in the `TESTBENCH_REPORT`.
|
|
59
|
+
|
|
60
|
+

|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
The example above demonstrates how Robot Framework test suites are generated based on the *Test Theme Tree* defined in TestBench.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#### Configuration
|
|
68
|
+
|
|
69
|
+
There are multiple configuration options available for **TestBench2RobotFramework** that can be used to customize the generated test suites. Options can be specified either via the command line, in a `pyproject.toml` file or in a `robot.toml` file.
|
|
70
|
+
|
|
71
|
+
To use options via the command line, the following syntax is used:
|
|
72
|
+
|
|
73
|
+
```powershell
|
|
74
|
+
testbench2robotframework generate-tests [OPTIONS] TESTBENCH_REPORT
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
| Option | Description |
|
|
78
|
+
|--------|-------------|
|
|
79
|
+
| `-c`, `--config PATH` | Path to a configuration file for TestBench2RobotFramework. |
|
|
80
|
+
| `--clean` | Deletes all files present in the output-directory before new test suites are created. |
|
|
81
|
+
| `-d`, `--output-directory PATH` | Directory or ZIP archive containing the generated test suites. |
|
|
82
|
+
| `--compound-keyword-logging` | Mode for logging compound keywords. Options: `GROUP`, `COMMENT`, or `NONE`. |
|
|
83
|
+
| `--fully-qualified` | Calls Robot Framework keywords by their fully qualified names in the generated test suites. |
|
|
84
|
+
| `--log-suite-numbering` | Enables logging of the test suite numbering. |
|
|
85
|
+
| `--metadata` | Add extra metadata to the settings of the generated Robot Framework test suite. Provide entries as key:value pairs, where *key* is the metadata name and *value* is the corresponding value. Values may also be Python expressions. The special variable '$tcs' gives access to the TestBench Python model of the test case set. |
|
|
86
|
+
| `--resource-directory PATH` | Directory containing the Robot Framework resource files. |
|
|
87
|
+
| `--resource-directory-regex TEXT` | Regex that can be used to identify the TestBench Subdivision that corresponds to the <resource-directory>. Resources will be imported relative to this subdivision based on the test elements structure in TestBench. |
|
|
88
|
+
| `--library-regex TEXT` | Regular expression used to identify TestBench subdivisions corresponding to Robot Framework libraries. |
|
|
89
|
+
| `--library-root TEXT` | TestBench root subdivision whose direct children correspond to Robot Framework libraries. |
|
|
90
|
+
| `--resource-regex TEXT` | Regular expression used to identify TestBench subdivisions corresponding to Robot Framework resources. |
|
|
91
|
+
| `--resource-root TEXT` | TestBench root subdivision whose direct children correspond to Robot Framework resources. |
|
|
92
|
+
| `--library-mapping TEXT` | Library import statement to use when a keyword from the specified TestBench subdivision is encountered. |
|
|
93
|
+
| `--resource-mapping TEXT` | Resource import statement to use when a keyword from the specified TestBench subdivision is encountered. |
|
|
94
|
+
| `--help` | Displays the help message and exits. |
|
|
95
|
+
| `--version` | Writes the TestBench2RobotFramework, Robot Framework and Python version to console. |
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
### Saving Robot Framework Results
|
|
99
|
+
|
|
100
|
+
Saving the results requires a Robot Framework output XML file, along with the original TestBench report from which the test suites were generated.
|
|
101
|
+
|
|
102
|
+
Use the following command:
|
|
103
|
+
|
|
104
|
+
```powershell
|
|
105
|
+
testbench2robotframework fetch-results [OPTIONS] ROBOT_RESULT TESTBENCH_REPORT
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
| Option | Description |
|
|
109
|
+
|--------|-------------|
|
|
110
|
+
| `-c`, `--config PATH` | Path to a configuration file for TestBench2RobotFramework. |
|
|
111
|
+
| `-d`, `--output-directory PATH` | Path to the directory or ZIP file where the updated TestBench JSON report (with results) should be saved. |
|
|
112
|
+
| `--help` | Displays the help message and exits. |
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
### Using pyproject.toml
|
|
117
|
+
All CLI options available for ``testbench2robotframework`` can also be defined in your ``pyproject.toml`` file, ``robot.toml``, or a workspace-local ``.robot.toml``. This offers a convenient way to store and reuse configuration settings, particularly in larger projects or automated environments.
|
|
118
|
+
|
|
119
|
+
#### Example
|
|
120
|
+
```toml
|
|
121
|
+
[tool.testbench2robotframework]
|
|
122
|
+
library-regex = ['(?:.*\.)?(?P<resourceName>[^.]+?)\s*\[Robot-Library\].*']
|
|
123
|
+
resource-regex = ['(?:.*\.)?(?P<resourceName>[^.]+?)\s*\[Robot-Resource\].*']
|
|
124
|
+
library-root = ["RF", "RF-Library"]
|
|
125
|
+
resource-root = ["RF-Resource"]
|
|
126
|
+
fully-qualified = false
|
|
127
|
+
output-directory = "{root}/Generated"
|
|
128
|
+
log-suite-numbering = false
|
|
129
|
+
clean = true
|
|
130
|
+
compound-keyword-logging = GROUP
|
|
131
|
+
resource-directory = "{root}/Resources"
|
|
132
|
+
resource-directory-regex = ".*\\[Robot-Resources\\].*"
|
|
133
|
+
reference-behaviour = "ATTACHMENT"
|
|
134
|
+
attachment-conflict-behaviour = "USE_EXISTING"
|
|
135
|
+
|
|
136
|
+
[tool.testbench2robotframework.library-mapping]
|
|
137
|
+
SeleniumLibrary = "SeleniumLibrary timeout=10 implicit_wait=1 run_on_failure=Capture Page Screenshot"
|
|
138
|
+
SuperRemoteLibrary = "Remote http://127.0.0.1:8270 WITH NAME SuperRemoteLibrary"
|
|
139
|
+
|
|
140
|
+
[tool.testbench2robotframework.resource-mapping]
|
|
141
|
+
MyKeywords = "{root}/../MyKeywords.resource"
|
|
142
|
+
MyOtherKeywords = "{resourceDirectory}/subdir/MyOtherKeywords.resource"
|
|
143
|
+
|
|
144
|
+
[tool.testbench2robotframework.forced-import]
|
|
145
|
+
libraries = ["test.py"]
|
|
146
|
+
resources = []
|
|
147
|
+
variables = []
|
|
148
|
+
|
|
149
|
+
[tool.testbench2robotframework.console-logging]
|
|
150
|
+
logLevel = "INFO"
|
|
151
|
+
logFormat = "%(levelname)s: %(message)s"
|
|
152
|
+
|
|
153
|
+
[tool.testbench2robotframework.file-logging]
|
|
154
|
+
logLevel = "DEBUG"
|
|
155
|
+
logFormat = "%(asctime)s - %(filename)s:%(lineno)d - %(levelname)8s - %(message)s"
|
|
156
|
+
fileName = "testbench2robotframework.log"
|
|
157
|
+
```
|
|
158
|
+
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# TestBench2RobotFramework
|
|
2
|
+
|
|
3
|
+
**TestBench2RobotFramework** is a CLI tool used to convert a TestBench JSON report into Robot Framework test suites and to write the execution results provided by Robot Framework to the TestBench report.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
You can install TestBench2RobotFramework via pip using the following command:
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
pip install testbench2robotframework
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Python 3.10 or higher is required to run this tool.
|
|
14
|
+
|
|
15
|
+
## Remark
|
|
16
|
+
TestBench2RobotFramework requires TestBench version >= 4. If you're running an older version please contact the TestBench support for information on how to connect your Version of TestBench to Robot Framework. The TestBench Report can be either be exported via the TestBench Rest API with tools like the testbench-cli-reporter or directly from the client.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
TestBench2RobotFramework supports two main use cases, which are described in more detail in the following sections:
|
|
21
|
+
|
|
22
|
+
1. Generating Robot Framework test suites from a TestBench report.
|
|
23
|
+
2. Fetching results from a Robot Framework output XML file and saving them back to a TestBench report.
|
|
24
|
+
|
|
25
|
+
### Generating Robot Framework Test Suites
|
|
26
|
+
To generate Robot Framework test suites, use the `generate-tests` subcommand:
|
|
27
|
+
|
|
28
|
+
```powershell
|
|
29
|
+
testbench2robotframework generate-tests TESTBENCH_REPORT
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This command generates a Robot Framework test suite for each test case set specified in the `TESTBENCH_REPORT`.
|
|
33
|
+
|
|
34
|
+

|
|
35
|
+

|
|
36
|
+
|
|
37
|
+
The example above demonstrates how Robot Framework test suites are generated based on the *Test Theme Tree* defined in TestBench.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#### Configuration
|
|
42
|
+
|
|
43
|
+
There are multiple configuration options available for **TestBench2RobotFramework** that can be used to customize the generated test suites. Options can be specified either via the command line, in a `pyproject.toml` file or in a `robot.toml` file.
|
|
44
|
+
|
|
45
|
+
To use options via the command line, the following syntax is used:
|
|
46
|
+
|
|
47
|
+
```powershell
|
|
48
|
+
testbench2robotframework generate-tests [OPTIONS] TESTBENCH_REPORT
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Option | Description |
|
|
52
|
+
|--------|-------------|
|
|
53
|
+
| `-c`, `--config PATH` | Path to a configuration file for TestBench2RobotFramework. |
|
|
54
|
+
| `--clean` | Deletes all files present in the output-directory before new test suites are created. |
|
|
55
|
+
| `-d`, `--output-directory PATH` | Directory or ZIP archive containing the generated test suites. |
|
|
56
|
+
| `--compound-keyword-logging` | Mode for logging compound keywords. Options: `GROUP`, `COMMENT`, or `NONE`. |
|
|
57
|
+
| `--fully-qualified` | Calls Robot Framework keywords by their fully qualified names in the generated test suites. |
|
|
58
|
+
| `--log-suite-numbering` | Enables logging of the test suite numbering. |
|
|
59
|
+
| `--metadata` | Add extra metadata to the settings of the generated Robot Framework test suite. Provide entries as key:value pairs, where *key* is the metadata name and *value* is the corresponding value. Values may also be Python expressions. The special variable '$tcs' gives access to the TestBench Python model of the test case set. |
|
|
60
|
+
| `--resource-directory PATH` | Directory containing the Robot Framework resource files. |
|
|
61
|
+
| `--resource-directory-regex TEXT` | Regex that can be used to identify the TestBench Subdivision that corresponds to the <resource-directory>. Resources will be imported relative to this subdivision based on the test elements structure in TestBench. |
|
|
62
|
+
| `--library-regex TEXT` | Regular expression used to identify TestBench subdivisions corresponding to Robot Framework libraries. |
|
|
63
|
+
| `--library-root TEXT` | TestBench root subdivision whose direct children correspond to Robot Framework libraries. |
|
|
64
|
+
| `--resource-regex TEXT` | Regular expression used to identify TestBench subdivisions corresponding to Robot Framework resources. |
|
|
65
|
+
| `--resource-root TEXT` | TestBench root subdivision whose direct children correspond to Robot Framework resources. |
|
|
66
|
+
| `--library-mapping TEXT` | Library import statement to use when a keyword from the specified TestBench subdivision is encountered. |
|
|
67
|
+
| `--resource-mapping TEXT` | Resource import statement to use when a keyword from the specified TestBench subdivision is encountered. |
|
|
68
|
+
| `--help` | Displays the help message and exits. |
|
|
69
|
+
| `--version` | Writes the TestBench2RobotFramework, Robot Framework and Python version to console. |
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
### Saving Robot Framework Results
|
|
73
|
+
|
|
74
|
+
Saving the results requires a Robot Framework output XML file, along with the original TestBench report from which the test suites were generated.
|
|
75
|
+
|
|
76
|
+
Use the following command:
|
|
77
|
+
|
|
78
|
+
```powershell
|
|
79
|
+
testbench2robotframework fetch-results [OPTIONS] ROBOT_RESULT TESTBENCH_REPORT
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
| Option | Description |
|
|
83
|
+
|--------|-------------|
|
|
84
|
+
| `-c`, `--config PATH` | Path to a configuration file for TestBench2RobotFramework. |
|
|
85
|
+
| `-d`, `--output-directory PATH` | Path to the directory or ZIP file where the updated TestBench JSON report (with results) should be saved. |
|
|
86
|
+
| `--help` | Displays the help message and exits. |
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
### Using pyproject.toml
|
|
91
|
+
All CLI options available for ``testbench2robotframework`` can also be defined in your ``pyproject.toml`` file, ``robot.toml``, or a workspace-local ``.robot.toml``. This offers a convenient way to store and reuse configuration settings, particularly in larger projects or automated environments.
|
|
92
|
+
|
|
93
|
+
#### Example
|
|
94
|
+
```toml
|
|
95
|
+
[tool.testbench2robotframework]
|
|
96
|
+
library-regex = ['(?:.*\.)?(?P<resourceName>[^.]+?)\s*\[Robot-Library\].*']
|
|
97
|
+
resource-regex = ['(?:.*\.)?(?P<resourceName>[^.]+?)\s*\[Robot-Resource\].*']
|
|
98
|
+
library-root = ["RF", "RF-Library"]
|
|
99
|
+
resource-root = ["RF-Resource"]
|
|
100
|
+
fully-qualified = false
|
|
101
|
+
output-directory = "{root}/Generated"
|
|
102
|
+
log-suite-numbering = false
|
|
103
|
+
clean = true
|
|
104
|
+
compound-keyword-logging = GROUP
|
|
105
|
+
resource-directory = "{root}/Resources"
|
|
106
|
+
resource-directory-regex = ".*\\[Robot-Resources\\].*"
|
|
107
|
+
reference-behaviour = "ATTACHMENT"
|
|
108
|
+
attachment-conflict-behaviour = "USE_EXISTING"
|
|
109
|
+
|
|
110
|
+
[tool.testbench2robotframework.library-mapping]
|
|
111
|
+
SeleniumLibrary = "SeleniumLibrary timeout=10 implicit_wait=1 run_on_failure=Capture Page Screenshot"
|
|
112
|
+
SuperRemoteLibrary = "Remote http://127.0.0.1:8270 WITH NAME SuperRemoteLibrary"
|
|
113
|
+
|
|
114
|
+
[tool.testbench2robotframework.resource-mapping]
|
|
115
|
+
MyKeywords = "{root}/../MyKeywords.resource"
|
|
116
|
+
MyOtherKeywords = "{resourceDirectory}/subdir/MyOtherKeywords.resource"
|
|
117
|
+
|
|
118
|
+
[tool.testbench2robotframework.forced-import]
|
|
119
|
+
libraries = ["test.py"]
|
|
120
|
+
resources = []
|
|
121
|
+
variables = []
|
|
122
|
+
|
|
123
|
+
[tool.testbench2robotframework.console-logging]
|
|
124
|
+
logLevel = "INFO"
|
|
125
|
+
logFormat = "%(levelname)s: %(message)s"
|
|
126
|
+
|
|
127
|
+
[tool.testbench2robotframework.file-logging]
|
|
128
|
+
logLevel = "DEBUG"
|
|
129
|
+
logFormat = "%(asctime)s - %(filename)s:%(lineno)d - %(levelname)8s - %(message)s"
|
|
130
|
+
fileName = "testbench2robotframework.log"
|
|
131
|
+
```
|
|
@@ -3,7 +3,7 @@ from pathlib import Path
|
|
|
3
3
|
|
|
4
4
|
data = {
|
|
5
5
|
# "rfLibraryRoots": [
|
|
6
|
-
# "
|
|
6
|
+
# "Keywords",
|
|
7
7
|
# "RF-Library"
|
|
8
8
|
# ],
|
|
9
9
|
# "rfResourceRoots": [
|
|
@@ -15,7 +15,7 @@ data = {
|
|
|
15
15
|
# "logSuiteNumbering": True,
|
|
16
16
|
# "resourceDirectory": "{root}/Resources",
|
|
17
17
|
# "clearGenerationDirectory": True,
|
|
18
|
-
# "
|
|
18
|
+
# "logCompoundKeywords": True,
|
|
19
19
|
# "subdivisionsMapping": {
|
|
20
20
|
# "libraries": {
|
|
21
21
|
# "SeleniumLibrary": "SeleniumLibrary timeout=10 implicit_wait=1 run_on_failure=Capture Page Screenshot",
|
|
@@ -85,9 +85,9 @@ def testbench2robotframework_cli():
|
|
|
85
85
|
help="Directory or ZIP archive containing the generated test suites.",
|
|
86
86
|
)
|
|
87
87
|
@click.option(
|
|
88
|
-
"--compound-
|
|
88
|
+
"--compound-keyword-logging",
|
|
89
89
|
type=click.Choice(["GROUP", "COMMENT", "NONE"], case_sensitive=False),
|
|
90
|
-
help="Mode for logging compound
|
|
90
|
+
help="Mode for logging compound keywords.",
|
|
91
91
|
)
|
|
92
92
|
@click.option(
|
|
93
93
|
"--log-suite-numbering", is_flag=True, help="Enables logging of the test suite numbering."
|
|
@@ -159,7 +159,7 @@ def testbench2robotframework_cli():
|
|
|
159
159
|
@click.argument("testbench-report", type=click.Path(path_type=Path))
|
|
160
160
|
def generate_tests( # noqa: PLR0913
|
|
161
161
|
clean: bool,
|
|
162
|
-
|
|
162
|
+
compound_keyword_logging: str,
|
|
163
163
|
config: Path,
|
|
164
164
|
fully_qualified: bool,
|
|
165
165
|
library_regex: tuple[str],
|
|
@@ -198,8 +198,8 @@ def generate_tests( # noqa: PLR0913
|
|
|
198
198
|
else:
|
|
199
199
|
configuration["log-suite-numbering"] = configuration.get("log-suite-numbering", False)
|
|
200
200
|
configuration["metadata"] = metadata or configuration.get("metadata", {})
|
|
201
|
-
configuration["compound-
|
|
202
|
-
|
|
201
|
+
configuration["compound-keyword-logging"] = (
|
|
202
|
+
compound_keyword_logging or configuration.get("compound-keyword-logging", "GROUP")
|
|
203
203
|
)
|
|
204
204
|
configuration["resource-directory"] = (
|
|
205
205
|
resource_directory.as_posix()
|
|
@@ -163,7 +163,7 @@ class LoggingConfig:
|
|
|
163
163
|
)
|
|
164
164
|
|
|
165
165
|
|
|
166
|
-
class
|
|
166
|
+
class CompoundKeywordLogging(StrEnum):
|
|
167
167
|
GROUP = "GROUP"
|
|
168
168
|
COMMENT = "COMMENT"
|
|
169
169
|
NONE = "NONE"
|
|
@@ -186,7 +186,7 @@ class AttachmentConflictBehaviour(StrEnum):
|
|
|
186
186
|
class Configuration:
|
|
187
187
|
attachmentConflictBehaviour: AttachmentConflictBehaviour
|
|
188
188
|
clean: bool
|
|
189
|
-
|
|
189
|
+
compound_keyword_logging: CompoundKeywordLogging
|
|
190
190
|
forced_import: ForcedImport
|
|
191
191
|
fully_qualified: bool
|
|
192
192
|
library_regex: list[str]
|
|
@@ -229,7 +229,7 @@ class Configuration:
|
|
|
229
229
|
}
|
|
230
230
|
),
|
|
231
231
|
metadata=dictionary.get("metadata", {}),
|
|
232
|
-
|
|
232
|
+
compound_keyword_logging=CompoundKeywordLogging(dictionary.get("compound-keyword-logging", "GROUP").upper()),
|
|
233
233
|
resource_directory=dictionary.get("resource-directory", "").replace(
|
|
234
234
|
"\\", "/"
|
|
235
235
|
),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# generated by datamodel-codegen:
|
|
2
2
|
# filename: openapi.yml
|
|
3
|
-
# timestamp: 2025-11-
|
|
3
|
+
# timestamp: 2025-11-24T08:45:38+00:00
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
@@ -118,7 +118,7 @@ class VerdictStatus(Enum):
|
|
|
118
118
|
Pass = 'Pass'
|
|
119
119
|
|
|
120
120
|
|
|
121
|
-
class
|
|
121
|
+
class KeywordVerdict(Enum):
|
|
122
122
|
Pass = 'Pass'
|
|
123
123
|
Fail = 'Fail'
|
|
124
124
|
Skipped = 'Skipped'
|
|
@@ -134,12 +134,12 @@ class SequencePhase(Enum):
|
|
|
134
134
|
Teardown = 'Teardown'
|
|
135
135
|
|
|
136
136
|
|
|
137
|
-
class
|
|
137
|
+
class KeywordCallType(Enum):
|
|
138
138
|
Flow = 'Flow'
|
|
139
139
|
Check = 'Check'
|
|
140
140
|
|
|
141
141
|
|
|
142
|
-
class
|
|
142
|
+
class KeywordType(Enum):
|
|
143
143
|
Atomic = 'Atomic'
|
|
144
144
|
Compound = 'Compound'
|
|
145
145
|
Textual = 'Textual'
|
|
@@ -615,7 +615,7 @@ class UDFEnumerationValue:
|
|
|
615
615
|
|
|
616
616
|
|
|
617
617
|
@dataclass
|
|
618
|
-
class
|
|
618
|
+
class Tag:
|
|
619
619
|
key: str
|
|
620
620
|
name: str
|
|
621
621
|
isVariantsMarker: bool
|
|
@@ -735,7 +735,7 @@ class TestCaseSetSpecificationSummary:
|
|
|
735
735
|
preConditions: List[ConditionSummary]
|
|
736
736
|
postConditions: List[ConditionSummary]
|
|
737
737
|
udfs: List[UserDefinedField]
|
|
738
|
-
|
|
738
|
+
tags: List[Tag]
|
|
739
739
|
references: List[str]
|
|
740
740
|
requirements: List[RequirementReference]
|
|
741
741
|
responsible: Optional[UserReference] = None
|
|
@@ -748,7 +748,7 @@ class TestCaseSpecificationDetails:
|
|
|
748
748
|
key: str
|
|
749
749
|
comments: str
|
|
750
750
|
udfs: List[UserDefinedField]
|
|
751
|
-
|
|
751
|
+
tags: List[Tag]
|
|
752
752
|
requirements: List[RequirementReference]
|
|
753
753
|
version: Optional[str] = None
|
|
754
754
|
|
|
@@ -761,7 +761,7 @@ class TestThemeSpecification:
|
|
|
761
761
|
status: SpecStatus
|
|
762
762
|
priority: Priority
|
|
763
763
|
udfs: List[UserDefinedField]
|
|
764
|
-
|
|
764
|
+
tags: List[Tag]
|
|
765
765
|
requirements: List[RequirementReference]
|
|
766
766
|
references: List[str]
|
|
767
767
|
dueDate: Optional[str] = None
|
|
@@ -774,7 +774,7 @@ class TestCaseSetExecutionSummary:
|
|
|
774
774
|
key: str
|
|
775
775
|
comments: str
|
|
776
776
|
udfs: List[UserDefinedField]
|
|
777
|
-
|
|
777
|
+
tags: List[Tag]
|
|
778
778
|
|
|
779
779
|
|
|
780
780
|
@dataclass
|
|
@@ -815,7 +815,7 @@ class TestCaseExecutionDetails:
|
|
|
815
815
|
comments: str
|
|
816
816
|
defects: List[str]
|
|
817
817
|
udfs: List[UserDefinedField]
|
|
818
|
-
|
|
818
|
+
tags: List[Tag]
|
|
819
819
|
references: List[str]
|
|
820
820
|
version: Optional[str] = None
|
|
821
821
|
tester: Optional[UserReference] = None
|
|
@@ -1116,7 +1116,7 @@ class TestThemeExecution:
|
|
|
1116
1116
|
execStatus: ExecStatus
|
|
1117
1117
|
verdict: VerdictStatus
|
|
1118
1118
|
udfs: List[UserDefinedField]
|
|
1119
|
-
|
|
1119
|
+
tags: List[Tag]
|
|
1120
1120
|
references: List[str]
|
|
1121
1121
|
comments: Optional[str] = None
|
|
1122
1122
|
responsible: Optional[UserReference] = None
|
|
@@ -1332,8 +1332,8 @@ class TestCaseSetExecutionForImport:
|
|
|
1332
1332
|
|
|
1333
1333
|
|
|
1334
1334
|
@dataclass
|
|
1335
|
-
class
|
|
1336
|
-
verdict:
|
|
1335
|
+
class KeywordCallExecution:
|
|
1336
|
+
verdict: KeywordVerdict
|
|
1337
1337
|
duration: int
|
|
1338
1338
|
currentUser: UserReference
|
|
1339
1339
|
comments: str
|
|
@@ -1404,7 +1404,7 @@ class DefaultValue:
|
|
|
1404
1404
|
|
|
1405
1405
|
|
|
1406
1406
|
@dataclass
|
|
1407
|
-
class
|
|
1407
|
+
class KeywordParameterForInsert:
|
|
1408
1408
|
name: str
|
|
1409
1409
|
dataTypeKey: Optional[str] = None
|
|
1410
1410
|
evaluationType: Optional[ParameterEvaluationType] = None
|
|
@@ -1646,12 +1646,12 @@ class ImageInfo:
|
|
|
1646
1646
|
|
|
1647
1647
|
|
|
1648
1648
|
@dataclass
|
|
1649
|
-
class
|
|
1649
|
+
class KeywordDetails:
|
|
1650
1650
|
key: str
|
|
1651
1651
|
name: str
|
|
1652
1652
|
uniqueID: str
|
|
1653
1653
|
status: TestElementStatus
|
|
1654
|
-
defaultCallType:
|
|
1654
|
+
defaultCallType: KeywordCallType
|
|
1655
1655
|
description: str
|
|
1656
1656
|
path: str
|
|
1657
1657
|
parameters: List[ParameterDetails]
|
|
@@ -1734,44 +1734,44 @@ class RichTextInfo:
|
|
|
1734
1734
|
|
|
1735
1735
|
|
|
1736
1736
|
@dataclass
|
|
1737
|
-
class
|
|
1737
|
+
class KeywordCallSpecification:
|
|
1738
1738
|
key: str
|
|
1739
1739
|
name: str
|
|
1740
1740
|
sequencePhase: SequencePhase
|
|
1741
|
-
callType:
|
|
1741
|
+
callType: KeywordCallType
|
|
1742
1742
|
comments: str
|
|
1743
1743
|
callParameters: List[ParameterSummary]
|
|
1744
|
-
|
|
1744
|
+
keywordType: Optional[KeywordType] = None
|
|
1745
1745
|
description: Optional[str] = None
|
|
1746
|
-
|
|
1747
|
-
|
|
1746
|
+
keywordKey: Optional[str] = None
|
|
1747
|
+
callingKeywordKey: Optional[str] = None
|
|
1748
1748
|
|
|
1749
1749
|
|
|
1750
1750
|
@dataclass
|
|
1751
|
-
class
|
|
1751
|
+
class KeywordCall:
|
|
1752
1752
|
sequenceID: str
|
|
1753
1753
|
numbering: str
|
|
1754
|
-
spec:
|
|
1754
|
+
spec: KeywordCallSpecification
|
|
1755
1755
|
parentID: Optional[str] = None
|
|
1756
|
-
exec: Optional[
|
|
1756
|
+
exec: Optional[KeywordCallExecution] = None
|
|
1757
1757
|
|
|
1758
1758
|
|
|
1759
1759
|
@dataclass
|
|
1760
|
-
class
|
|
1760
|
+
class KeywordForInsert:
|
|
1761
1761
|
parentKey: str
|
|
1762
1762
|
name: str
|
|
1763
|
-
parameters: List[
|
|
1763
|
+
parameters: List[KeywordParameterForInsert]
|
|
1764
1764
|
uid: Optional[str] = None
|
|
1765
1765
|
description: Optional[RichTextInfo] = None
|
|
1766
1766
|
advancedContent: Optional[AdvancedContent] = None
|
|
1767
|
-
callType: Optional[
|
|
1767
|
+
callType: Optional[KeywordCallType] = None
|
|
1768
1768
|
|
|
1769
1769
|
|
|
1770
1770
|
@dataclass
|
|
1771
|
-
class
|
|
1771
|
+
class KeywordDetailsForUpdate:
|
|
1772
1772
|
name: Optional[str] = None
|
|
1773
1773
|
description: Optional[RichTextInfo] = None
|
|
1774
|
-
callType: Optional[
|
|
1774
|
+
callType: Optional[KeywordCallType] = None
|
|
1775
1775
|
locker: Optional[OptionalUser] = None
|
|
1776
1776
|
advancedContent: Optional[OptionalAdvancedContent] = None
|
|
1777
1777
|
|
|
@@ -1828,9 +1828,9 @@ class TestCaseSetDetails:
|
|
|
1828
1828
|
name: str
|
|
1829
1829
|
spec: TestCaseSetSpecificationSummary
|
|
1830
1830
|
testCases: List[TestCaseSummary]
|
|
1831
|
-
testSequence: List[
|
|
1831
|
+
testSequence: List[KeywordCall]
|
|
1832
1832
|
parameters: List[ParameterDetails]
|
|
1833
|
-
|
|
1833
|
+
keywords: List[KeywordDetails]
|
|
1834
1834
|
exec: Optional[TestCaseSetExecutionSummary] = None
|
|
1835
1835
|
|
|
1836
1836
|
|
|
@@ -1838,9 +1838,9 @@ class TestCaseSetDetails:
|
|
|
1838
1838
|
class TestCaseDetails:
|
|
1839
1839
|
uniqueID: str
|
|
1840
1840
|
spec: TestCaseSpecificationDetails
|
|
1841
|
-
testSequence: List[
|
|
1841
|
+
testSequence: List[KeywordCall]
|
|
1842
1842
|
parameters: List[ParameterSummary]
|
|
1843
|
-
|
|
1843
|
+
keywords: List[KeywordDetails]
|
|
1844
1844
|
exec: Optional[TestCaseExecutionDetails] = None
|
|
1845
1845
|
origin: Optional[TestCaseDetailsOrigin] = None
|
|
1846
1846
|
|