diff --git a/404.html b/404.html index 37b84886b..166f9ed7e 100644 --- a/404.html +++ b/404.html @@ -12,15 +12,15 @@ - - + +
Skip to main content

Page Not Found

You may have used an outdated link as there have been some changes in the structure of the documentation.

But it/'s clearly here somewhere!
Please, use the keyword search to find it!

- - + + \ No newline at end of file diff --git a/FAQ/index.html b/FAQ/index.html index 9e6a59d88..99952cdf5 100644 --- a/FAQ/index.html +++ b/FAQ/index.html @@ -12,15 +12,15 @@ - - + +
-
Skip to main content

FAQ

On this page, we have put together a list of the most frequently asked questions. Here, you can find prompt responses.

1. Does on-prem installed ReportPortal make any external calls? What are the content and nature of these calls?

All test results and testing data reside in-house, within your instance of ReportPortal. However, there are two types of external calls that ReportPortal makes. The first checks our status page for the latest version and informs users of it on the login page. The second sends anonymized data to Google Analytics, helping us refine the user experience and better understand application usage. This can be toggled off if desired.

2. Assuming ReportPortal locally caches logs to understand their content, where are these stored, and what are the associated retention policies?

ReportPortal utilizes PostgreSQL for its database, MinIO and the local system for file storage, and Elasticsearch for log indexing and ML processes.

Retention policies can be set and adjusted within the application on a per-project basis.

3. How is data encrypted in transit and at rest?

We use encryption in transit via SSL for our SaaS instances. For on-prem installation it depends on your LoadBalancer.

We use encryption at rest for our SaaS instances. It is provided by AWS and configured during VM provisioning. For on-prem installation it depends on your DevOps.

4. Does the containerized solution function as a standalone, or can it be integrated with K8S or other orchestration platforms? Is there a helm chart available?

ReportPortal is containerized and can be orchestrated using either docker-compose or Kubernetes.

5. Is there any training available to use ReportPortal effectively?

Check our Tutorial and read blog post with tips to get ReportPortal benefits. We also recommend investigate our documentation where you can find screenshots and video instructions on ReportPortal functionality.

6. Is there a demo available?

For sure, you can explore ReportPortal without installation visiting our Demo instance.

7. How can I begin using ReportPortal?

The initial steps involve installing and configuring the tool. Installation steps you can find in our documentation.

8. Does the tool integrate with my existing test automation framework?

ReportPortal can be integrated with common testing frameworks and CI tools. Consult this section of the documentation for detailed information on test framework integration. And use following links for Integration with CI/CD: Integration with GitLab CI, Integration with Jenkins.

9. What type of license does ReportPortal use?

ReportPortal is licensed under Apache v2.0, which means it’s free to use, comes with no liability and warranty, and there is no service and support included. And can be utilized even for commercial usage.

10. Does ReportPortal have any paid features?

At that moment, we offer the only premium feature – Quality Gates. It is a set of predefined criteria that must be satisfied for a run to be deemed successful.

11. Does ReportPortal use AI?

We provide ML-driven failure triage. Read this article to know how we use AI.

12. Do we need specific infrastructure prerequisites to avoid performance problems?

Look into Optimal Performance Hardware setup.

13. What types of reports can I generate with the ReportPortal?

ReportPortal has a lot of widgets to visualize test results and understand the state of the product. Most popular our widgets: Overall statistics chart, Launch statistics chart, Failed cases trend chart, Launch execution and issue statistic, Component health check.

14. Can ReportPortal aggregate performance test results?

We do not support direct integration with performance testing frameworks, but as a workaround you can import performance test results in JUnit format into ReportPortal. Further information on this topic can be found here.

15. Does ReportPortal have integration with Jira?

Our test automation reporting dashboard have integration with following Bug Tracking Systems: Jira Server, Jira Cloud, Azure DevOps, and Rally.

- - +
Skip to main content

FAQ

On this page, we have put together a list of the most frequently asked questions. Here, you can find prompt responses.

1. Does on-prem installed ReportPortal make any external calls? What are the content and nature of these calls?

All test results and testing data reside in-house, within your instance of ReportPortal. However, there are two types of external calls that ReportPortal makes. The first checks our status page for the latest version and informs users of it on the login page. The second sends anonymized data to Google Analytics, helping us refine the user experience and better understand application usage. This can be toggled off if desired.

2. Assuming ReportPortal locally caches logs to understand their content, where are these stored, and what are the associated retention policies?

ReportPortal utilizes PostgreSQL for its database, MinIO and the local system for file storage, and Elasticsearch for log indexing and ML processes.

Retention policies can be set and adjusted within the application on a per-project basis.

3. How is data encrypted in transit and at rest?

We use encryption in transit via SSL for our SaaS instances. For on-prem installation it depends on your LoadBalancer.

We use encryption at rest for our SaaS instances. It is provided by AWS and configured during VM provisioning. For on-prem installation it depends on your DevOps.

4. Does the containerized solution function as a standalone, or can it be integrated with K8S or other orchestration platforms? Is there a helm chart available?

ReportPortal is containerized and can be orchestrated using either docker-compose or Kubernetes.

5. Is there any training available to use ReportPortal effectively?

Check our Tutorial and read blog post with tips to get ReportPortal benefits. We also recommend investigate our documentation where you can find screenshots and video instructions on ReportPortal functionality.

6. Is there a demo available?

For sure, you can explore ReportPortal without installation visiting our Demo instance.

7. How can I begin using ReportPortal?

The initial steps involve installing and configuring the tool. Installation steps you can find in our documentation.

8. Does the tool integrate with my existing test automation framework?

ReportPortal can be integrated with common testing frameworks and CI tools. Consult this section of the documentation for detailed information on test framework integration. And use following links for Integration with CI/CD: Integration with GitLab CI, Integration with Jenkins.

9. What type of license does ReportPortal use?

ReportPortal is licensed under Apache v2.0, which means it’s free to use, comes with no liability and warranty, and there is no service and support included. And can be utilized even for commercial usage.

10. Does ReportPortal have any paid features?

At that moment, we offer the only premium feature – Quality Gates. It is a set of predefined criteria that must be satisfied for a run to be deemed successful.

11. Does ReportPortal use AI?

We provide ML-driven failure triage. Read this article to know how we use AI.

12. Do we need specific infrastructure prerequisites to avoid performance problems?

Look into Optimal Performance Hardware setup.

13. What types of reports can I generate with the ReportPortal?

ReportPortal has a lot of widgets to visualize test results and understand the state of the product. Most popular our widgets: Overall statistics chart, Launch statistics chart, Failed cases trend chart, Launch execution and issue statistic, Component health check.

14. Can ReportPortal aggregate performance test results?

We do not support direct integration with performance testing frameworks, but as a workaround you can import performance test results in JUnit format into ReportPortal. Further information on this topic can be found here.

15. Does ReportPortal have integration with Jira?

Our test automation reporting dashboard have integration with following Bug Tracking Systems: Jira Server, Jira Cloud, Azure DevOps, and Rally.

+ + \ No newline at end of file diff --git a/admin-panel/AllProjectsPage/index.html b/admin-panel/AllProjectsPage/index.html index 79b56e8ad..eea84cdbd 100644 --- a/admin-panel/AllProjectsPage/index.html +++ b/admin-panel/AllProjectsPage/index.html @@ -12,14 +12,14 @@ - - + +
-
Skip to main content

All Projects page

Users with the Administrator role have access to the ReportPortal "Administrate" section.

In "Administrate" section you can:

  • Manage projects: create a project, delete a project, update project settings.

  • Manage users: create a user, invite a user to ReportPortal, delete a user, update a user project role, assign a user to projects/unassign a user from +

    All Projects page

    Users with the Administrator role have access to the ReportPortal "Administrate" section.

    In "Administrate" section you can:

    • Manage projects: create a project, delete a project, update project settings.

    • Manage users: create a user, invite a user to ReportPortal, delete a user, update a user project role, assign a user to projects/unassign a user from projects.

    To go to the "Administrate" section, open menu at the bottom of the page and select "Administrate" option.

    All existing projects are displayed on the "Projects" page.

    For each project, the following information is displayed:

    • Project name - the link to the "Dashboards" page of a project
    • Project type: "Internal" or "Personal"
    • Number of assigned team members
    • Number of launches
    • Last Launch date
    • "See detailed information" button
    • Ellipsis button

    By clicking on ellipsis button, a dropdown with the next options appears:

    • Members
    • Settings
    • Assign/Unassign
    • Delete
    note

    Administrator has access to a project even if they are not assigned to this project.

    By default, projects are sorted by the name in our test automation reporting dashboard.

    You can sort projects using the buttons from the "Sort by" section at the top. The sorting can be performed by: Creation date, Name, Members, Launches, Last Launch date, Project Type, Organization.

    To find a project quickly, type 3 or more symbols of the project name into the "Search" field.

    All Projects page allows:

    • to create a project
    • to update project settings
    • to invite users
    • to view project information
    • to delete a project (except PERSONAL project)

    Create projects

    To create a project, please refer to Creation of project and adding users

    Modify project settings

    To modify project settings please refer to Project Configuration

    Invite user on "All Projects" page

    To invite a user to a project on "All Projects" page, perform the following steps:

    1. Login into the ReportPortal instance as an Administrator.

    2. Navigate to the "Administrate" section -> "All Projects" page

    3. Click on ellipsis button on the project preview.

    4. Select the "Members" option.

    5. Click on the "Invite User" button.

    6. Enter the email address of the user in case he/she is not present in ReportPortal database @@ -30,7 +30,7 @@ button to complete the registration.

    7. The user will be assigned to the project that the invitation was sent from, and to "Personal Project" with the PROJECT MANAGER project role.

    note

    The link for registration will be active until the user registers in the system for up to, but not exceeding 24 hours.

    Detailed project info

    1. Login into ReportPortal instance as Administrator.

    2. Navigate to the "Administrate" section -> "All Projects" page.

    3. Click "See detailed information" button.

    4. View aggregated data of the selected project. Available period options are:

    • last 6 months
    • last 3 months
    • last month.

    Delete projects

    To delete a project, perform the following steps:

    1. Login into ReportPortal instance as Administrator.

    2. Navigate to the "Administrate" section -> "All Projects" page.

    3. Click on ellipsis button on the project preview.

    4. Click on the "Delete" option. A warning pop-up message will appear.

    5. Click "Delete". The project will be deleted from ReportPortal.

    note

    PERSONAL PROJECTS cannot be deleted from the system.

- - + + \ No newline at end of file diff --git a/admin-panel/AllUsersPage/index.html b/admin-panel/AllUsersPage/index.html index cfea50af4..ae9a9b9ca 100644 --- a/admin-panel/AllUsersPage/index.html +++ b/admin-panel/AllUsersPage/index.html @@ -12,14 +12,14 @@ - - + +
-

All Users page

The "All Users" page in "Administrate" section provides the access to see all available users in the our Testops system.

The page provides next information:

  • user's information: login, full name, email address
  • last login date: in 'time ago' format
  • projects on which users are assigned and roles on them
  • Delete button: only Admin is able to delete user from the system

"All Users" page allows:

  • to add and invite new ReportPortal users.
  • to assign users to the projects with any project role.
  • to unassign users from projects.
  • to update project role
  • to delete users from ReportPortal.

ReportPortal allows to create a new user account on the "All Users" page in the "Administration" section.

Add user

To add a user on the "All Users" page, perform the following steps:

  1. Login into ReportPortal instance as Administrator.

  2. Navigate to the "Administrate" section -> "All users" page.

  3. Click on the "Add User" button.

  4. Fill all fields with valid data in the "Add user" form and click on the "Add" button. A new user will be added to +

    All Users page

    The "All Users" page in "Administrate" section provides the access to see all available users in the our Testops system.

    The page provides next information:

    • user's information: login, full name, email address
    • last login date: in 'time ago' format
    • projects on which users are assigned and roles on them
    • Delete button: only Admin is able to delete user from the system

    "All Users" page allows:

    • to add and invite new ReportPortal users.
    • to assign users to the projects with any project role.
    • to unassign users from projects.
    • to update project role
    • to delete users from ReportPortal.

    ReportPortal allows to create a new user account on the "All Users" page in the "Administration" section.

    Add user

    To add a user on the "All Users" page, perform the following steps:

    1. Login into ReportPortal instance as Administrator.

    2. Navigate to the "Administrate" section -> "All users" page.

    3. Click on the "Add User" button.

    4. Fill all fields with valid data in the "Add user" form and click on the "Add" button. A new user will be added to the system and assigned to the selected project, and to "Personal Project" with the PROJECT MANAGER project role. Message with authorization data will be sent to the user's email.

    note

    This is the only place in the system where an Administrator can be created from. "Project role" is disabled, if Administrator has been selected in the @@ -36,7 +36,7 @@ dashboards and widgets), that the user owns on the projects will be kept in ReportPortal.

Edit user account role

The only space in ReportPortal where user can get the Administrator rights is All Users page.

Give ADMINISTRATOR role

To give Administrator role for any user, perform the following steps:

  1. Login into the ReportPortal instance as Administrator.

  2. Navigate to the "Administrate" section -> "All Users" page.

  3. Hover over user's name. - "Make admin" button will be displayed.

  4. Click on the "Make admin" button. - A confirmation message will be shown.

  5. Click "Change" button on pop-up window. Account role User will be changed to Administrator. The user account will be marked with "admin" label.

Take away ADMINISTRATOR role

To take away Administrator account role, perform the following steps:

  1. Login into ReportPortal instance as Administrator.

  2. Navigate to the "Administrate" section -> "All Users" page.

  3. Click on the "Admin" button near the user's name.

  4. A confirm message will be shown.

  5. Click "Change" button. Account role "Administrator" will be changed to "User".

- - + + \ No newline at end of file diff --git a/admin-panel/EventMonitoring/index.html b/admin-panel/EventMonitoring/index.html index 1e58ca2c0..698c1103a 100644 --- a/admin-panel/EventMonitoring/index.html +++ b/admin-panel/EventMonitoring/index.html @@ -12,15 +12,15 @@ - - + +
-

Event monitoring

Starting from version 23.2, ReportPortal can monitor all activities (events) at both the project and instance levels.

Project level event monitoring

To view the list of all activities within your project, open the menu at the bottom of the page as an Administrator and select the "Administrate" option. All existing projects are listed on the "All Projects" page. Click on the ellipsis button next to the project and choose the "Monitoring" option from the dropdown.

Here, you will find a table with the following columns: Time, User, Action, Object Type, Object Name, Old Value, and New Value.

Time

This column displays the time in a "time ago" format (e.g., "10 minutes ago"). Hovering over it, the system should show the precise action time.

User

This column shows who acted. We track not only actions by specific users but also, for your convenience, actions performed by ReportPortal itself or certain ReportPortal services. For example, actions by Jobs Service (such as Launch deletions) are included.

If the activity was on behalf of a user, and their account was deleted, then there will be a "deleted user" entry in the "User" column.

Action

This column displays all events within this project.

Event actions: Create dashboard, Update dashboard, Delete dashboard, Create widget, Update widget, Delete widget, Create filter, Update filter, Delete filter, Create custom defect type, Update defect, Delete defect, Create integration, Update integration, Delete integration, Start launch, Finish launch, Delete launch, Update project, Update analyzer, Post issue, Link issue, Unlink issue, Generate index, Delete index, Start import, Finish import, Update item, AA linked issue, AA changed defect type, Create pattern rule, Update pattern rule, Delete pattern rule, PA find pattern.

Object Type

This refers to the object on which the action was taken.

Event objects: Launch, Dashboard, Custom defect type, Notification rule, Filter, Import, Integration, Test item, Project, Ticket, User, Widget, Pattern Rule, index, Plugin.

Object Name

This is the name of the widget, launch, etc.

The Old Value and New Value columns display the changes that were made.

You can filter activities by user, action, object type, and object name.

Another way to view the event list in your project is by creating a "Project Activity Panel" widget.

Instance level event monitoring

Instance level events are not displayed in the UI – they are stored in the database.

Instance level events: Account deletion, Bulk account deletion, Administrator unassign, Provide Administrator permission for a user, Project creation, Bulk delete project by ReportPortal administrator, Delete project by ReportPortal administrator, Delete project by ReportPortal administrator, Delete Personal project when deleting user, Create Global Integration, Update Global Integration, Delete Global Integration, Bulk delete of Global Integration via API only, Manual plugin upload, Delete Plugin, Update Plugin (disable/enable), Create user in Administrate, Create user via auth service SAML.

Additionally, during instance setup, you can enable event storage in an audit log file. This data can be sent to a Security Information and Event Management (SIEM) system using tools like Fluentd, Fluentbit, or Filebeat. Logs and events are then checked and monitored within the SIEM system.

The primary advantage of the audit log file is that it preserves all records without alterations or deletions. In contrast, data in the database can be modified or deleted. For example, if launches or projects are deleted, the corresponding data is removed from the database. Deleting accounts leads to data obfuscation in the database.

Hence, if historical monitoring and strict accountability are required, enabling event storage in an audit log file is recommended. Financial companies, for example, are often mandated to retain all user actions in their services for 3 years.

note

Administrators should ensure that log rotation is configured for the location where the audit log will be saved, as a substantial amount of data will accumulate.

Event monitoring assists organizations, especially in industries like finance and healthcare, in maintaining the security of their systems and data.

- - +

Event monitoring

Starting from version 23.2, ReportPortal can monitor all activities (events) at both the project and instance levels.

Project level event monitoring

To view the list of all activities within your project, open the menu at the bottom of the page as an Administrator and select the "Administrate" option. All existing projects are listed on the "All Projects" page. Click on the ellipsis button next to the project and choose the "Monitoring" option from the dropdown.

Here, you will find a table with the following columns: Time, User, Action, Object Type, Object Name, Old Value, and New Value.

Time

This column displays the time in a "time ago" format (e.g., "10 minutes ago"). Hovering over it, the system should show the precise action time.

User

This column shows who acted. We track not only actions by specific users but also, for your convenience, actions performed by ReportPortal itself or certain ReportPortal services. For example, actions by Jobs Service (such as Launch deletions) are included.

If the activity was on behalf of a user, and their account was deleted, then there will be a "deleted user" entry in the "User" column.

Action

This column displays all events within this project.

Event actions: Create dashboard, Update dashboard, Delete dashboard, Create widget, Update widget, Delete widget, Create filter, Update filter, Delete filter, Create custom defect type, Update defect, Delete defect, Create integration, Update integration, Delete integration, Start launch, Finish launch, Delete launch, Update project, Update analyzer, Post issue, Link issue, Unlink issue, Generate index, Delete index, Start import, Finish import, Update item, AA linked issue, AA changed defect type, Create pattern rule, Update pattern rule, Delete pattern rule, PA find pattern.

Object Type

This refers to the object on which the action was taken.

Event objects: Launch, Dashboard, Custom defect type, Notification rule, Filter, Import, Integration, Test item, Project, Ticket, User, Widget, Pattern Rule, index, Plugin.

Object Name

This is the name of the widget, launch, etc.

The Old Value and New Value columns display the changes that were made.

You can filter activities by user, action, object type, and object name.

Another way to view the event list in your project is by creating a "Project Activity Panel" widget.

Instance level event monitoring

Instance level events are not displayed in the UI – they are stored in the database.

Instance level events: Account deletion, Bulk account deletion, Administrator unassign, Provide Administrator permission for a user, Project creation, Bulk delete project by ReportPortal administrator, Delete project by ReportPortal administrator, Delete project by ReportPortal administrator, Delete Personal project when deleting user, Create Global Integration, Update Global Integration, Delete Global Integration, Bulk delete of Global Integration via API only, Manual plugin upload, Delete Plugin, Update Plugin (disable/enable), Create user in Administrate, Create user via auth service SAML.

Additionally, during instance setup, you can enable event storage in an audit log file. This data can be sent to a Security Information and Event Management (SIEM) system using tools like Fluentd, Fluentbit, or Filebeat. Logs and events are then checked and monitored within the SIEM system.

The primary advantage of the audit log file is that it preserves all records without alterations or deletions. In contrast, data in the database can be modified or deleted. For example, if launches or projects are deleted, the corresponding data is removed from the database. Deleting accounts leads to data obfuscation in the database.

Hence, if historical monitoring and strict accountability are required, enabling event storage in an audit log file is recommended. Financial companies, for example, are often mandated to retain all user actions in their services for 3 years.

note

Administrators should ensure that log rotation is configured for the location where the audit log will be saved, as a substantial amount of data will accumulate.

Event monitoring assists organizations, especially in industries like finance and healthcare, in maintaining the security of their systems and data.

+ + \ No newline at end of file diff --git a/analysis/AutoAnalysisOfLaunches/index.html b/analysis/AutoAnalysisOfLaunches/index.html index 35876c19c..23c01e1e1 100644 --- a/analysis/AutoAnalysisOfLaunches/index.html +++ b/analysis/AutoAnalysisOfLaunches/index.html @@ -12,18 +12,18 @@ - - + +
-

Auto-Analysis of launches

The analysis feature of the ReportPortal makes it possible for the application to check and pass part of the routine duties by itself.

Auto-analysis performs automated defect triaging and defines the reason for the test item failure and sets:

  • a defect type;
  • a link to BTS (in case if it exists);
  • comment (in case if it exists);

The process of Auto-Analysis is based on previous user-investigated users' results using Machine Learning.

An auto-analyzer is presented by a combination of several services: ElasticSearch, Analyzer service(two instances Analyzer and Analyzer train), Metrics gatherer:

  • Elasticsearch contains an analytical base, stores training data for retraining of models and saves metrics for metrics gatherer.
  • Analyzer instance performs all operations, connected with the basic functionality (indexing/removing logs, searching logs, auto-analysis, ML suggestions).
  • Analyzer train instance is responsible for training models for Auto-analysis and ML suggestions functionality.
  • Metrics gatherer calculates metrics about the analyzer usage and requests deletion of custom models if metrics goes down.

There are several ways to use an analyzer in our test automation reporting dashboard:

  • Use the ReportPortal Analyzer: manual (analysis is switched on only for chosen launch manually) or auto (analysis is switched on after the launch finishing automatically);

  • Implement and configure your custom Analyzer and do not deploy ReportPortal service Analyzer;

  • Do not use any Analyzers at all and do an analytical routine by yourself;

ReportPortal Analyzer. How to install

  • Add info about Service Analyzer and service ElasticSearch in the docker-compose file;

  • Set {vm.max_map_count} kernel setting before ReportPortal deploying with command>;

  • Give right permissions to ElasticSearch data folder using the following command:

mkdir data/elasticsearch
chmod g+rwx data/elasticsearch
chgrp 1000 data/elasticsearch

For more details about ElasticSearch visit ElasticSearch guide;

ReportPortal Analyzer. How the Auto-Analysis is working

ReportPortal's auto-analyzer allows users to reduce the time spent on test execution investigation by analyzing test failures in automatic mode. For that reason, you can deploy the ReportPortal with a service Analyzer by adding info about this service in a docker-compose file. The default analysis component is running along with ElasticSearch which is used for test logs indexing. +

Auto-Analysis of launches

The analysis feature of the ReportPortal makes it possible for the application to check and pass part of the routine duties by itself.

Auto-analysis performs automated defect triaging and defines the reason for the test item failure and sets:

  • a defect type;
  • a link to BTS (in case if it exists);
  • comment (in case if it exists);

The process of Auto-Analysis is based on previous user-investigated users' results using Machine Learning.

An auto-analyzer is presented by a combination of several services: ElasticSearch, Analyzer service(two instances Analyzer and Analyzer train), Metrics gatherer:

  • Elasticsearch contains an analytical base, stores training data for retraining of models and saves metrics for metrics gatherer.
  • Analyzer instance performs all operations, connected with the basic functionality (indexing/removing logs, searching logs, auto-analysis, ML suggestions).
  • Analyzer train instance is responsible for training models for Auto-analysis and ML suggestions functionality.
  • Metrics gatherer calculates metrics about the analyzer usage and requests deletion of custom models if metrics goes down.

There are several ways to use an analyzer in our test automation reporting dashboard:

  • Use the ReportPortal Analyzer: manual (analysis is switched on only for chosen launch manually) or auto (analysis is switched on after the launch finishing automatically);

  • Implement and configure your custom Analyzer and do not deploy ReportPortal service Analyzer;

  • Do not use any Analyzers at all and do an analytical routine by yourself;

ReportPortal Analyzer. How to install

  • Add info about Service Analyzer and service ElasticSearch in the docker-compose file;

  • Set {vm.max_map_count} kernel setting before ReportPortal deploying with command>;

  • Give right permissions to ElasticSearch data folder using the following command:

mkdir data/elasticsearch
chmod g+rwx data/elasticsearch
chgrp 1000 data/elasticsearch

For more details about ElasticSearch visit ElasticSearch guide;

ReportPortal Analyzer. How the Auto-Analysis is working

ReportPortal's auto-analyzer allows users to reduce the time spent on test execution investigation by analyzing test failures in automatic mode. For that reason, you can deploy the ReportPortal with a service Analyzer by adding info about this service in a docker-compose file. The default analysis component is running along with ElasticSearch which is used for test logs indexing. For effective using Auto–Analysis you should come through several stages.

Create an analytical base in the ElasticSearch

First of all, you need to create an analytical base. For that, you should start to analyze test results manually.

All test items with a defect type which have been analyzed manually or automatically by ReportPortal are sent to the Elastic Search.

The following info is sent:

  • An item ID;
  • Logs (each log should be with level Error and higher (log level >= 40 000));
  • Issue type;
  • Flag: “Analyzed by” (where shows by whom the test item has been analyzed by a user or by ReportPortal);
  • A launch name;
  • Launch ID;
  • Unique ID;
  • Test case ID;

For the better analysis, we merge small logs (which consist of 1-2 log lines and words number <= 100) together. We store this merged log message as a separate document if there are no other big logs (consisting of more than 2 log lines or having a stacktrace) in the test item. We store this merged log message in a separate field "merged_small_logs" for all the big logs if there are ones.

The Analyzer preprocesses log messages from the request for test failure analysis: extracts error message, stacktrace, numbers, exceptions, urls, paths, parameters and other parts from text to search for the most similar items by these parts in the analytical base. These parts are saved in a separate fields for each log entry.

Each log entry along with its defect type is saved to ElasticSearch in the form of a separate document. All documents created compose an Index. The more test results index has, the more accurate results will be generated by the end of the analysis process.

tip

If you do not sure how many documents(logs) are contained in the Index at that moment, you can check it. For that, perform the following actions:

  • Uncommented Service ElasticSearch ports in a docker-compose file or add them: 9200:9200;
  • Restart-Service ElasticSearch with new docker-compose;
  • Send a request to ElasticSearch:
    • how many documents in the Index: GET http://localhost:9200/_cat/indices?v
    • Detailed information: POST http://localhost:9200/{project_name}/_search

Test items of a launch in Debug mode are not sent to the service Analyzer. If the test item is deleted or moved to the Debug mode, it is removed from the Index.

Auto-Analysis process

After your Index has been completed. You can start to use the auto-analysis feature.

Analysis can be launched automatically (via Project Settings) or manually (via the menu on All launches view). After the process is started, all items with defect type “To investigate” with logs (log level >= 40 000) from the analyzed launch are picked and sent to the Analyzer Service and the service ElasticSearch for investigations.

How Elasticsearch returns candidates for Analysis

Here is a simplified procedure of the Auto-analysis candidates searching via ElasticSearch.

When a "To investigate" test item appears we search for the most similar test items in the analytical base. We create a query which searches by several fields, message similarity is a compulsory condition, other conditions boost the better results and they will have a higher score (boost conditions are similarity by unique id, launch name, error message, found exceptions, numbers in the logs and etc.).

Then ElasticSearch receives a log message and divides it into the terms (words) with a tokenizer and calculates the importance of each term (word). For that ElasticSearch computes TF-IDF for each term (word) in the analyzed log. If the level of term importance is low, the ElasticSearch ignores it.

note

Term frequency (TF) – how many time term (word) is used in an analyzed log;

Document frequency (DF) – in how many documents this term (word) is used in Index;

TF-IDF (TF — term frequency, IDF — inverse document frequency) — a statistical measure used to assess the importance of a term (word) in the context of a log that is part of an Index. The weight of a term (word) is proportional to the amount of use of this term (word) in the analyzed log and inversely proportional to the frequency of term (word) usage in Index.

The term (word) with the highest level of importance is the term (word) that is used very frequently in analyzed log and moderately in the Index.

After all important terms are defined, Elastic search calculates the level of equality between an analyzed log and each log in the Index. For each log from the Index is calculated a score.

note

How calculated a score:

score(q,d) =

     coord(q,d) -
SUM (
tf(t in d),
idf(t)²,
t.getBoost(),
) (t in q)

Where:

  • score(q,d) is the relevance score of log “d” for query “q”.
  • coord(q,d) is the coordination factor: the percent of words equality between analyzed log and particular log from the ElasticSearch.
  • The sum of the weights for each word “t” in the query “q” for log “d”.
  • tf(t in d) is a frequency of the word in the analyzed log.
  • idf(t) is the inverse frequency of the word in all saved logs in the Index.
  • t.getBoost() is the boost that has been applied to the query. The higher priority for logs with:
    • The same Launch name;
    • The same UID;
    • Manual analysis;
    • Error message;
    • The same numbers in the log;
    • and etc.

The results are sorted by the score, in case the scores are the same, they are sorted by "start_time" field, which helps to boost the test items with closer to today dates. So the latest defect types will be higher in the returned by Elasticsearch results.

The ElasticSearch returns to the service Analyzer 10 logs with the highest score for each log. Analyzer regroups all the results by a defect type and chooses the best representative for each defect type group, based on their scores.

note

In the case the test item has several logs, the best representative for a defect type group will become the log with the highest score among all logs.

How Auto-analysis makes decisions for candidates, returned by Elasticsearch

The ElasticSearch returns to the service Analyzer 10 logs with the highest score for each query and all these candidates will be processed further by the ML model. Analyzer regroups all the results by a defect type and chooses the best representative for each defect type group, based on their scores.

The ML model is an XGBoost model which features (about 30 features) represent different statistics about the test item, log message texts, launch info and etc, for example:

  • the percent of selected test items with the following defect type
  • max/min/mean scores for the following defect type
  • cosine similarity between vectors, representing error message/stacktrace/the whole message/urls/paths and other text fields
  • whether it has the same unique id, from the same launch
  • the probability for being of a specific defect type given by the Random Forest Classifier trained on Tf-Idf vectors

The model gives a probability for each defect type group, and we choose the defect type group with the highest probability and the probability should be >= 50%.

A defect comment and a link to BTS of the best representative from this group come to the analyzed item.

The Auto-analysis model is retrained for the project and this information can be found in the section "How models are retrained" below.

So this is how Auto-Analysis works and defines the most relevant defect type on the base of the previous investigations. We give an ability to our users to configure auto-analysis manually.

Auto-analysis Settings

All settings and configurations of Analyzer and ElasticSearch are situated on a separate tab on Project settings.

  1. Login into ReportPortal instance as Administrator or project member with PROJECT MANAGER role on the project;

  2. Come on Project Settings, choose Auto-Analysis section;

In this section user can perform the following actions:

  1. Switch ON/OFF auto-analysis;

  2. Choose a base for analysis (All launches/ Launches with the same name);

  3. Configure ElasticSearch settings;

  4. Remove/Generate ElasticSearch index.

Switch ON/OFF automatic analysis;

To activate the "Auto-Analysis" functionality in a project, perform the following steps:

  1. Login ReportPortal instance as Administrator or project member with PROJECT MANAGER role on the project.

  2. Select ON in the "Auto-Analysis" selector on the Project settings / Auto-analysis section.

  3. Click the "Submit" button. Now "Auto-Analysis" will start as soon as any launch finishes.

Base for analysis (All launches/ Launches with the same name);

You can choose which results from previous runs should be considered in Auto –Analysis for defining the failure reason.

There two options:

  • All launches;

  • Launches with the same name;

If you choose “All launches”, test results in the launch will have analyzed on the base of all data in Elastic search of the project.

If you choose “Launches with the same name”, test results in the launch will have analyzed on the base of all data in Elastic search that have the same Launch name.

You can choose those configurations via Project configuration or from the list of actions on All launches view.

Configure ElasticSearch settings

Also, we give the possibility for our users to configure 2 main parameters of ElasticSearch manually:

  • MinShouldMatch - percent of words equality between analyzed log and particular log from the ElasticSearch. If a log from ElasticSearch has the value less then set, this log will be ignored for AA. Min value 50, max value 100.
  • Number of log lines - the number of first lines of log message that should be considered in ElasticSearch. Only the chosen number of logline will be saved in ElasticSearch. Possible values: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, All. In case you choose “ALL”, the full text of log will be saved in ElasticSearch Index.

Parameter MinShouldMatch is involved in the calculation of a score. It is a minimum value for coord(q,d) (the percent of words equality between an analyzed log and a particular log from the ElasticSearch). So you can increase search hardness and choose a minimum level of similarity that is required.

With the parameter Number of log lines - you can write the root cause of test failure in the first lines and configure the analyzer to take into account only the required lines.

With these 2 parameters, you can configure the accuracy of the analysis that you need. For your facilities we have prepared 3 pre-sets with values:

  • Light - search conditions are freer. You will get more results, but with the less level of similarity;
  • Moderate - "happy medium";
  • Classic - search conditions are strict. You will get fewer results, but with a higher level of similarity;

Remove/Generate ElasticSearch index

There two possible actions that can be performed under Index in ElasticSearch.

You can remove the Index from ElasticSearch and all logs with there defect type will be deleted. ML will be set to zero. All data with your investigations will be deleted from the ElasticSearch. For creating a new one you could start to investigate test results manually or generate data based on previous results on the project once again.

note

Your investigations in ReportPortal will not be changed. The operation concerns only ElasticSearch base.

Another option, you can generate the Index in ElasticSearch. In the case of generation, all data will be removed from ElasticSearch and the new one will be generated based on all previous investigations on the project following current analysis settings.

At the end of the process, you will receive a letter with info about the end of the process and with several items that will be appeared in ElasticSearch.

You can use index generation for several goals. For example, assume two hypothetical situations when index generation can be used:

  • by accident you remove the index, but now you want to restore it.
note

The new base will be generated following logs and settings that are existing on the moment of operating. So index before removing and index after generation can be different.

  • you have changed a parameter Number of log lines for 3. But your existing index contains logs with value ALL. You can generate a new index, the old index will be removed, and a new one will be generated. Logs in the new index will contain 3 lines;

We strongly do not recommend use auto-analysis until the new index will be generated.

Manual analysis

Analysis can be launched manually. To start the analysis manually, perform the following steps:

  1. Navigate to the "Launches" page.

  2. Select the "Analysis" option from the context menu next to the selected launch name.

  3. Choose the scope of previous results on the base of which test items should be auto-analyzed. The default is the one that is chosen on the setting page, but you can change it manually.

Via this menu you can choose 3 options unlike on Project Settings:

  • All launches;

  • Launches with the same name;

  • Only current launch;

Options All launches and Launches with the same name are working the same as on project settings. If you choose Only current launch, the system is analyzing the test items of chosen launch only on a base of already investigated date of this launch.

  1. Choose which items from launch should be analyzed:
  • Only To investigated;
  • Items analyzed automatically (by AA);
  • Items analyzed manually;

In case the user chooses Only To investigate items - the system is analyzing only items with defect type "To investigate" in the chosen launch;

In case the user chooses Items analyzed automatically (by AA) - the system is analyzing only items that have been already analyzed by auto-analysis. The results of the previous run of analysis will be set to zero and items will be analyzed once again.

In case the user chooses Items analyzed manually - the system is analyzing only items that have been already analyzed by the user manually. The results of the previous run of analysis will be set to zero and items will be analyzed once again.

In the case of multi-combination - the system is analyzing results dependence on chosen options.

note

The Ignore flag is saved. If the item has flag Ignore in AA, it will not be re-analyzed.

tip

For option Only current lunch you can not choose Items analyzed automatically (by AA) and Items analyzed manually simultaneously.

  1. Click the "Analysis" button. Now "Auto-Analysis" will start.

Any launches with an active analyzing process will be marked with the "Analysis" label.

Label AA

When the test item is analyzed by the ReportPortal, a label "AA" is set on the test item on a Step Level. You can filter results with a parameter “Analysed by RP (AA)”

Ignore in Auto-Analysis

If you don't want to save some test items in ElasticSearch, you can "Ignore in Auto-Analysis". For that you can choose this action in “Make decision” modal:

Or from the action list for several test items:

When you choose “Ignore in AA”, logs of the chosen item are removed from the ElasticSearch.

- - + + \ No newline at end of file diff --git a/analysis/HowModelsAreRetrained/index.html b/analysis/HowModelsAreRetrained/index.html index c9e75ecf8..49d73c7e0 100644 --- a/analysis/HowModelsAreRetrained/index.html +++ b/analysis/HowModelsAreRetrained/index.html @@ -12,15 +12,15 @@ - - + +
-

How models are retrained

In the Auto-analysis and ML suggestions processes several models take part:

  • Auto-analysis XGBoost model, which gives the probability for a test item to be of a specific type based on the most similar test item in the history with this defect type
  • ML suggestions XGBoost model, which gives the probability for a test item to be similar to the test item from the history
  • Error message language model on Tf-Idf vectors(Random Forest Classifier), which gives a probability for the error message to be of a specific defect type or its subtype based on the words in the message. The probability from this model is taken as a feature in the main boosting algorithm.

At the start of the project, you have global models. They were trained on 6 projects and were validated to give a good accuracy on average. To have a more powerful and personalized test failure analysis, the models should be retrained on the data from the project.

note

If a global model performs better on your data, the retrained model won't be saved. As far as we save a custom model only if it performs better for your data than the global one.

Triggering information and retrained models are saved in Minio(or a filesystem) as you set up in the Analyzer service settings.

Retraining triggering conditions for Error message Random Forest Classifier:

  • Each time the test item defect type is changed to another issue type(except "To Investigate"), we update the triggering info, which saves the quantity of test items with defect types and the quantity of test items with defect types since the last training. This information is saved in the file "defect_type_trigger_info" in Minio.
  • When we have more than 100 labelled items, and since last training we have 100 labelled test items, retraining is triggered and if validation data metrics are better than metrics for a global model for the same data points, then we save a custom "defect_type" model in Minio and use it further in the auto-analysis and suggestions functionality.

Retraining triggering conditions for Auto-analysis and Suggestion XGBoost models:

  • We gather training data for training from several sources:
    • when you choose one of the suggestions(the chosen test item will be a positive example, others will be negative ones)
    • when you don't choose any suggestion and edit the test item somehow(set up a defect type manually, add a comment, etc.), all suggestions become negative examples;
    • when auto-analysis runs and for a test item it finds a similar test item, we consider it a positive example, until the user changes the defect type for it manually. In this case, the result will be marked as a negative one.
  • Each time a suggestion analysis runs or changing a defect type happens, we update the triggering info for both models. This information is saved in the files "auto_analysis_trigger_info" and "suggestion_tgrigger_info" in Minio.
  • When we have more than 300 labelled items, and since last training we have 100 labelled test items, retraining is triggered and if validation data metrics are better than metrics for a global model for the same data points, then we save a custom "auto_anlysis" model in Minio and use it further in the auto-analysis functionality.
  • When we have more than 100 labelled items, and since last training we have 50 labelled test items, retraining is triggered and if validation data metrics are better than metrics for a global model for the same data points, then we save a custom "suggestion" model in Minio and use it further in the suggestions functionality.
- - +

How models are retrained

In the Auto-analysis and ML suggestions processes several models take part:

  • Auto-analysis XGBoost model, which gives the probability for a test item to be of a specific type based on the most similar test item in the history with this defect type
  • ML suggestions XGBoost model, which gives the probability for a test item to be similar to the test item from the history
  • Error message language model on Tf-Idf vectors(Random Forest Classifier), which gives a probability for the error message to be of a specific defect type or its subtype based on the words in the message. The probability from this model is taken as a feature in the main boosting algorithm.

At the start of the project, you have global models. They were trained on 6 projects and were validated to give a good accuracy on average. To have a more powerful and personalized test failure analysis, the models should be retrained on the data from the project.

note

If a global model performs better on your data, the retrained model won't be saved. As far as we save a custom model only if it performs better for your data than the global one.

Triggering information and retrained models are saved in Minio(or a filesystem) as you set up in the Analyzer service settings.

Retraining triggering conditions for Error message Random Forest Classifier:

  • Each time the test item defect type is changed to another issue type(except "To Investigate"), we update the triggering info, which saves the quantity of test items with defect types and the quantity of test items with defect types since the last training. This information is saved in the file "defect_type_trigger_info" in Minio.
  • When we have more than 100 labelled items, and since last training we have 100 labelled test items, retraining is triggered and if validation data metrics are better than metrics for a global model for the same data points, then we save a custom "defect_type" model in Minio and use it further in the auto-analysis and suggestions functionality.

Retraining triggering conditions for Auto-analysis and Suggestion XGBoost models:

  • We gather training data for training from several sources:
    • when you choose one of the suggestions(the chosen test item will be a positive example, others will be negative ones)
    • when you don't choose any suggestion and edit the test item somehow(set up a defect type manually, add a comment, etc.), all suggestions become negative examples;
    • when auto-analysis runs and for a test item it finds a similar test item, we consider it a positive example, until the user changes the defect type for it manually. In this case, the result will be marked as a negative one.
  • Each time a suggestion analysis runs or changing a defect type happens, we update the triggering info for both models. This information is saved in the files "auto_analysis_trigger_info" and "suggestion_tgrigger_info" in Minio.
  • When we have more than 300 labelled items, and since last training we have 100 labelled test items, retraining is triggered and if validation data metrics are better than metrics for a global model for the same data points, then we save a custom "auto_anlysis" model in Minio and use it further in the auto-analysis functionality.
  • When we have more than 100 labelled items, and since last training we have 50 labelled test items, retraining is triggered and if validation data metrics are better than metrics for a global model for the same data points, then we save a custom "suggestion" model in Minio and use it further in the suggestions functionality.
+ + \ No newline at end of file diff --git a/analysis/MLSuggestions/index.html b/analysis/MLSuggestions/index.html index f211c965e..969786c25 100644 --- a/analysis/MLSuggestions/index.html +++ b/analysis/MLSuggestions/index.html @@ -12,15 +12,15 @@ - - + +
-

ML Suggestions

ML suggestions functionality is based on previously analyzed results (either manually or via Auto-analysis feature) using Machine Learning. The functionality is provided by the Analyzer service in combination with ElasticSearch.

This analysis hints what are the most similar analyzed items to the current test item. You can interact with this functionality in several ways:

  • Choose one of the suggested items if you see that the reason for the current test item is similar to the suggested one. When you choose the item and apply changes to the current item, the following test item characteristics will be copied from the chosen test item:

    • a defect type;
    • a link to BTS (in case if it exists);
    • comment (in case if it exists);
  • If you see no suitable suggested test item for the current test item, just do not select any of them.

How the ML suggestions functionality is working

ML Suggestions searches for similar previously analyzed items to the current test item, so it requires an analytical base saved in Elasticsearch. ML suggestions takes into account all user-investigated, auto-analyzed items or items chosen from ML suggestions. While the analytical base is growing ML suggestions functionality will have more examples to search by and suggest you the best options.

ML suggestions analysis is run everytime you enter "Make decision" editor. ML suggestions are run for all test items no matter what defect type they have now. This functionality is processing only test items with logs (log level >= 40000).

The request for the suggestions part looks like this:

  • testItemId;
  • uniqueId;
  • testCaseHash;
  • launchId;
  • launchName;
  • project;
  • analyzerConfig;
  • logs = List of log objects (logId, logLevel, message)

The Analyzer preprocesses log messages from the request for analysis: extracts error message, stacktrace, numbers, exceptions, urls, paths, parameters and other parts from text to search for the most similar items by these parts in the analytical base. We make several requests to the Elasticsearch to find similar test items by all the error logs.

note

When a test item has several error logs, we will use the log with the highest score as a representative of this test item.

The ElasticSearch returns to the service Analyzer 10 logs with the highest score for each query and all these candidates will be processed further by the ML model. The ML model is an XGBoost model which features (about 40 features) represent different statistics about the test item, log message texts, launch info and etc, for example:

  • the percent of selected test items with the following defect type
  • max/min/mean scores for the following defect type
  • cosine similarity between vectors, representing error message/stacktrace/the whole message/urls/paths and other text fields
  • whether it has the same unique id, from the same launch
  • the probability for being of a specific defect type given by the Random Forest Classifier trained on Tf-Idf vectors

The model gives a probability for each candidate, we filter out test items with the probability <= 40%. We sort the test items by this probability, after that we deduplicate test items inside this ranked list. If two test items are similar with >= 98% by their messages, then we will leave the test item with the highest probability. After deduplication we take maximimum 5 items with the highest score to show in the ML Suggestions section.

ML suggestions section contains at maximum 5 suggested items, they are shown together with the scores given by the model and we divide them into 3 groups:

  • the group "SAME", test items with the score = 100%
  • the group "HIGH", test items with the score in the range [70% - 99.9%]
  • the group "LOW", test items with the score in the range [40% - 69.9%]
- - +

ML Suggestions

ML suggestions functionality is based on previously analyzed results (either manually or via Auto-analysis feature) using Machine Learning. The functionality is provided by the Analyzer service in combination with ElasticSearch.

This analysis hints what are the most similar analyzed items to the current test item. You can interact with this functionality in several ways:

  • Choose one of the suggested items if you see that the reason for the current test item is similar to the suggested one. When you choose the item and apply changes to the current item, the following test item characteristics will be copied from the chosen test item:

    • a defect type;
    • a link to BTS (in case if it exists);
    • comment (in case if it exists);
  • If you see no suitable suggested test item for the current test item, just do not select any of them.

How the ML suggestions functionality is working

ML Suggestions searches for similar previously analyzed items to the current test item, so it requires an analytical base saved in Elasticsearch. ML suggestions takes into account all user-investigated, auto-analyzed items or items chosen from ML suggestions. While the analytical base is growing ML suggestions functionality will have more examples to search by and suggest you the best options.

ML suggestions analysis is run everytime you enter "Make decision" editor. ML suggestions are run for all test items no matter what defect type they have now. This functionality is processing only test items with logs (log level >= 40000).

The request for the suggestions part looks like this:

  • testItemId;
  • uniqueId;
  • testCaseHash;
  • launchId;
  • launchName;
  • project;
  • analyzerConfig;
  • logs = List of log objects (logId, logLevel, message)

The Analyzer preprocesses log messages from the request for analysis: extracts error message, stacktrace, numbers, exceptions, urls, paths, parameters and other parts from text to search for the most similar items by these parts in the analytical base. We make several requests to the Elasticsearch to find similar test items by all the error logs.

note

When a test item has several error logs, we will use the log with the highest score as a representative of this test item.

The ElasticSearch returns to the service Analyzer 10 logs with the highest score for each query and all these candidates will be processed further by the ML model. The ML model is an XGBoost model which features (about 40 features) represent different statistics about the test item, log message texts, launch info and etc, for example:

  • the percent of selected test items with the following defect type
  • max/min/mean scores for the following defect type
  • cosine similarity between vectors, representing error message/stacktrace/the whole message/urls/paths and other text fields
  • whether it has the same unique id, from the same launch
  • the probability for being of a specific defect type given by the Random Forest Classifier trained on Tf-Idf vectors

The model gives a probability for each candidate, we filter out test items with the probability <= 40%. We sort the test items by this probability, after that we deduplicate test items inside this ranked list. If two test items are similar with >= 98% by their messages, then we will leave the test item with the highest probability. After deduplication we take maximimum 5 items with the highest score to show in the ML Suggestions section.

ML suggestions section contains at maximum 5 suggested items, they are shown together with the scores given by the model and we divide them into 3 groups:

  • the group "SAME", test items with the score = 100%
  • the group "HIGH", test items with the score in the range [70% - 99.9%]
  • the group "LOW", test items with the score in the range [40% - 69.9%]
+ + \ No newline at end of file diff --git a/analysis/ManualAnalysis/index.html b/analysis/ManualAnalysis/index.html index 58b41f3f8..090058402 100644 --- a/analysis/ManualAnalysis/index.html +++ b/analysis/ManualAnalysis/index.html @@ -12,15 +12,15 @@ - - + +
-

Manual Analysis

Manual Analysis is presented on our test report dashboard by “Make decision” modal.

“Make decision” modal redesign

Redesign of the “Make decision” modal was implemented in version 5.7. This feature helps to sort out auto tests and decide: What is the problem? How can it be marked? Is it required to post issue or link issue? It became easier to use this functionality after the redesign.

The “Make decision” modal can be opened in three ways:

1) from the Step level

2) via Actions

3) from the Log level

“Execution to change” section

“Execution to change” section is displayed at the top left of the “Make decision” modal. It includes Step name, current defect type. Also it can have a log, a comment, a link to a Bug Tracking System (BTS), a label (AA, PA, Ignore AA) if exist. You can expand logs to understand why this step was failed.

How to set a defect type and type a comment

“Select defect” section is displayed at the top right of the “Make decision” modal. It includes “Manual selection”, “Analyzer suggestions”, “History of the test”.

You can select a defect type and type a comment manually. Selected defect type and added comment will be applied to the current item (there is also a possibility to apply them to other items – please, have a look at “Apply for” section).

How to use “Analyzer suggestions”

You also can select any step from the “Analyzer suggestions” with a similar log. Similar log is marked with a red asterisk. Then the defect type, the comment and linked BTS ticket (if exist) of the suggested step will be applied to the current item (there is also a possibility to apply them to other items – please, have a look at “Apply for” section).

“History of the test” section

You can see the “History of the test” – which defect type this step had in previous runs. You can select any item from the “History of the test”. Then the defect type, the comment and linked BTS ticket (if exist) of the suggested step will be applied to the current item (there is also a possibility to apply them to other items – please, have a look at “Apply for” section).

How to select other steps for analysis

The “Make decision” modal works not only with the current step. This feature allows to select other steps with “To Investigate” defect type which can be changed as well. For that, please, expand the “Apply for” section and select the needed option.

The “Results will be applied for” message is displayed at the bottom after selection. This section was added in version 5.7.

Now you can view all changes before applying. Expand the “Results will be applied for” section to see information about changes. You should click “Apply” button to apply selected changes.

Bulk update

There is also a possibility for Bulk update, when the changes are applied to all selected test items.

As you can see, “Make decision” modal is a time-saving tool for engineers.

- - +

Manual Analysis

Manual Analysis is presented on our test report dashboard by “Make decision” modal.

“Make decision” modal redesign

Redesign of the “Make decision” modal was implemented in version 5.7. This feature helps to sort out auto tests and decide: What is the problem? How can it be marked? Is it required to post issue or link issue? It became easier to use this functionality after the redesign.

The “Make decision” modal can be opened in three ways:

1) from the Step level

2) via Actions

3) from the Log level

“Execution to change” section

“Execution to change” section is displayed at the top left of the “Make decision” modal. It includes Step name, current defect type. Also it can have a log, a comment, a link to a Bug Tracking System (BTS), a label (AA, PA, Ignore AA) if exist. You can expand logs to understand why this step was failed.

How to set a defect type and type a comment

“Select defect” section is displayed at the top right of the “Make decision” modal. It includes “Manual selection”, “Analyzer suggestions”, “History of the test”.

You can select a defect type and type a comment manually. Selected defect type and added comment will be applied to the current item (there is also a possibility to apply them to other items – please, have a look at “Apply for” section).

How to use “Analyzer suggestions”

You also can select any step from the “Analyzer suggestions” with a similar log. Similar log is marked with a red asterisk. Then the defect type, the comment and linked BTS ticket (if exist) of the suggested step will be applied to the current item (there is also a possibility to apply them to other items – please, have a look at “Apply for” section).

“History of the test” section

You can see the “History of the test” – which defect type this step had in previous runs. You can select any item from the “History of the test”. Then the defect type, the comment and linked BTS ticket (if exist) of the suggested step will be applied to the current item (there is also a possibility to apply them to other items – please, have a look at “Apply for” section).

How to select other steps for analysis

The “Make decision” modal works not only with the current step. This feature allows to select other steps with “To Investigate” defect type which can be changed as well. For that, please, expand the “Apply for” section and select the needed option.

The “Results will be applied for” message is displayed at the bottom after selection. This section was added in version 5.7.

Now you can view all changes before applying. Expand the “Results will be applied for” section to see information about changes. You should click “Apply” button to apply selected changes.

Bulk update

There is also a possibility for Bulk update, when the changes are applied to all selected test items.

As you can see, “Make decision” modal is a time-saving tool for engineers.

+ + \ No newline at end of file diff --git a/analysis/PatternAnalysis/index.html b/analysis/PatternAnalysis/index.html index 4a243befd..82f76d63f 100644 --- a/analysis/PatternAnalysis/index.html +++ b/analysis/PatternAnalysis/index.html @@ -12,21 +12,21 @@ - - + +
-

Pattern Analysis

Pattern analysis is a feature that helps you to speed up test failure analysis by finding common patterns in error logs.

Types of Pattern Analysis

String – any problem phrase.

Regex – regular expression.

Use case 1:

Problem: A user knows the several common problems why test cases fail. During tests run a lot of test have failed. A user need to check logs a of tests to know by what reason test cases have failed.

Solution: Create a pattern rules for all common reasons which contains a problem phrase (for example: "Expected status code <404> but > was <500>" or "Null response") or with Regex query. Switch On a pattern analysis. +

Pattern Analysis

Pattern analysis is a feature that helps you to speed up test failure analysis by finding common patterns in error logs.

Types of Pattern Analysis

String – any problem phrase.

Regex – regular expression.

Use case 1:

Problem: A user knows the several common problems why test cases fail. During tests run a lot of test have failed. A user need to check logs a of tests to know by what reason test cases have failed.

Solution: Create a pattern rules for all common reasons which contains a problem phrase (for example: "Expected status code <404> but > was <500>" or "Null response") or with Regex query. Switch On a pattern analysis. Launch a test run. So that the ReportPortal systems finds all failed items which have known patterns in error logs and marks them with a label with pattern name. Find all items failed by the same reason by choosing a filter by Pattern Name on the Step view. Add The most popular pattern widget (TOP-20) and track the TOP-20 the most popular reason of test failing in the build.

Use case 2:

Problem: Test run has finished. A user found that more than 3 items have failed by the same reason. And he want to find all such items.

Solution: Create a new pattern rule on Project Settings. Launch a pattern analysis manually for one launch. name. Find all items failed by the same reason by choosing a filter by Pattern Name on the Step view.

- - + + \ No newline at end of file diff --git a/analysis/SearchForTheSimilarToInvestigateItems/index.html b/analysis/SearchForTheSimilarToInvestigateItems/index.html index 40716da21..12f163da1 100644 --- a/analysis/SearchForTheSimilarToInvestigateItems/index.html +++ b/analysis/SearchForTheSimilarToInvestigateItems/index.html @@ -12,15 +12,15 @@ - - + +
-

Search for the similar "To investigate" items

Let's consider below an example of ML-driven failure triage in ReportPortal.

Use case:

Situation: Analyzer has completed its work and marked known issues with defect types.

But there are a lot of failures with a similar unknown reason in the run. All such items have "To investigate" defect type.

Problem: A user should check and analyze all failed items.

Solution:

A user is on All launches, he clicks on "To investigate" and opens a list with items. When a user clicks on a pencil next to a defect type, the system opens the "Make decision" modal. In this modal a user can see all items with "To investigate" defect type and the same failure reason.

There are 3 options for search the similar "To investigate" items on the Step level:

  • Current item only
  • Similar "To investigate" in the launch & current item
  • Similar "To investigate" in 10 launches & current item

There are 4 options for search the similar "To investigate" items on the Log level:

  • Current item only
  • Similar "To investigate" in the launch & current item
  • Similar "To investigate" in 10 launches & current item
  • "To investigate" from the history line & current item

If launches are filtered by filter on All Launches page, then addition option Similar "To investigate" in the Filter & current item appears on the Step and Log levels.

A user can select all identical failures and perform the bulk operation for them.

- - +

Search for the similar "To investigate" items

Let's consider below an example of ML-driven failure triage in ReportPortal.

Use case:

Situation: Analyzer has completed its work and marked known issues with defect types.

But there are a lot of failures with a similar unknown reason in the run. All such items have "To investigate" defect type.

Problem: A user should check and analyze all failed items.

Solution:

A user is on All launches, he clicks on "To investigate" and opens a list with items. When a user clicks on a pencil next to a defect type, the system opens the "Make decision" modal. In this modal a user can see all items with "To investigate" defect type and the same failure reason.

There are 3 options for search the similar "To investigate" items on the Step level:

  • Current item only
  • Similar "To investigate" in the launch & current item
  • Similar "To investigate" in 10 launches & current item

There are 4 options for search the similar "To investigate" items on the Log level:

  • Current item only
  • Similar "To investigate" in the launch & current item
  • Similar "To investigate" in 10 launches & current item
  • "To investigate" from the history line & current item

If launches are filtered by filter on All Launches page, then addition option Similar "To investigate" in the Filter & current item appears on the Step and Log levels.

A user can select all identical failures and perform the bulk operation for them.

+ + \ No newline at end of file diff --git a/analysis/UniqueErrorAnalysis/index.html b/analysis/UniqueErrorAnalysis/index.html index 6b64df807..418ce260a 100644 --- a/analysis/UniqueErrorAnalysis/index.html +++ b/analysis/UniqueErrorAnalysis/index.html @@ -12,15 +12,15 @@ - - + +
-

Unique Error Analysis

You can look at the test failure analysis from different points of view: qualitative (passing rate – How many tests have failed?) and quantitative (Why have they failed?). For example, if 1000 test cases are failed, then

  1. they could fail for the same reason

  2. they could fail for various reasons

While failed tests allow you to understand what is broken, “Unique Error analysis” functionality implemented in version 5.7 will show you why it broke. The main advantage of this solution is that a list of all unique errors of the launch is presented in one place. Moreover, the system automatically groups tests by the same errors: when you expand some error, you see a list of steps where it occurred.

“Unique error auto-analysis” is set ON by default.

“Include/exclude numbers” settings

There are 2 settings: “include/exclude numbers” – it depends if you decide that numbers in error logs have significant value for analysis or not.

Now, Unique error auto-analysis will be started after a launch has been finished.

To see the list of “Unique errors” for the launch, open any item level in the launch and click “Unique errors” tab.

Finally, you can see the list of “Unique errors”.

There you can see a list with groups of error logs. You can expand a group to check what tests belong to the same one and it could give you a hint during error analysis and defects assigning. The groups are formed based on unique error logs, some small error logs can be merged and displayed as one error.

How to run “Unique error analysis” manually

tip

You can also run “Unique error analysis” manually from any item level in case auto analysis is set OFF. Please, follow the steps below:

You can also run “Unique Error analysis” from the menu next to a particular launch.

Examples with “Include/exclude numbers” settings

Let’s consider some examples with the same Unique Errors but with different include/exclude numbers settings.

We have 2 errors with identical text, but the difference is numeric value in the first error.

  1. An example with “Include numbers to analyzed logs” setting. Error with numeric value is displayed:
  1. An example with “Exclude numbers from analyzed logs” setting. As you can see, error with numeric value is not displayed:

How to get ML suggestions for the group of steps

In addition, there is a possibility to get ML suggestions for the group of steps. It speeds up the process of analyzing failed tests and assigning defect types by several times.

Also, the new Quality Gates rule – “New Errors” – was implemented based on the “Unique Error analysis” functionality. This rule helps to identify if there are new unique errors in the current launch by comparing it to another specified launch.

To summarize, ReportPortal got the following benefits thanks to the “Unique Error analysis” functionality:

  1. a list of unique errors for the launch with grouping,
  2. facilitating tests results analysis,
  3. ML suggestions for a group of steps,
  4. new Quality Gates rule.

This way you can easily sort out the failures based on the unique errors found.

- - +

Unique Error Analysis

You can look at the test failure analysis from different points of view: qualitative (passing rate – How many tests have failed?) and quantitative (Why have they failed?). For example, if 1000 test cases are failed, then

  1. they could fail for the same reason

  2. they could fail for various reasons

While failed tests allow you to understand what is broken, “Unique Error analysis” functionality implemented in version 5.7 will show you why it broke. The main advantage of this solution is that a list of all unique errors of the launch is presented in one place. Moreover, the system automatically groups tests by the same errors: when you expand some error, you see a list of steps where it occurred.

“Unique error auto-analysis” is set ON by default.

“Include/exclude numbers” settings

There are 2 settings: “include/exclude numbers” – it depends if you decide that numbers in error logs have significant value for analysis or not.

Now, Unique error auto-analysis will be started after a launch has been finished.

To see the list of “Unique errors” for the launch, open any item level in the launch and click “Unique errors” tab.

Finally, you can see the list of “Unique errors”.

There you can see a list with groups of error logs. You can expand a group to check what tests belong to the same one and it could give you a hint during error analysis and defects assigning. The groups are formed based on unique error logs, some small error logs can be merged and displayed as one error.

How to run “Unique error analysis” manually

tip

You can also run “Unique error analysis” manually from any item level in case auto analysis is set OFF. Please, follow the steps below:

You can also run “Unique Error analysis” from the menu next to a particular launch.

Examples with “Include/exclude numbers” settings

Let’s consider some examples with the same Unique Errors but with different include/exclude numbers settings.

We have 2 errors with identical text, but the difference is numeric value in the first error.

  1. An example with “Include numbers to analyzed logs” setting. Error with numeric value is displayed:
  1. An example with “Exclude numbers from analyzed logs” setting. As you can see, error with numeric value is not displayed:

How to get ML suggestions for the group of steps

In addition, there is a possibility to get ML suggestions for the group of steps. It speeds up the process of analyzing failed tests and assigning defect types by several times.

Also, the new Quality Gates rule – “New Errors” – was implemented based on the “Unique Error analysis” functionality. This rule helps to identify if there are new unique errors in the current launch by comparing it to another specified launch.

To summarize, ReportPortal got the following benefits thanks to the “Unique Error analysis” functionality:

  1. a list of unique errors for the launch with grouping,
  2. facilitating tests results analysis,
  3. ML suggestions for a group of steps,
  4. new Quality Gates rule.

This way you can easily sort out the failures based on the unique errors found.

+ + \ No newline at end of file diff --git a/assets/js/027cf034.23e9fced.js b/assets/js/027cf034.226c1545.js similarity index 75% rename from assets/js/027cf034.23e9fced.js rename to assets/js/027cf034.226c1545.js index 4f7fc04ea..e7bb7ec41 100644 --- a/assets/js/027cf034.23e9fced.js +++ b/assets/js/027cf034.226c1545.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[9168],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||a;return r?n.createElement(f,i(i({ref:t},s),{},{components:r})):n.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:o,i[1]=p;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>p,toc:()=>c});var n=r(87462),o=(r(67294),r(3905));const a={sidebar_position:2,sidebar_label:"Implement own integration"},i="Implement own integration",p={unversionedId:"log-data-in-reportportal/ImplementOwnIntegration",id:"log-data-in-reportportal/ImplementOwnIntegration",title:"Implement own integration",description:"You can find a detailed description of how report results to ReportPortal in our developers` guide.",source:"@site/docs/log-data-in-reportportal/ImplementOwnIntegration.md",sourceDirName:"log-data-in-reportportal",slug:"/log-data-in-reportportal/ImplementOwnIntegration",permalink:"/docs/log-data-in-reportportal/ImplementOwnIntegration",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/log-data-in-reportportal/ImplementOwnIntegration.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,sidebar_label:"Implement own integration"},sidebar:"defaultSidebar",previous:{title:"Log data in ReportPortal",permalink:"/docs/category/log-data-in-reportportal"},next:{title:"Reporting SDK",permalink:"/docs/log-data-in-reportportal/ReportingSDK"}},l={},c=[],s={toc:c},d="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"implement-own-integration"},"Implement own integration"),(0,o.kt)("p",null,"You can find a detailed description of how report results to ReportPortal in our ",(0,o.kt)("a",{parentName:"p",href:"/dev-guides/ReportingDevelopersGuide"},"developers` guide"),"."),(0,o.kt)("p",null,"Based on this information you can create your integration with a test framework."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"We can propose a paid support for integration with a new framework or supporting an existing one. If you need more details, please drop a letter on ",(0,o.kt)("a",{parentName:"p",href:"mailto:support@reportportal.io"},"support@reportportal.io"),".")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[9168],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(67294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||a;return r?n.createElement(f,i(i({ref:t},s),{},{components:r})):n.createElement(f,i({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p[d]="string"==typeof e?e:o,i[1]=p;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>p,toc:()=>c});var n=r(87462),o=(r(67294),r(3905));const a={sidebar_position:2,sidebar_label:"Implement own integration"},i="Implement own integration",p={unversionedId:"log-data-in-reportportal/ImplementOwnIntegration",id:"log-data-in-reportportal/ImplementOwnIntegration",title:"Implement own integration",description:"You can find a detailed description of how report results to ReportPortal in our developers` guide.",source:"@site/docs/log-data-in-reportportal/ImplementOwnIntegration.md",sourceDirName:"log-data-in-reportportal",slug:"/log-data-in-reportportal/ImplementOwnIntegration",permalink:"/docs/log-data-in-reportportal/ImplementOwnIntegration",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/log-data-in-reportportal/ImplementOwnIntegration.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,sidebar_label:"Implement own integration"},sidebar:"defaultSidebar",previous:{title:"Log data in ReportPortal",permalink:"/docs/log-data-in-reportportal/"},next:{title:"Reporting SDK",permalink:"/docs/log-data-in-reportportal/ReportingSDK"}},l={},c=[],s={toc:c},d="wrapper";function u(e){let{components:t,...r}=e;return(0,o.kt)(d,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"implement-own-integration"},"Implement own integration"),(0,o.kt)("p",null,"You can find a detailed description of how report results to ReportPortal in our ",(0,o.kt)("a",{parentName:"p",href:"/dev-guides/ReportingDevelopersGuide"},"developers` guide"),"."),(0,o.kt)("p",null,"Based on this information you can create your integration with a test framework."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"We can propose a paid support for integration with a new framework or supporting an existing one. If you need more details, please drop a letter on ",(0,o.kt)("a",{parentName:"p",href:"mailto:support@reportportal.io"},"support@reportportal.io"),".")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.14d8dc3d.js b/assets/js/14eb3368.14d8dc3d.js new file mode 100644 index 000000000..723c9fd66 --- /dev/null +++ b/assets/js/14eb3368.14d8dc3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(87462),r=a(67294),i=a(86010),l=a(35281),c=a(52802),s=a(48596),o=a(39960),m=a(95999),d=a(44996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:c}=e;return r.createElement("li",(0,n.Z)({},c&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,c.s1)(),t=(0,s.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},52991:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(67294),r=a(86010),i=a(52802),l=a(39960),c=a(13919),s=a(95999);const o={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function m(e){let{href:t,children:a}=e;return n.createElement(l.Z,{href:t,className:(0,r.Z)("card padding--lg",o.cardContainer)},a)}function d(e){let{href:t,icon:a,title:i,description:l}=e;return n.createElement(m,{href:t},n.createElement("h2",{className:(0,r.Z)("text--truncate",o.cardTitle),title:i},a," ",i),l&&n.createElement("p",{className:(0,r.Z)("text--truncate",o.cardDescription),title:l},l))}function u(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(d,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,s.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function h(e){let{item:t}=e;const a=(0,c.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(d,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function b(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(h,{item:t});case"category":return n.createElement(u,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function v(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(g,{items:a.items,className:t})}function g(e){const{items:t,className:a}=e;if(!t)return n.createElement(v,e);const l=(0,i.MN)(t);return n.createElement("section",{className:(0,r.Z)("row",a)},l.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(b,{item:e})))))}},55541:(e,t,a)=>{a.r(t),a.d(t,{default:()=>g});var n=a(67294),r=a(10833),i=a(52802),l=a(44996),c=a(52991),s=a(4966),o=a(23120),m=a(44364),d=a(1310),u=a(92503);const h={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function b(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function v(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:h.generatedIndexPage},n.createElement(o.Z,null),n.createElement(d.Z,null),n.createElement(m.Z,null),n.createElement("header",null,n.createElement(u.Z,{as:"h1",className:h.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(c.Z,{items:a.items,className:h.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(s.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function g(e){return n.createElement(n.Fragment,null,n.createElement(b,e),n.createElement(v,e))}},4966:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(87462),r=a(67294),i=a(95999),l=a(86010),c=a(39960);function s(e){const{permalink:t,title:a,subLabel:n,isNext:i}=e;return r.createElement(c.Z,{className:(0,l.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&r.createElement("div",{className:"pagination-nav__sublabel"},n),r.createElement("div",{className:"pagination-nav__label"},a))}function o(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&r.createElement(s,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(s,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},44364:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(67294),r=a(86010),i=a(95999),l=a(35281),c=a(74477);function s(e){let{className:t}=e;const a=(0,c.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},23120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(67294),r=a(86010),i=a(52263),l=a(39960),c=a(95999),s=a(80143),o=a(35281),m=a(60373),d=a(74477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(c.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(c.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(c.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(c.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:c}=(0,s.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(c),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,s.Jo)(c),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},92503:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(87462),r=a(67294),i=a(86010),l=a(95999),c=a(86668),s=a(39960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,c.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(s.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}}}]); \ No newline at end of file diff --git a/assets/js/14eb3368.1e4fec31.js b/assets/js/14eb3368.1e4fec31.js deleted file mode 100644 index c04ed0fe0..000000000 --- a/assets/js/14eb3368.1e4fec31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[9817],{1310:(e,t,a)=>{a.d(t,{Z:()=>E});var n=a(87462),r=a(67294),i=a(86010),l=a(35281),c=a(52802),s=a(48596),o=a(39960),m=a(95999),d=a(44996);function u(e){return r.createElement("svg",(0,n.Z)({viewBox:"0 0 24 24"},e),r.createElement("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"}))}const h={breadcrumbHomeIcon:"breadcrumbHomeIcon_YNFT"};function b(){const e=(0,d.Z)("/");return r.createElement("li",{className:"breadcrumbs__item"},r.createElement(o.Z,{"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e},r.createElement(u,{className:h.breadcrumbHomeIcon})))}const v={breadcrumbsContainer:"breadcrumbsContainer_Z_bl"};function g(e){let{children:t,href:a,isLast:n}=e;const i="breadcrumbs__link";return n?r.createElement("span",{className:i,itemProp:"name"},t):a?r.createElement(o.Z,{className:i,href:a,itemProp:"item"},r.createElement("span",{itemProp:"name"},t)):r.createElement("span",{className:i},t)}function p(e){let{children:t,active:a,index:l,addMicrodata:c}=e;return r.createElement("li",(0,n.Z)({},c&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},{className:(0,i.Z)("breadcrumbs__item",{"breadcrumbs__item--active":a})}),t,r.createElement("meta",{itemProp:"position",content:String(l+1)}))}function E(){const e=(0,c.s1)(),t=(0,s.Ns)();return e?r.createElement("nav",{className:(0,i.Z)(l.k.docs.docBreadcrumbs,v.breadcrumbsContainer),"aria-label":(0,m.I)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"})},r.createElement("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList"},t&&r.createElement(b,null),e.map(((t,a)=>{const n=a===e.length-1;return r.createElement(p,{key:a,active:n,index:a,addMicrodata:!!t.href},r.createElement(g,{href:t.href,isLast:n},t.label))})))):null}},34228:(e,t,a)=>{a.r(t),a.d(t,{default:()=>y});var n=a(67294),r=a(10833),i=a(52802),l=a(44996),c=a(86010),s=a(39960),o=a(13919),m=a(95999);const d={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:a}=e;return n.createElement(s.Z,{href:t,className:(0,c.Z)("card padding--lg",d.cardContainer)},a)}function h(e){let{href:t,icon:a,title:r,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,c.Z)("text--truncate",d.cardTitle),title:r},a," ",r),i&&n.createElement("p",{className:(0,c.Z)("text--truncate",d.cardDescription),title:i},i))}function b(e){let{item:t}=e;const a=(0,i.Wl)(t);return a?n.createElement(h,{href:a,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,m.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function v(e){let{item:t}=e;const a=(0,o.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",r=(0,i.xz)(t.docId??void 0);return n.createElement(h,{href:t.href,icon:a,title:t.label,description:t.description??r?.description})}function g(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(v,{item:t});case"category":return n.createElement(b,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function p(e){let{className:t}=e;const a=(0,i.jA)();return n.createElement(E,{items:a.items,className:t})}function E(e){const{items:t,className:a}=e;if(!t)return n.createElement(p,e);const r=(0,i.MN)(t);return n.createElement("section",{className:(0,c.Z)("row",a)},r.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(g,{item:e})))))}var f=a(4966),N=a(23120),Z=a(44364),k=a(1310),L=a(92503);const _={generatedIndexPage:"generatedIndexPage_vN6x",list:"list_eTzJ",title:"title_kItE"};function T(e){let{categoryGeneratedIndex:t}=e;return n.createElement(r.d,{title:t.title,description:t.description,keywords:t.keywords,image:(0,l.Z)(t.image)})}function x(e){let{categoryGeneratedIndex:t}=e;const a=(0,i.jA)();return n.createElement("div",{className:_.generatedIndexPage},n.createElement(N.Z,null),n.createElement(k.Z,null),n.createElement(Z.Z,null),n.createElement("header",null,n.createElement(L.Z,{as:"h1",className:_.title},t.title),t.description&&n.createElement("p",null,t.description)),n.createElement("article",{className:"margin-top--lg"},n.createElement(E,{items:a.items,className:_.list})),n.createElement("footer",{className:"margin-top--lg"},n.createElement(f.Z,{previous:t.navigation.previous,next:t.navigation.next})))}function y(e){return n.createElement(n.Fragment,null,n.createElement(T,e),n.createElement(x,e))}},4966:(e,t,a)=>{a.d(t,{Z:()=>o});var n=a(87462),r=a(67294),i=a(95999),l=a(86010),c=a(39960);function s(e){const{permalink:t,title:a,subLabel:n,isNext:i}=e;return r.createElement(c.Z,{className:(0,l.Z)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t},n&&r.createElement("div",{className:"pagination-nav__sublabel"},n),r.createElement("div",{className:"pagination-nav__label"},a))}function o(e){const{previous:t,next:a}=e;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,i.I)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},t&&r.createElement(s,(0,n.Z)({},t,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")})),a&&r.createElement(s,(0,n.Z)({},a,{subLabel:r.createElement(i.Z,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next"),isNext:!0})))}},44364:(e,t,a)=>{a.d(t,{Z:()=>s});var n=a(67294),r=a(86010),i=a(95999),l=a(35281),c=a(74477);function s(e){let{className:t}=e;const a=(0,c.E)();return a.badge?n.createElement("span",{className:(0,r.Z)(t,l.k.docs.docVersionBadge,"badge badge--secondary")},n.createElement(i.Z,{id:"theme.docs.versionBadge.label",values:{versionLabel:a.label}},"Version: {versionLabel}")):null}},23120:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(67294),r=a(86010),i=a(52263),l=a(39960),c=a(95999),s=a(80143),o=a(35281),m=a(60373),d=a(74477);const u={unreleased:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(c.Z,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")},unmaintained:function(e){let{siteTitle:t,versionMetadata:a}=e;return n.createElement(c.Z,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:n.createElement("b",null,a.label)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}};function h(e){const t=u[e.versionMetadata.banner];return n.createElement(t,e)}function b(e){let{versionLabel:t,to:a,onClick:r}=e;return n.createElement(c.Z,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:n.createElement("b",null,n.createElement(l.Z,{to:a,onClick:r},n.createElement(c.Z,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}function v(e){let{className:t,versionMetadata:a}=e;const{siteConfig:{title:l}}=(0,i.Z)(),{pluginId:c}=(0,s.gA)({failfast:!0}),{savePreferredVersionName:d}=(0,m.J)(c),{latestDocSuggestion:u,latestVersionSuggestion:v}=(0,s.Jo)(c),g=u??(p=v).docs.find((e=>e.id===p.mainDocId));var p;return n.createElement("div",{className:(0,r.Z)(t,o.k.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert"},n.createElement("div",null,n.createElement(h,{siteTitle:l,versionMetadata:a})),n.createElement("div",{className:"margin-top--md"},n.createElement(b,{versionLabel:v.label,to:g.path,onClick:()=>d(v.name)})))}function g(e){let{className:t}=e;const a=(0,d.E)();return a.banner?n.createElement(v,{className:t,versionMetadata:a}):null}},92503:(e,t,a)=>{a.d(t,{Z:()=>m});var n=a(87462),r=a(67294),i=a(86010),l=a(95999),c=a(86668),s=a(39960);const o={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};function m(e){let{as:t,id:a,...m}=e;const{navbar:{hideOnScroll:d}}=(0,c.L)();if("h1"===t||!a)return r.createElement(t,(0,n.Z)({},m,{id:void 0}));const u=(0,l.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof m.children?m.children:a});return r.createElement(t,(0,n.Z)({},m,{className:(0,i.Z)("anchor",d?o.anchorWithHideOnScrollNavbar:o.anchorWithStickyNavbar,m.className),id:a}),m.children,r.createElement(s.Z,{className:"hash-link",to:`#${a}`,"aria-label":u,title:u},"\u200b"))}}}]); \ No newline at end of file diff --git a/assets/js/3ac6333e.3ec4d584.js b/assets/js/3ac6333e.3ec4d584.js deleted file mode 100644 index 3aa397ff5..000000000 --- a/assets/js/3ac6333e.3ec4d584.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[9998],{56373:t=>{t.exports=JSON.parse('{"title":"Log data in ReportPortal","slug":"/category/log-data-in-reportportal","permalink":"/docs/category/log-data-in-reportportal","navigation":{"previous":{"title":"Data retention procedure","permalink":"/docs/user-account/DataRetentionProcedure"},"next":{"title":"Implement own integration","permalink":"/docs/log-data-in-reportportal/ImplementOwnIntegration"}}}')}}]); \ No newline at end of file diff --git a/assets/js/7bbaf234.6edecbb6.js b/assets/js/7bbaf234.a2217fa8.js similarity index 53% rename from assets/js/7bbaf234.6edecbb6.js rename to assets/js/7bbaf234.a2217fa8.js index a870b38c2..28c283fbc 100644 --- a/assets/js/7bbaf234.6edecbb6.js +++ b/assets/js/7bbaf234.a2217fa8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[7318],{3905:(e,r,t)=>{t.d(r,{Zo:()=>c,kt:()=>g});var a=t(67294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function p(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var i=a.createContext({}),l=function(e){var r=a.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):p(p({},r),e)),t},c=function(e){var r=l(e.components);return a.createElement(i.Provider,{value:r},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},m=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=l(t),m=n,g=d["".concat(i,".").concat(m)]||d[m]||u[m]||o;return t?a.createElement(g,p(p({ref:r},c),{},{components:t})):a.createElement(g,p({ref:r},c))}));function g(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var o=t.length,p=new Array(o);p[0]=m;var s={};for(var i in r)hasOwnProperty.call(r,i)&&(s[i]=r[i]);s.originalType=e,s[d]="string"==typeof e?e:n,p[1]=s;for(var l=2;l{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(87462),n=(t(67294),t(3905));const o={sidebar_position:17,sidebar_label:"User role guides"},p="User role guides",s={unversionedId:"user-role-guides/index",id:"user-role-guides/index",title:"User role guides",description:"Here are the links to User Guide sections divided by ReportPortal User roles.",source:"@site/docs/user-role-guides/index.md",sourceDirName:"user-role-guides",slug:"/user-role-guides/",permalink:"/docs/user-role-guides/",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/user-role-guides/index.md",tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17,sidebar_label:"User role guides"},sidebar:"defaultSidebar",previous:{title:"Integration with Jenkins",permalink:"/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins"},next:{title:"Issues Troubleshooting",permalink:"/docs/category/issues-troubleshooting"}},i={},l=[{value:"Administrator",id:"administrator",level:2},{value:"Project Manager",id:"project-manager",level:2},{value:"Member",id:"member",level:2},{value:"Operator",id:"operator",level:2},{value:"Customer",id:"customer",level:2}],c={toc:l},d="wrapper";function u(e){let{components:r,...t}=e;return(0,n.kt)(d,(0,a.Z)({},c,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"user-role-guides"},"User role guides"),(0,n.kt)("p",null,"Here are the links to User Guide sections divided by ReportPortal User roles."),(0,n.kt)("h2",{id:"administrator"},"Administrator"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/installation-steps"},"Installation steps"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-tutorial/"},"Tutorial"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/log-data-in-reportportal"},"Log data in ReportPortal"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-configuration/IntegrationViaPlugin"},"Logging Integration"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/admin-panel"},"Admin Panel"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/issues-troubleshooting"},"Tips and tricks")," "),(0,n.kt)("h2",{id:"project-manager"},"Project Manager"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/reportportal-tutorial/"},"Tutorial"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/admin-panel"},"Admin Panel"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account")," "),(0,n.kt)("h2",{id:"member"},"Member"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/analysis"},"Analysis"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/log-data-in-reportportal"},"Log data in ReportPortal"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-configuration/IntegrationViaPlugin"},"Logging Integration")," "),(0,n.kt)("h2",{id:"operator"},"Operator"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/analysis"},"Analysis"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-configuration/ProjectConfiguration#management-of-users-on-the-project"},"See list of project members")),(0,n.kt)("h2",{id:"customer"},"Customer"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/analysis"},"Analysis"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[7318],{3905:(e,r,t)=>{t.d(r,{Zo:()=>c,kt:()=>g});var a=t(67294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function p(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var i=a.createContext({}),l=function(e){var r=a.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):p(p({},r),e)),t},c=function(e){var r=l(e.components);return a.createElement(i.Provider,{value:r},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},m=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=l(t),m=n,g=d["".concat(i,".").concat(m)]||d[m]||u[m]||o;return t?a.createElement(g,p(p({ref:r},c),{},{components:t})):a.createElement(g,p({ref:r},c))}));function g(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var o=t.length,p=new Array(o);p[0]=m;var s={};for(var i in r)hasOwnProperty.call(r,i)&&(s[i]=r[i]);s.originalType=e,s[d]="string"==typeof e?e:n,p[1]=s;for(var l=2;l{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>p,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var a=t(87462),n=(t(67294),t(3905));const o={sidebar_position:17,sidebar_label:"User role guides"},p="User role guides",s={unversionedId:"user-role-guides/index",id:"user-role-guides/index",title:"User role guides",description:"Here are the links to User Guide sections divided by ReportPortal User roles.",source:"@site/docs/user-role-guides/index.md",sourceDirName:"user-role-guides",slug:"/user-role-guides/",permalink:"/docs/user-role-guides/",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/user-role-guides/index.md",tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17,sidebar_label:"User role guides"},sidebar:"defaultSidebar",previous:{title:"Integration with Jenkins",permalink:"/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins"},next:{title:"Issues Troubleshooting",permalink:"/docs/category/issues-troubleshooting"}},i={},l=[{value:"Administrator",id:"administrator",level:2},{value:"Project Manager",id:"project-manager",level:2},{value:"Member",id:"member",level:2},{value:"Operator",id:"operator",level:2},{value:"Customer",id:"customer",level:2}],c={toc:l},d="wrapper";function u(e){let{components:r,...t}=e;return(0,n.kt)(d,(0,a.Z)({},c,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"user-role-guides"},"User role guides"),(0,n.kt)("p",null,"Here are the links to User Guide sections divided by ReportPortal User roles."),(0,n.kt)("h2",{id:"administrator"},"Administrator"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/installation-steps"},"Installation steps"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-tutorial/"},"Tutorial"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/log-data-in-reportportal"},"Log data in ReportPortal"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-configuration/IntegrationViaPlugin"},"Logging Integration"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/admin-panel"},"Admin Panel"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/issues-troubleshooting"},"Tips and tricks")," "),(0,n.kt)("h2",{id:"project-manager"},"Project Manager"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/reportportal-tutorial/"},"Tutorial"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/admin-panel"},"Admin Panel"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account")," "),(0,n.kt)("h2",{id:"member"},"Member"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/analysis"},"Analysis"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/log-data-in-reportportal"},"Log data in ReportPortal"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-configuration/IntegrationViaPlugin"},"Logging Integration")," "),(0,n.kt)("h2",{id:"operator"},"Operator"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/analysis"},"Analysis"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/reportportal-configuration/ProjectConfiguration#management-of-users-on-the-project"},"See list of project members")),(0,n.kt)("h2",{id:"customer"},"Customer"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"/category/work-with-reports"},"Work with reports"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/analysis"},"Analysis"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/saved-searches-filters"},"Saved searches (Filters)"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/dashboards-and-widgets"},"Dashboards and Widgets"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"/category/user-account"},"User account")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.394b7d7f.js b/assets/js/935f2afb.394b7d7f.js new file mode 100644 index 000000000..53864a250 --- /dev/null +++ b/assets/js/935f2afb.394b7d7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"What is ReportPortal?","href":"/docs/","docId":"intro"},{"type":"category","label":"Features","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Unified test reporting","href":"/docs/features/UnifiedTestReporting","docId":"features/UnifiedTestReporting"},{"type":"link","label":"Categorisation of failures","href":"/docs/features/CategorisationOfFailures","docId":"features/CategorisationOfFailures"},{"type":"link","label":"AI failure reason detection","href":"/docs/features/AIFailureReasonDetection","docId":"features/AIFailureReasonDetection"},{"type":"link","label":"Rich artifacts in test reports","href":"/docs/features/RichArtifactsInTestReports","docId":"features/RichArtifactsInTestReports"},{"type":"link","label":"Real-time reporting","href":"/docs/features/RealTimeReporting","docId":"features/RealTimeReporting"},{"type":"link","label":"Visualisation of test results","href":"/docs/features/VisualisationOfTestResults","docId":"features/VisualisationOfTestResults"},{"type":"link","label":"Quality Gates","href":"/docs/features/QualityGates","docId":"features/QualityGates"},{"type":"link","label":"REST API","href":"/docs/features/RESTAPI","docId":"features/RESTAPI"}],"href":"/docs/category/features"},{"type":"link","label":"ReportPortal Tutorial","href":"/docs/reportportal-tutorial/","docId":"reportportal-tutorial/index"},{"type":"category","label":"Installation Steps","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Optimal Performance Hardware setup","href":"/docs/installation-steps/OptimalPerformanceHardwareSetup","docId":"installation-steps/OptimalPerformanceHardwareSetup"},{"type":"link","label":"Basic monitoring configuration","href":"/docs/installation-steps/BasicMonitoringConfiguration","docId":"installation-steps/BasicMonitoringConfiguration"},{"type":"link","label":"Deploy with Docker on Linux/Mac","href":"/docs/installation-steps/DeployWithDockerOnLinuxMac","docId":"installation-steps/DeployWithDockerOnLinuxMac"},{"type":"link","label":"Deploy with Docker on Windows","href":"/docs/installation-steps/DeployWithDockerOnWindows","docId":"installation-steps/DeployWithDockerOnWindows"},{"type":"link","label":"Deploy without Docker","href":"/docs/installation-steps/DeployWithoutDocker","docId":"installation-steps/DeployWithoutDocker"},{"type":"link","label":"Deploy with Kubernetes","href":"/docs/installation-steps/DeployWithKubernetes","docId":"installation-steps/DeployWithKubernetes"},{"type":"link","label":"Maintain commands Cheat sheet","href":"/docs/installation-steps/MaintainCommandsCheatSheet","docId":"installation-steps/MaintainCommandsCheatSheet"},{"type":"link","label":"Additional configuration parameters","href":"/docs/installation-steps/AdditionalConfigurationParameters","docId":"installation-steps/AdditionalConfigurationParameters"},{"type":"link","label":"Setup TLS(SSL) in Traefik 2.0.x","href":"/docs/installation-steps/SetupTSLSSLInTraefik2.0.x","docId":"installation-steps/SetupTSLSSLInTraefik2.0.x"},{"type":"link","label":"Deploy on Ubuntu OS","href":"/docs/installation-steps/DeployOnUbuntuOS","docId":"installation-steps/DeployOnUbuntuOS"},{"type":"link","label":"Deploy with AWS ECS Fargate","href":"/docs/installation-steps/DeployWithAWSECSFargate","docId":"installation-steps/DeployWithAWSECSFargate"},{"type":"link","label":"ReportPortal 23.1 File storage options","href":"/docs/installation-steps/ReportPortal23.1FileStorageOptions","docId":"installation-steps/ReportPortal23.1FileStorageOptions"},{"type":"link","label":"Scaling Up the ReportPortal Service API","href":"/docs/installation-steps/ScalingUpReportPortalAPIService","docId":"installation-steps/ScalingUpReportPortalAPIService"}],"href":"/docs/category/installation-steps"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Version v.23.2","href":"/docs/releases/Version23.2","docId":"releases/Version23.2"},{"type":"link","label":"Version v.23.1","href":"/docs/releases/Versionv23.1","docId":"releases/Versionv23.1"},{"type":"link","label":"Version 5.7.4","href":"/docs/releases/Version5.7.4","docId":"releases/Version5.7.4"},{"type":"link","label":"Version 5.7.3","href":"/docs/releases/Version5.7.3","docId":"releases/Version5.7.3"},{"type":"link","label":"Version 5.7.2","href":"/docs/releases/Version5.7.2","docId":"releases/Version5.7.2"},{"type":"link","label":"Version 5.7.1","href":"/docs/releases/Version5.7.1","docId":"releases/Version5.7.1"},{"type":"link","label":"Version 5.7.0","href":"/docs/releases/Version5.7.0","docId":"releases/Version5.7.0"},{"type":"link","label":"Version 5.6.3","href":"/docs/releases/Version5.6.3","docId":"releases/Version5.6.3"},{"type":"link","label":"Version 5.6.2","href":"/docs/releases/Version5.6.2","docId":"releases/Version5.6.2"},{"type":"link","label":"Version 5.6.1","href":"/docs/releases/Version5.6.1","docId":"releases/Version5.6.1"},{"type":"link","label":"Version 5.6.0","href":"/docs/releases/Version5.6.0","docId":"releases/Version5.6.0"},{"type":"link","label":"Version 5.5.0","href":"/docs/releases/Version5.5.0","docId":"releases/Version5.5.0"},{"type":"link","label":"Version 5.4.0","href":"/docs/releases/Version5.4.0","docId":"releases/Version5.4.0"},{"type":"link","label":"Version 5.3.5","href":"/docs/releases/Version5.3.5","docId":"releases/Version5.3.5"},{"type":"link","label":"Version 5.3.3","href":"/docs/releases/Version5.3.3","docId":"releases/Version5.3.3"},{"type":"link","label":"Version 5.3.2","href":"/docs/releases/Version5.3.2","docId":"releases/Version5.3.2"},{"type":"link","label":"Version 5.3.1","href":"/docs/releases/Version5.3.1.","docId":"releases/Version5.3.1."},{"type":"link","label":"Version 5.3.0","href":"/docs/releases/Version5.3.0","docId":"releases/Version5.3.0"},{"type":"link","label":"Version 5.2.3","href":"/docs/releases/Version5.2.3","docId":"releases/Version5.2.3"},{"type":"link","label":"Version 5.2.2","href":"/docs/releases/Version5.2.2","docId":"releases/Version5.2.2"},{"type":"link","label":"Version 5.2.1","href":"/docs/releases/Version5.2.1","docId":"releases/Version5.2.1"},{"type":"link","label":"Version 5.2.0","href":"/docs/releases/Version5.2.0","docId":"releases/Version5.2.0"},{"type":"link","label":"Version 5.1.0","href":"/docs/releases/Version5.1.0","docId":"releases/Version5.1.0"},{"type":"link","label":"Version 5.0.0","href":"/docs/releases/Version5.0.0","docId":"releases/Version5.0.0"},{"type":"link","label":"Version 5.0RC","href":"/docs/releases/Version5.0RC","docId":"releases/Version5.0RC"},{"type":"link","label":"Version 4.3","href":"/docs/releases/Version4.3","docId":"releases/Version4.3"},{"type":"link","label":"Version 4.2.0","href":"/docs/releases/Version4.2.0","docId":"releases/Version4.2.0"},{"type":"link","label":"Version 4.1.0","href":"/docs/releases/Version4.1.0","docId":"releases/Version4.1.0"},{"type":"link","label":"Version 4.0.0","href":"/docs/releases/Version4.0.0","docId":"releases/Version4.0.0"},{"type":"link","label":"Version 3.3.2-1","href":"/docs/releases/Version3.3.2-1","docId":"releases/Version3.3.2-1"},{"type":"link","label":"Version 3.3.2","href":"/docs/releases/Version3.3.2","docId":"releases/Version3.3.2"}],"href":"/docs/category/releases"},{"type":"category","label":"ReportPortal Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Components Overview","href":"/docs/reportportal-configuration/ComponentsOverview","docId":"reportportal-configuration/ComponentsOverview"},{"type":"link","label":"Creation of project and adding users","href":"/docs/reportportal-configuration/CreationOfProjectAndAddingUsers","docId":"reportportal-configuration/CreationOfProjectAndAddingUsers"},{"type":"link","label":"Project configuration","href":"/docs/reportportal-configuration/ProjectConfiguration","docId":"reportportal-configuration/ProjectConfiguration"},{"type":"link","label":"ReportPortal jobs configuration","href":"/docs/reportportal-configuration/ReportPortalJobsConfiguration","docId":"reportportal-configuration/ReportPortalJobsConfiguration"},{"type":"link","label":"Integration via plugin","href":"/docs/reportportal-configuration/IntegrationViaPlugin","docId":"reportportal-configuration/IntegrationViaPlugin"},{"type":"link","label":"How to get an access token in ReportPortal","href":"/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal","docId":"reportportal-configuration/HowToGetAnAccessTokenInReportPortal"},{"type":"category","label":"Authorization","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Active Directory","href":"/docs/reportportal-configuration/authorization/ActiveDirectory","docId":"reportportal-configuration/authorization/ActiveDirectory"},{"type":"link","label":"GitHub","href":"/docs/reportportal-configuration/authorization/GitHub","docId":"reportportal-configuration/authorization/GitHub"},{"type":"link","label":"LDAP","href":"/docs/reportportal-configuration/authorization/LDAP","docId":"reportportal-configuration/authorization/LDAP"},{"type":"category","label":"SAML Provider","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Azure SAML","href":"/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAML","docId":"reportportal-configuration/authorization/SAMLProvider/AzureSAML"},{"type":"link","label":"Okta SAML","href":"/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAML","docId":"reportportal-configuration/authorization/SAMLProvider/OktaSAML"}],"href":"/docs/reportportal-configuration/authorization/SAMLProvider/"}],"href":"/docs/reportportal-configuration/authorization/"}],"href":"/docs/category/reportportal-configuration"},{"type":"category","label":"User account","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Edit personal information","href":"/docs/user-account/EditPersonalInformation","docId":"user-account/EditPersonalInformation"},{"type":"link","label":"Restore a password","href":"/docs/user-account/RestoreAPassword","docId":"user-account/RestoreAPassword"},{"type":"link","label":"Delete account","href":"/docs/user-account/DeleteAccount","docId":"user-account/DeleteAccount"},{"type":"link","label":"Data retention procedure","href":"/docs/user-account/DataRetentionProcedure","docId":"user-account/DataRetentionProcedure"}],"href":"/docs/category/user-account"},{"type":"category","label":"Log data in ReportPortal","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Implement own integration","href":"/docs/log-data-in-reportportal/ImplementOwnIntegration","docId":"log-data-in-reportportal/ImplementOwnIntegration"},{"type":"link","label":"Reporting SDK","href":"/docs/log-data-in-reportportal/ReportingSDK","docId":"log-data-in-reportportal/ReportingSDK"},{"type":"link","label":"Import data to ReportPortal","href":"/docs/log-data-in-reportportal/ImportDataToReportPortal","docId":"log-data-in-reportportal/ImportDataToReportPortal"},{"type":"link","label":"How to run your tests","href":"/docs/log-data-in-reportportal/HowToRunYourTests","docId":"log-data-in-reportportal/HowToRunYourTests"},{"type":"category","label":"Test Framework Integration","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Java","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JUnit5","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5","docId":"log-data-in-reportportal/test-framework-integration/Java/JUnit5"},{"type":"link","label":"JUnit4","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4","docId":"log-data-in-reportportal/test-framework-integration/Java/JUnit4"},{"type":"link","label":"TestNG","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/TestNG","docId":"log-data-in-reportportal/test-framework-integration/Java/TestNG"},{"type":"link","label":"Cucumber","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumber","docId":"log-data-in-reportportal/test-framework-integration/Java/Cucumber"},{"type":"link","label":"JBehave","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/JBehave","docId":"log-data-in-reportportal/test-framework-integration/Java/JBehave"},{"type":"link","label":"Spock","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Spock","docId":"log-data-in-reportportal/test-framework-integration/Java/Spock"},{"type":"link","label":"SoapUI (outdated)","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUI","docId":"log-data-in-reportportal/test-framework-integration/Java/SoapUI"},{"type":"category","label":"Loggers","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Logback","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback"},{"type":"link","label":"Log4J","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J"},{"type":"link","label":"Rest Assured","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured"},{"type":"link","label":"Selenide","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide"},{"type":"link","label":"OkHttp3","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3"},{"type":"link","label":"Apache HttpComponents","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents"}],"href":"/docs/category/loggers"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/Java/"},{"type":"category","label":"JavaScript","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Playwright","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright"},{"type":"link","label":"CucumberJS","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS"},{"type":"link","label":"Codecept","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept"},{"type":"link","label":"WebdriverIO","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO"},{"type":"link","label":"Postman","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postman","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Postman"},{"type":"link","label":"Cypress","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress"},{"type":"link","label":"Mocha","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha"},{"type":"link","label":"Jest","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jest","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Jest"},{"type":"link","label":"TestCafe","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe"},{"type":"link","label":"Jasmine","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine"},{"type":"link","label":"Nightwatch","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/"},{"type":"category","label":".Net","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NUnit","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/NUnit","docId":"log-data-in-reportportal/test-framework-integration/Net/NUnit"},{"type":"link","label":"VSTest","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/VSTest","docId":"log-data-in-reportportal/test-framework-integration/Net/VSTest"},{"type":"link","label":"SpecFlow","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlow","docId":"log-data-in-reportportal/test-framework-integration/Net/SpecFlow"},{"type":"link","label":"xUnit","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/xUnit","docId":"log-data-in-reportportal/test-framework-integration/Net/xUnit"},{"type":"category","label":"Loggers","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Serilog","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog"},{"type":"link","label":"Log4Net","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net"},{"type":"link","label":"NLog","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog"},{"type":"link","label":"TraceListener","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener"}],"href":"/docs/category/loggers-1"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/Net/"},{"type":"category","label":"Python","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"pytest","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/pytest","docId":"log-data-in-reportportal/test-framework-integration/Python/pytest"},{"type":"link","label":"Robot Framework","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFramework","docId":"log-data-in-reportportal/test-framework-integration/Python/RobotFramework"},{"type":"link","label":"behave","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/behave","docId":"log-data-in-reportportal/test-framework-integration/Python/behave"},{"type":"link","label":"nosetests","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/nosetests","docId":"log-data-in-reportportal/test-framework-integration/Python/nosetests"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/Python/"},{"type":"category","label":"PHP","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PHPUnit","href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","docId":"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit"},{"type":"link","label":"Behat","href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/Behat","docId":"log-data-in-reportportal/test-framework-integration/PHP/Behat"},{"type":"link","label":"Codeception","href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeception","docId":"log-data-in-reportportal/test-framework-integration/PHP/Codeception"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/"},{"type":"link","label":"Other","href":"/docs/log-data-in-reportportal/test-framework-integration/Other/","docId":"log-data-in-reportportal/test-framework-integration/Other/index"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/"}],"href":"/docs/log-data-in-reportportal/"},{"type":"category","label":"Developers guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"API differences between v4 and v5","href":"/docs/dev-guides/APIDifferencesBetweenV4AndV5","docId":"dev-guides/APIDifferencesBetweenV4AndV5"},{"type":"link","label":"Asynchronous reporting","href":"/docs/dev-guides/AsynchronousReporting","docId":"dev-guides/AsynchronousReporting"},{"type":"link","label":"Attachments (Screenshots) Guide","href":"/docs/dev-guides/AttachmentsGuide","docId":"dev-guides/AttachmentsGuide"},{"type":"link","label":"Back-end Java contribution guide","href":"/docs/dev-guides/BackEndJavaContributionGuide","docId":"dev-guides/BackEndJavaContributionGuide"},{"type":"link","label":"Interactions between API and Analyzer","href":"/docs/dev-guides/InteractionsBetweenAPIAndAnalyzer","docId":"dev-guides/InteractionsBetweenAPIAndAnalyzer"},{"type":"link","label":"Plugin developers guide","href":"/docs/dev-guides/PluginDevelopersGuide","docId":"dev-guides/PluginDevelopersGuide"},{"type":"link","label":"ReportPortal API","href":"/docs/dev-guides/ReportPortalAPI","docId":"dev-guides/ReportPortalAPI"},{"type":"link","label":"Reporting developers guide","href":"/docs/dev-guides/ReportingDevelopersGuide","docId":"dev-guides/ReportingDevelopersGuide"},{"type":"link","label":"Rerun developers guide","href":"/docs/dev-guides/RerunDevelopersGuide","docId":"dev-guides/RerunDevelopersGuide"},{"type":"link","label":"Retries reporting","href":"/docs/dev-guides/RetriesReporting","docId":"dev-guides/RetriesReporting"}],"href":"/docs/category/developers-guides"},{"type":"category","label":"Work with reports","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"View launches","href":"/docs/work-with-reports/ViewLaunches","docId":"work-with-reports/ViewLaunches"},{"type":"link","label":"Operations under launches","href":"/docs/work-with-reports/OperationsUnderLaunches","docId":"work-with-reports/OperationsUnderLaunches"},{"type":"link","label":"Filtering launches","href":"/docs/work-with-reports/FilteringLaunches","docId":"work-with-reports/FilteringLaunches"},{"type":"link","label":"Investigation of failure","href":"/docs/work-with-reports/InvestigationOfFailure","docId":"work-with-reports/InvestigationOfFailure"},{"type":"link","label":"History of launches","href":"/docs/work-with-reports/HistoryOfLaunches","docId":"work-with-reports/HistoryOfLaunches"},{"type":"link","label":"Test case ID","href":"/docs/work-with-reports/TestCaseId","docId":"work-with-reports/TestCaseId"},{"type":"link","label":"Unique ID","href":"/docs/work-with-reports/UniqueId","docId":"work-with-reports/UniqueId"}],"href":"/docs/category/work-with-reports"},{"type":"category","label":"Analysis","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Auto-Analysis of launches","href":"/docs/analysis/AutoAnalysisOfLaunches","docId":"analysis/AutoAnalysisOfLaunches"},{"type":"link","label":"Search for the similar \\"To investigate\\" items","href":"/docs/analysis/SearchForTheSimilarToInvestigateItems","docId":"analysis/SearchForTheSimilarToInvestigateItems"},{"type":"link","label":"ML Suggestions","href":"/docs/analysis/MLSuggestions","docId":"analysis/MLSuggestions"},{"type":"link","label":"How models are retrained","href":"/docs/analysis/HowModelsAreRetrained","docId":"analysis/HowModelsAreRetrained"},{"type":"link","label":"Manual Analysis","href":"/docs/analysis/ManualAnalysis","docId":"analysis/ManualAnalysis"},{"type":"link","label":"Pattern Analysis","href":"/docs/analysis/PatternAnalysis","docId":"analysis/PatternAnalysis"},{"type":"link","label":"Unique Error Analysis","href":"/docs/analysis/UniqueErrorAnalysis","docId":"analysis/UniqueErrorAnalysis"}],"href":"/docs/category/analysis"},{"type":"category","label":"Saved searches (filters)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Create filters","href":"/docs/saved-searches-filters/CreateFilters","docId":"saved-searches-filters/CreateFilters"},{"type":"link","label":"Manage filters","href":"/docs/saved-searches-filters/ManageFilters","docId":"saved-searches-filters/ManageFilters"},{"type":"link","label":"Filters page","href":"/docs/saved-searches-filters/FiltersPage","docId":"saved-searches-filters/FiltersPage"}],"href":"/docs/category/saved-searches-filters"},{"type":"category","label":"Dashboards and widgets","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Possible Dashboards in ReportPortal","href":"/docs/dashboards-and-widgets/PossibleDashboardsInReportPortal","docId":"dashboards-and-widgets/PossibleDashboardsInReportPortal"},{"type":"link","label":"Work with dashboards","href":"/docs/dashboards-and-widgets/WorkWithDashboards","docId":"dashboards-and-widgets/WorkWithDashboards"},{"type":"link","label":"Widget Creation","href":"/docs/dashboards-and-widgets/WidgetCreation","docId":"dashboards-and-widgets/WidgetCreation"},{"type":"link","label":"Manage Widgets","href":"/docs/dashboards-and-widgets/ManageWidgets","docId":"dashboards-and-widgets/ManageWidgets"},{"type":"link","label":"Launch statistics chart","href":"/docs/dashboards-and-widgets/LaunchStatisticsChart","docId":"dashboards-and-widgets/LaunchStatisticsChart"},{"type":"link","label":"Overall statistics","href":"/docs/dashboards-and-widgets/OverallStatistics","docId":"dashboards-and-widgets/OverallStatistics"},{"type":"link","label":"Launches duration chart","href":"/docs/dashboards-and-widgets/LaunchesDurationChart","docId":"dashboards-and-widgets/LaunchesDurationChart"},{"type":"link","label":"Launch execution and issue statistic","href":"/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatistic","docId":"dashboards-and-widgets/LaunchExecutionAndIssueStatistic"},{"type":"link","label":"Project activity panel","href":"/docs/dashboards-and-widgets/ProjectActivityPanel","docId":"dashboards-and-widgets/ProjectActivityPanel"},{"type":"link","label":"Test-cases growth trend chart","href":"/docs/dashboards-and-widgets/TestCasesGrowthTrendChart","docId":"dashboards-and-widgets/TestCasesGrowthTrendChart"},{"type":"link","label":"Investigated percentage of launches","href":"/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunches","docId":"dashboards-and-widgets/InvestigatedPercentageOfLaunches"},{"type":"link","label":"Launches table","href":"/docs/dashboards-and-widgets/LaunchesTable","docId":"dashboards-and-widgets/LaunchesTable"},{"type":"link","label":"Unique bugs table","href":"/docs/dashboards-and-widgets/UniqueBugsTable","docId":"dashboards-and-widgets/UniqueBugsTable"},{"type":"link","label":"Most failed test-cases table (TOP-50)","href":"/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50","docId":"dashboards-and-widgets/MostFailedTestCasesTableTop50"},{"type":"link","label":"Failed cases trend chart","href":"/docs/dashboards-and-widgets/FailedCasesTrendChart","docId":"dashboards-and-widgets/FailedCasesTrendChart"},{"type":"link","label":"Non-passed test-cases trend chart","href":"/docs/dashboards-and-widgets/NonPassedTestCasesTrendChart","docId":"dashboards-and-widgets/NonPassedTestCasesTrendChart"},{"type":"link","label":"Different launches comparison chart","href":"/docs/dashboards-and-widgets/DifferentLaunchesComparisonChart","docId":"dashboards-and-widgets/DifferentLaunchesComparisonChart"},{"type":"link","label":"Passing rate per launch","href":"/docs/dashboards-and-widgets/PassingRatePerLaunch","docId":"dashboards-and-widgets/PassingRatePerLaunch"},{"type":"link","label":"Passing rate summary","href":"/docs/dashboards-and-widgets/PassingRateSummary","docId":"dashboards-and-widgets/PassingRateSummary"},{"type":"link","label":"Flaky test cases table (TOP-20)","href":"/docs/dashboards-and-widgets/FlakyTestCasesTableTop20","docId":"dashboards-and-widgets/FlakyTestCasesTableTop20"},{"type":"link","label":"Cumulative trend chart","href":"/docs/dashboards-and-widgets/CumulativeTrendChart","docId":"dashboards-and-widgets/CumulativeTrendChart"},{"type":"link","label":"Most popular pattern table (TOP-20)","href":"/docs/dashboards-and-widgets/MostPopularPatternTableTop20","docId":"dashboards-and-widgets/MostPopularPatternTableTop20"},{"type":"link","label":"Component health check","href":"/docs/dashboards-and-widgets/ComponentHealthCheck","docId":"dashboards-and-widgets/ComponentHealthCheck"},{"type":"link","label":"Table Component health check","href":"/docs/dashboards-and-widgets/TableComponentHealthCheck","docId":"dashboards-and-widgets/TableComponentHealthCheck"},{"type":"link","label":"Most time-consuming test cases widget (TOP-20)","href":"/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","docId":"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20"}],"href":"/docs/category/dashboards-and-widgets"},{"type":"category","label":"Admin Panel","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"All Projects page","href":"/docs/admin-panel/AllProjectsPage","docId":"admin-panel/AllProjectsPage"},{"type":"link","label":"All Users page","href":"/docs/admin-panel/AllUsersPage","docId":"admin-panel/AllUsersPage"},{"type":"link","label":"Event monitoring","href":"/docs/admin-panel/EventMonitoring","docId":"admin-panel/EventMonitoring"}],"href":"/docs/category/admin-panel"},{"type":"category","label":"Plugins","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manage plugins","href":"/docs/plugins/ManagePlugins","docId":"plugins/ManagePlugins"},{"type":"link","label":"Atlassian Jira Server","href":"/docs/plugins/AtlassianJiraServer","docId":"plugins/AtlassianJiraServer"},{"type":"link","label":"Atlassian Jira Cloud","href":"/docs/plugins/AtlassianJiraCloud","docId":"plugins/AtlassianJiraCloud"},{"type":"link","label":"Azure DevOps BTS","href":"/docs/plugins/AzureDevOpsBTS","docId":"plugins/AzureDevOpsBTS"},{"type":"link","label":"Rally","href":"/docs/plugins/Rally","docId":"plugins/Rally"},{"type":"link","label":"E-mail server","href":"/docs/plugins/EmailServer","docId":"plugins/EmailServer"},{"type":"link","label":"Sauce Labs","href":"/docs/plugins/SauceLabs","docId":"plugins/SauceLabs"}],"href":"/docs/category/plugins"},{"type":"category","label":"Quality Gates","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Quality Gate Purpose","href":"/docs/quality-gates/QualityGatePurpose","docId":"quality-gates/QualityGatePurpose"},{"type":"link","label":"How to install Quality Gates","href":"/docs/quality-gates/HowToInstallQualityGates","docId":"quality-gates/HowToInstallQualityGates"},{"type":"link","label":"Feature overview","href":"/docs/quality-gates/FeatureOverview","docId":"quality-gates/FeatureOverview"},{"type":"link","label":"Upload Quality Gate to ReportPortal","href":"/docs/quality-gates/UploadQualityGateToReportPortal","docId":"quality-gates/UploadQualityGateToReportPortal"},{"type":"link","label":"Quality Rules Configuration","href":"/docs/quality-gates/QualityRulesConfiguration","docId":"quality-gates/QualityRulesConfiguration"},{"type":"link","label":"Quality Gate Edit","href":"/docs/quality-gates/QualityGateEdit","docId":"quality-gates/QualityGateEdit"},{"type":"link","label":"Delete Quality Gates","href":"/docs/quality-gates/DeleteQualityGates","docId":"quality-gates/DeleteQualityGates"},{"type":"link","label":"Assessment of test results using Quality Gates","href":"/docs/quality-gates/AssessmentOfTestResultsUsingQualityGates","docId":"quality-gates/AssessmentOfTestResultsUsingQualityGates"},{"type":"category","label":"Integration with CI/CD","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Integration with GitLab CI","href":"/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","docId":"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI"},{"type":"link","label":"Integration with Jenkins","href":"/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins","docId":"quality-gates/IntegrationWithCICD/IntegrationWithJenkins"}],"href":"/docs/quality-gates/IntegrationWithCICD/"}],"href":"/docs/category/quality-gates"},{"type":"link","label":"User role guides","href":"/docs/user-role-guides/","docId":"user-role-guides/index"},{"type":"category","label":"Issues Troubleshooting","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Tuning CI tool","href":"/docs/issues-troubleshooting/TuningCITool","docId":"issues-troubleshooting/TuningCITool"},{"type":"link","label":"Issues with JIRA bug tracking system: how to resolve","href":"/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","docId":"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve"},{"type":"link","label":"How to avoid local execution reported into project space","href":"/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","docId":"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace"},{"type":"link","label":"How to add a test stack trace to a description automatically","href":"/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","docId":"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically"},{"type":"link","label":"Issues with LDAPS: how to resolve","href":"/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolve","docId":"issues-troubleshooting/IssuesWithLDAPSHowToResolve"},{"type":"link","label":"Resolve Analyzer Known Issues","href":"/docs/issues-troubleshooting/ResolveAnalyzerKnownIssues","docId":"issues-troubleshooting/ResolveAnalyzerKnownIssues"},{"type":"link","label":"How to check LDAP connection","href":"/docs/issues-troubleshooting/HowToCheckLDAPConnection","docId":"issues-troubleshooting/HowToCheckLDAPConnection"},{"type":"link","label":"How to clean up the ReportPortal database using PG_REPACK","href":"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","docId":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack"},{"type":"link","label":"How to clean up the ReportPortal database using VACUUM FULL","href":"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","docId":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull"},{"type":"link","label":"How to resolve issues with migration to the new version","href":"/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","docId":"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion"}],"href":"/docs/category/issues-troubleshooting"},{"type":"category","label":"Case Studies","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Reducing regression time by 50%","href":"/docs/case-studies/ReducingRegressionTimeBy50","docId":"case-studies/ReducingRegressionTimeBy50"},{"type":"link","label":"Increasing test automation stability and visibility","href":"/docs/case-studies/IncreasingTestAutomationStabilityAndVisibility","docId":"case-studies/IncreasingTestAutomationStabilityAndVisibility"},{"type":"link","label":"Reducing regression analysis efforts","href":"/docs/case-studies/ReducingRegressionAnalysisEfforts","docId":"case-studies/ReducingRegressionAnalysisEfforts"},{"type":"link","label":"Improving test automation stability","href":"/docs/case-studies/ImprovingTestAutomationStability","docId":"case-studies/ImprovingTestAutomationStability"}],"href":"/docs/category/case-studies"},{"type":"link","label":"ReportPortal Glossary","href":"/docs/reportportal-glossary/","docId":"reportportal-glossary/index"},{"type":"link","label":"FAQ","href":"/docs/FAQ/","docId":"FAQ/index"},{"type":"category","label":"Terms & conditions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Premium Features","href":"/docs/terms-and-conditions/PremiumFeatures","docId":"terms-and-conditions/PremiumFeatures"},{"type":"link","label":"Google Analytics usage by ReportPortal","href":"/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortal","docId":"terms-and-conditions/GoogleAnalyticsUsageByReportPortal"}],"href":"/docs/category/terms--conditions"}]},"docs":{"admin-panel/AllProjectsPage":{"id":"admin-panel/AllProjectsPage","title":"All Projects page","description":"Users with the Administrator role have access to the ReportPortal \\"Administrate\\" section.","sidebar":"defaultSidebar"},"admin-panel/AllUsersPage":{"id":"admin-panel/AllUsersPage","title":"All Users page","description":"The \\"All Users\\" page in \\"Administrate\\" section provides the access to see all available users in the our Testops system.","sidebar":"defaultSidebar"},"admin-panel/EventMonitoring":{"id":"admin-panel/EventMonitoring","title":"Event monitoring","description":"Starting from version 23.2, ReportPortal can monitor all activities (events) at both the project and instance levels.","sidebar":"defaultSidebar"},"analysis/AutoAnalysisOfLaunches":{"id":"analysis/AutoAnalysisOfLaunches","title":"Auto-Analysis of launches","description":"The analysis feature of the ReportPortal makes it possible for the application to check and pass part of the routine duties by itself.","sidebar":"defaultSidebar"},"analysis/HowModelsAreRetrained":{"id":"analysis/HowModelsAreRetrained","title":"How models are retrained","description":"In the Auto-analysis and ML suggestions processes several models take part:","sidebar":"defaultSidebar"},"analysis/ManualAnalysis":{"id":"analysis/ManualAnalysis","title":"Manual Analysis","description":"Manual Analysis is presented on our test report dashboard by \u201cMake decision\u201d modal.","sidebar":"defaultSidebar"},"analysis/MLSuggestions":{"id":"analysis/MLSuggestions","title":"ML Suggestions","description":"ML suggestions functionality is based on previously analyzed results (either manually or via Auto-analysis feature) using Machine Learning. The functionality is provided by the Analyzer service in combination with ElasticSearch.","sidebar":"defaultSidebar"},"analysis/PatternAnalysis":{"id":"analysis/PatternAnalysis","title":"Pattern Analysis","description":"Pattern analysis is a feature that helps you to speed up test failure analysis by finding common patterns in error logs.","sidebar":"defaultSidebar"},"analysis/SearchForTheSimilarToInvestigateItems":{"id":"analysis/SearchForTheSimilarToInvestigateItems","title":"Search for the similar \\"To investigate\\" items","description":"Let\'s consider below an example of ML-driven failure triage in ReportPortal.","sidebar":"defaultSidebar"},"analysis/UniqueErrorAnalysis":{"id":"analysis/UniqueErrorAnalysis","title":"Unique Error Analysis","description":"You can look at the test failure analysis from different points of view: qualitative (passing rate \u2013 How many tests have failed?) and quantitative (Why have they failed?). For example, if 1000 test cases are failed, then","sidebar":"defaultSidebar"},"case-studies/ImprovingTestAutomationStability":{"id":"case-studies/ImprovingTestAutomationStability","title":"Improving test automation stability","description":"Challenges","sidebar":"defaultSidebar"},"case-studies/IncreasingTestAutomationStabilityAndVisibility":{"id":"case-studies/IncreasingTestAutomationStabilityAndVisibility","title":"Increasing test automation stability and visibility","description":"Challenges","sidebar":"defaultSidebar"},"case-studies/ReducingRegressionAnalysisEfforts":{"id":"case-studies/ReducingRegressionAnalysisEfforts","title":"Reducing regression analysis efforts","description":"Challenges","sidebar":"defaultSidebar"},"case-studies/ReducingRegressionTimeBy50":{"id":"case-studies/ReducingRegressionTimeBy50","title":"Reducing regression time by 50%","description":"EPAM helps a Canadian retail company to reverse-engineer their legacy IBM-based store management system to a modern tech stack. As part of this project, ReportPortal was deployed as a centralized test reporting tool.","sidebar":"defaultSidebar"},"dashboards-and-widgets/ComponentHealthCheck":{"id":"dashboards-and-widgets/ComponentHealthCheck","title":"Component health check","description":"Shows the passing rate of the application components which are indicated by the specified attributes.","sidebar":"defaultSidebar"},"dashboards-and-widgets/CumulativeTrendChart":{"id":"dashboards-and-widgets/CumulativeTrendChart","title":"Cumulative trend chart","description":"Shows the growth trend of summary statistics of launches with the same attribute key.","sidebar":"defaultSidebar"},"dashboards-and-widgets/DifferentLaunchesComparisonChart":{"id":"dashboards-and-widgets/DifferentLaunchesComparisonChart","title":"Different launches comparison chart","description":"The widget allows you to compare statistics for the 2 last launches side by side.","sidebar":"defaultSidebar"},"dashboards-and-widgets/FailedCasesTrendChart":{"id":"dashboards-and-widgets/FailedCasesTrendChart","title":"Failed cases trend chart","description":"The widget shows the trend of growth in the number of failed test cases (Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates) from run to run.","sidebar":"defaultSidebar"},"dashboards-and-widgets/FlakyTestCasesTableTop20":{"id":"dashboards-and-widgets/FlakyTestCasesTableTop20","title":"Flaky test cases table (TOP-20)","description":"Shows the TOP-20 the flakiest test cases within the specified previous launches. The widget defines test cases with the highest percentage of switching their status in the execution. So that you can click on the test cases and be redirected to the last test item in execution to check the reasons.","sidebar":"defaultSidebar"},"dashboards-and-widgets/InvestigatedPercentageOfLaunches":{"id":"dashboards-and-widgets/InvestigatedPercentageOfLaunches","title":"Investigated percentage of launches","description":"The widget can be used in two modes - Launch mode and Timeline mode:","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchesDurationChart":{"id":"dashboards-and-widgets/LaunchesDurationChart","title":"Launches duration chart","description":"The Launch Duration Chart shows the duration of the selected launches.","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchesTable":{"id":"dashboards-and-widgets/LaunchesTable","title":"Launches table","description":"The widget shows a configurable table of launches.","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchExecutionAndIssueStatistic":{"id":"dashboards-and-widgets/LaunchExecutionAndIssueStatistic","title":"Launch execution and issue statistic","description":"The Launch Execution and Issue Statistic chart shows the status and issues statistics for the last launch of a specified range.","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchStatisticsChart":{"id":"dashboards-and-widgets/LaunchStatisticsChart","title":"Launch statistics chart","description":"The widget can be used in two modes - Launch mode and Timeline mode:","sidebar":"defaultSidebar"},"dashboards-and-widgets/ManageWidgets":{"id":"dashboards-and-widgets/ManageWidgets","title":"Manage Widgets","description":"Customize widget","sidebar":"defaultSidebar"},"dashboards-and-widgets/MostFailedTestCasesTableTop50":{"id":"dashboards-and-widgets/MostFailedTestCasesTableTop50","title":"Most failed test-cases table (TOP-50)","description":"The widget contains a table with statistical information about the TOP-50 most problematic test cases.","sidebar":"defaultSidebar"},"dashboards-and-widgets/MostPopularPatternTableTop20":{"id":"dashboards-and-widgets/MostPopularPatternTableTop20","title":"Most popular pattern table (TOP-20)","description":"Widget\'s parameters:","sidebar":"defaultSidebar"},"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20":{"id":"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","title":"Most time-consuming test cases widget (TOP-20)","description":"Show the TOP 20 test cases with the highest duration in the last execution of the specified launch.","sidebar":"defaultSidebar"},"dashboards-and-widgets/NonPassedTestCasesTrendChart":{"id":"dashboards-and-widgets/NonPassedTestCasesTrendChart","title":"Non-passed test-cases trend chart","description":"The widget shows the percent ratio of non-passed test cases \\"Failed + Skipped\\" and \\"Total\\" cases from run to run.","sidebar":"defaultSidebar"},"dashboards-and-widgets/OverallStatistics":{"id":"dashboards-and-widgets/OverallStatistics","title":"Overall statistics","description":"The panel shows a summary of test cases with each status for each selected launch.","sidebar":"defaultSidebar"},"dashboards-and-widgets/PassingRatePerLaunch":{"id":"dashboards-and-widgets/PassingRatePerLaunch","title":"Passing rate per launch","description":"Shows the percentage ratio of Passed test cases to Total test cases for the last run of selected launch.","sidebar":"defaultSidebar"},"dashboards-and-widgets/PassingRateSummary":{"id":"dashboards-and-widgets/PassingRateSummary","title":"Passing rate summary","description":"Shows the percentage ratio of Passed test cases to Total test cases for set of launches.","sidebar":"defaultSidebar"},"dashboards-and-widgets/PossibleDashboardsInReportPortal":{"id":"dashboards-and-widgets/PossibleDashboardsInReportPortal","title":"Possible Dashboards in ReportPortal","description":"ReportPortal.io is a powerful test automation reporting dashboard that acquires a lot of analytics. With this manual, we are wanting to help you to configure simple and understandable reports for your teams.","sidebar":"defaultSidebar"},"dashboards-and-widgets/ProjectActivityPanel":{"id":"dashboards-and-widgets/ProjectActivityPanel","title":"Project activity panel","description":"The widget shows all activities occurring on the project.","sidebar":"defaultSidebar"},"dashboards-and-widgets/TableComponentHealthCheck":{"id":"dashboards-and-widgets/TableComponentHealthCheck","title":"Table Component health check","description":"Shows the detailed statistics of the application components which are indicated by the specified attributes.","sidebar":"defaultSidebar"},"dashboards-and-widgets/TestCasesGrowthTrendChart":{"id":"dashboards-and-widgets/TestCasesGrowthTrendChart","title":"Test-cases growth trend chart","description":"The widget can be used in two modes - Launch mode and Timeline mode:","sidebar":"defaultSidebar"},"dashboards-and-widgets/UniqueBugsTable":{"id":"dashboards-and-widgets/UniqueBugsTable","title":"Unique bugs table","description":"The widget shows real identified bugs, posted to the Bug Tracking System from ReportPortal, and existing bugs, that were added to the items on ReportPortal.","sidebar":"defaultSidebar"},"dashboards-and-widgets/WidgetCreation":{"id":"dashboards-and-widgets/WidgetCreation","title":"Widget Creation","description":"In our test automation dashboard widgets contain special graphical control elements that were designed to provide a simple and","sidebar":"defaultSidebar"},"dashboards-and-widgets/WorkWithDashboards":{"id":"dashboards-and-widgets/WorkWithDashboards","title":"Work with dashboards","description":"Dashboards on our continuous testing platform are special containers, where users can create widgets.","sidebar":"defaultSidebar"},"dev-guides/APIDifferencesBetweenV4AndV5":{"id":"dev-guides/APIDifferencesBetweenV4AndV5","title":"API differences between v4 and v5","description":"New endpoints","sidebar":"defaultSidebar"},"dev-guides/AsynchronousReporting":{"id":"dev-guides/AsynchronousReporting","title":"Asynchronous reporting","description":"Overview","sidebar":"defaultSidebar"},"dev-guides/AttachmentsGuide":{"id":"dev-guides/AttachmentsGuide","title":"Attachments (Screenshots) Guide","description":"The Attachments feature allows you to add any file or screenshot to the test case logs. It can be useful for further test failure analysis.","sidebar":"defaultSidebar"},"dev-guides/BackEndJavaContributionGuide":{"id":"dev-guides/BackEndJavaContributionGuide","title":"Back-end Java contribution guide","description":"Useful links","sidebar":"defaultSidebar"},"dev-guides/InteractionsBetweenAPIAndAnalyzer":{"id":"dev-guides/InteractionsBetweenAPIAndAnalyzer","title":"Interactions between API and Analyzer","description":"Overview","sidebar":"defaultSidebar"},"dev-guides/PluginDevelopersGuide":{"id":"dev-guides/PluginDevelopersGuide","title":"Plugin developers guide","description":"Introduction","sidebar":"defaultSidebar"},"dev-guides/ReportingDevelopersGuide":{"id":"dev-guides/ReportingDevelopersGuide","title":"Reporting developers guide","description":"Preconditions","sidebar":"defaultSidebar"},"dev-guides/ReportPortalAPI":{"id":"dev-guides/ReportPortalAPI","title":"ReportPortal API","description":"To find API documentation for our test automation reporting platform, log in to the ReportPortal application and open the API section in the left menu.","sidebar":"defaultSidebar"},"dev-guides/RerunDevelopersGuide":{"id":"dev-guides/RerunDevelopersGuide","title":"Rerun developers guide","description":"What is rerun","sidebar":"defaultSidebar"},"dev-guides/RetriesReporting":{"id":"dev-guides/RetriesReporting","title":"Retries reporting","description":"Some frameworks allow to retry Test execution according to provided conditions (TestNG) or just retry it predefined number of times.","sidebar":"defaultSidebar"},"FAQ/index":{"id":"FAQ/index","title":"FAQ","description":"On this page, we have put together a list of the most frequently asked questions. Here, you can find prompt responses.","sidebar":"defaultSidebar"},"features/AIFailureReasonDetection":{"id":"features/AIFailureReasonDetection","title":"AI-based failure reason detection","description":"In the realm of test automation, failure analysis often becomes a bottleneck, consuming valuable time and resources. ReportPortal introduces a game-changing solution with its AI-powered failure reason detection feature. Employing advanced Machine Learning (ML) algorithms, this feature streamlines your test processes, enabling quicker, more accurate results.","sidebar":"defaultSidebar"},"features/CategorisationOfFailures":{"id":"features/CategorisationOfFailures","title":"Categorization of failures based on issue roots","description":"In the realm of software development and QA, test failure analysis isn\'t just a task\u2014it\'s a critical practice. The way we categorize test failures informs not only the testing process but also how quickly and efficiently developers can resolve issues. ReportPortal provides an advanced, feature-rich environment for streamlined failure categorization, which is an integral part of any agile development cycle.","sidebar":"defaultSidebar"},"features/QualityGates":{"id":"features/QualityGates","title":"Quality Gates","description":"Quality Gates is a feature thanks to which ReportPortal becomes an integral part of continuous testing platform. It prevents the code from moving forward if it doesn\u2019t meet testing criteria. ReportPortal uses aggregated data and rule engine to verify testing results against required conditions.","sidebar":"defaultSidebar"},"features/RealTimeReporting":{"id":"features/RealTimeReporting","title":"Real-time reporting","description":"Real-time test reporting provides the most current data without delay. Thanks to near real-time capabilities, you can receive the first test results in a matter of seconds after the execution has started and benefit from the advantage of getting the entire execution results before it is completed.","sidebar":"defaultSidebar"},"features/RESTAPI":{"id":"features/RESTAPI","title":"REST API","description":"ReportPortal offers a robust set of features through its REST API, covering test data, user data, project data, statistics, integrations, and more.","sidebar":"defaultSidebar"},"features/RichArtifactsInTestReports":{"id":"features/RichArtifactsInTestReports","title":"Rich artifacts in test reports","description":"Test execution report in ReportPortal may contain extra details in addition to the standard test results (passed/failed status).","sidebar":"defaultSidebar"},"features/UnifiedTestReporting":{"id":"features/UnifiedTestReporting","title":"Single-entry point and unified test reporting","description":"ReportPortal was created with the idea in mind to be a single tool to acquire and aggregate the results of all automated tests for projects. Our centralized test automation tool is a great focus area for managers and test engineers because all test results can be accessed, reviewed and analyzed in one place.","sidebar":"defaultSidebar"},"features/VisualisationOfTestResults":{"id":"features/VisualisationOfTestResults","title":"Visualization of test data","description":"ReportPortal\'s dynamic visualization capabilities provide teams with real-time insights, enabling them to make informed decisions quickly and efficiently.","sidebar":"defaultSidebar"},"installation-steps/AdditionalConfigurationParameters":{"id":"installation-steps/AdditionalConfigurationParameters","title":"Additional configuration parameters","description":"| Configuration parameter | Default Value | Service | Description |","sidebar":"defaultSidebar"},"installation-steps/BasicMonitoringConfiguration":{"id":"installation-steps/BasicMonitoringConfiguration","title":"Basic monitoring configuration","description":"The common ReportPortal instance consists of two main parts \u2013 the application server and the database server \u2013 both of which must be covered by basic system-level and application-level metrics. Basic system-level monitoring should include metrics tracking the main application and database servers\' VM and cluster resources, such as:","sidebar":"defaultSidebar"},"installation-steps/DeployOnUbuntuOS":{"id":"installation-steps/DeployOnUbuntuOS","title":"Deploy on Ubuntu OS","description":"*Provided by @Tset Noitamotuahe. The article might be outdated.","sidebar":"defaultSidebar"},"installation-steps/DeployWithAWSECSFargate":{"id":"installation-steps/DeployWithAWSECSFargate","title":"Deploy with AWS ECS Fargate","description":"Provided by contributor, not verified by RP team, please use with caution.","sidebar":"defaultSidebar"},"installation-steps/DeployWithDockerOnLinuxMac":{"id":"installation-steps/DeployWithDockerOnLinuxMac","title":"Deploy with Docker on Linux/Mac","description":"Make your test automation reporting more portable. Reduce the risk of configuration issues with your test reporting tool using Docker.","sidebar":"defaultSidebar"},"installation-steps/DeployWithDockerOnWindows":{"id":"installation-steps/DeployWithDockerOnWindows","title":"Deploy with Docker on Windows","description":"A portable way to manage your real time test results. Using Docker makes it easy to share test execution report and collaborate with other team members.","sidebar":"defaultSidebar"},"installation-steps/DeployWithKubernetes":{"id":"installation-steps/DeployWithKubernetes","title":"Deploy with Kubernetes","description":"We use Helm package manager charts to bootstrap a ReportPortal deployment on a Kubernetes cluster","sidebar":"defaultSidebar"},"installation-steps/DeployWithoutDocker":{"id":"installation-steps/DeployWithoutDocker","title":"Deploy without Docker","description":"*The instruction designed for the version 5.3.5 and might be outdated for the latest versions.","sidebar":"defaultSidebar"},"installation-steps/MaintainCommandsCheatSheet":{"id":"installation-steps/MaintainCommandsCheatSheet","title":"Maintain commands Cheat sheet","description":"Export as env var:","sidebar":"defaultSidebar"},"installation-steps/OptimalPerformanceHardwareSetup":{"id":"installation-steps/OptimalPerformanceHardwareSetup","title":"Optimal Performance Hardware setup","description":"Find below the recommended hardware configuration to set up ReportPortal and have good performance using our centralized test automation tool.","sidebar":"defaultSidebar"},"installation-steps/ReportPortal23.1FileStorageOptions":{"id":"installation-steps/ReportPortal23.1FileStorageOptions","title":"ReportPortal 23.1 File storage options","description":"In ReportPortal 23.1 we can use multiple ways to store log attachments, user pictures and plugins.","sidebar":"defaultSidebar"},"installation-steps/ScalingUpReportPortalAPIService":{"id":"installation-steps/ScalingUpReportPortalAPIService","title":"Scaling Up the ReportPortal Service API","description":"Due to the current implementation specifics Asynchronous Reporting Scheme, horizontal auto-scaling of the ReportPortal service API is not feasible. However, manual scaling is achievable. This limitation stems from the way RabbitMQ, in conjunction with the API, manages the number of queues on the RabbitMQ side.","sidebar":"defaultSidebar"},"installation-steps/SetupTSLSSLInTraefik2.0.x":{"id":"installation-steps/SetupTSLSSLInTraefik2.0.x","title":"Setup TLS(SSL) in Traefik 2.0.x","description":"This is a short guideline that provides information on how to configure ReportPortal to use Let TLS/SSL certificate setup for your existing ReportPortal environment.","sidebar":"defaultSidebar"},"intro":{"id":"intro","title":"What is ReportPortal?","description":"How to get started with our test reporting tool. Improve testing process with ML-driven failure triage. Get real time results and test failure analytics.","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically":{"id":"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","title":"How to add a test stack trace to a description automatically","description":"You can make your process of a test analysis more convenient and quick by adding a description for failed tests that will include a last error message from the test log.","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace":{"id":"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","title":"How to avoid local execution reported into project space","description":"Option 1:","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToCheckLDAPConnection":{"id":"issues-troubleshooting/HowToCheckLDAPConnection","title":"How to check LDAP connection","description":"Firstly, check the availability of your LDAP server from the server when ReportPortal is installed. For example, use the command ldapsearch.","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack":{"id":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","title":"How to clean up the ReportPortal database using PG_REPACK","description":"Description","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull":{"id":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","title":"How to clean up the ReportPortal database using VACUUM FULL","description":"General information","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion":{"id":"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","title":"How to resolve issues with migration to the new version","description":"Error: Dirty database version XX. Fix and force version.","sidebar":"defaultSidebar"},"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve":{"id":"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","title":"Issues with JIRA bug tracking system: how to resolve","description":"In case user is connecting to JIRA system and gets the error like","sidebar":"defaultSidebar"},"issues-troubleshooting/IssuesWithLDAPSHowToResolve":{"id":"issues-troubleshooting/IssuesWithLDAPSHowToResolve","title":"Issues with LDAPS: how to resolve","description":"When configuring LDAP to work with ldaps","sidebar":"defaultSidebar"},"issues-troubleshooting/ResolveAnalyzerKnownIssues":{"id":"issues-troubleshooting/ResolveAnalyzerKnownIssues","title":"Resolve Analyzer Known Issues","description":"Problem 1. Auto-Analyser doesn\'t work. Analyzer health check status failed: Elasticsearch is not healthy","sidebar":"defaultSidebar"},"issues-troubleshooting/TuningCITool":{"id":"issues-troubleshooting/TuningCITool","title":"Tuning CI tool","description":"How to provide parameters via system variables in the CI tool (for example - Jenkins) for our continuous testing platform.","sidebar":"defaultSidebar"},"log-data-in-reportportal/HowToRunYourTests":{"id":"log-data-in-reportportal/HowToRunYourTests","title":"How to run your tests","description":"Automated tests can be executed in the any CI tool you are using on the project (Jenkins, Bamboo, Azure DevOps, GitHub Actions, CircleCI, TeamCity, GitLab, Travis CI, Codeship, Buddy, GoCD, Wercker and more).","sidebar":"defaultSidebar"},"log-data-in-reportportal/ImplementOwnIntegration":{"id":"log-data-in-reportportal/ImplementOwnIntegration","title":"Implement own integration","description":"You can find a detailed description of how report results to ReportPortal in our developers` guide.","sidebar":"defaultSidebar"},"log-data-in-reportportal/ImportDataToReportPortal":{"id":"log-data-in-reportportal/ImportDataToReportPortal","title":"Import data to ReportPortal","description":"Import functionality gives the opportunity to upload log files via UI.","sidebar":"defaultSidebar"},"log-data-in-reportportal/index":{"id":"log-data-in-reportportal/index","title":"Log data in ReportPortal","description":"ReportPortal is a CI/CD agnostic tool. Therefore, you can continue using your favorite CI/CD tool (GitLab, Jenkins, GitHub, Azure DevOps, Bamboo) to send data to ReportPortal and get test results of execution.","sidebar":"defaultSidebar"},"log-data-in-reportportal/ReportingSDK":{"id":"log-data-in-reportportal/ReportingSDK","title":"Reporting SDK","description":"How to report tests with nested steps?","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/index":{"id":"log-data-in-reportportal/test-framework-integration/index","title":"Test Framework Integration","description":"ReportPortal is a system that integrates with your Test Framework, listens for events and visualizes test results. You cannot execute results right from ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Cucumber":{"id":"log-data-in-reportportal/test-framework-integration/Java/Cucumber","title":"ReportPortal Cucumber Integration","description":"There is an agent to integrate Cucumber with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/index":{"id":"log-data-in-reportportal/test-framework-integration/Java/index","title":"Java","description":"To integrate your Java test framework with ReportPortal, you need to create a file named reportportal.properties in your in your Java project in a source folder src/main/resources or src/test/resources (depending on where your tests are located):","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/JBehave":{"id":"log-data-in-reportportal/test-framework-integration/Java/JBehave","title":"ReportPortal JBehave Integration","description":"There is an agent to integrate JBehave with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/JUnit4":{"id":"log-data-in-reportportal/test-framework-integration/Java/JUnit4","title":"ReportPortal JUnit4 Integration","description":"There is an agent to integrate JUnit4 with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/JUnit5":{"id":"log-data-in-reportportal/test-framework-integration/Java/JUnit5","title":"ReportPortal JUnit5 Integration","description":"There is an agent to integrate JUnit5 with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","title":"ReportPortal Apache HttpComponents Integration","description":"The logger intercept and logs all Requests and Responses issued by Apache HttpComponents into ReportPortal in Markdown format, including multipart requests. It recognizes payload types and attach them in corresponding manner: image types will be logged as images with thumbnails, binary types will be logged as entry attachments, text types will be formatted and logged in Markdown code blocks.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","title":"ReportPortal Log4J Integration","description":"Log4j is one of several Java logging frameworks that provides a flexible and configurable way to capture and manage application logs.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","title":"ReportPortal Logback Integration","description":"Using the Logback appender for ReportPortal, developers can collect and send the logs generated by their application to ReportPortal for additional analysis and reporting. Using this appender, developers can configure Logback to send logs directly to ReportPortal, where they can be examined alongside other testing data to understand the behavior of the application and identify any issues.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","title":"ReportPortal OkHttp3 Integration","description":"The logger intercept and logs all Requests and Responses issued by OkHttp into ReportPortal in Markdown format, including multipart requests. It recognizes payload types and attach them in corresponding manner: image types will be logged as images with thumbnails, binary types will be logged as entry attachments, text types will be formatted and logged in Markdown code blocks.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","title":"ReportPortal Rest Assured Integration","description":"The logger intercept and logs all Requests and Responses issued by REST Assured into ReportPortal in Markdown format, including multipart","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","title":"ReportPortal Selenide Integration","description":"Selenide step logging listener for ReportPortal. The listener listen for Selenide log events and send them to Report Portal as steps. It has ability to log screenshots and page sources on failure, this is enabled by default. Also, it is possible to attach different types of WebDriver logs on failure.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/SoapUI":{"id":"log-data-in-reportportal/test-framework-integration/Java/SoapUI","title":"ReportPortal SoapUI Integration","description":"There is an agent to integrate SoapUI with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Spock":{"id":"log-data-in-reportportal/test-framework-integration/Java/Spock","title":"ReportPortal Spock Integration","description":"There is an agent to integrate Spock with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/TestNG":{"id":"log-data-in-reportportal/test-framework-integration/Java/TestNG","title":"ReportPortal TestNG Integration","description":"There is an agent to integrate TestNG with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","title":"ReportPortal Codecept Integration","description":"There is an agent to integrate Codecept with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","title":"ReportPortal CucumberJS Integration","description":"There is an agent to integrate CucumberJS with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","title":"ReportPortal Cypress Integration","description":"There is an agent to integrate Cypress with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/index":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/index","title":"JavaScript","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","title":"ReportPortal Jasmine Integration","description":"There is an agent to integrate Jasmine with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Jest":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Jest","title":"ReportPortal Jest Integration","description":"There is an agent to integrate Jest with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","title":"ReportPortal Mocha Integration","description":"There is an agent to integrate Mocha with ReportPortal. It was designed to work with mocha programmatically, in order to be able to parametrize each test run.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","title":"ReportPortal Nightwatch Integration","description":"There is an agent to integrate Nightwatch with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","title":"ReportPortal Playwright Integration","description":"There is an agent to integrate Playwright with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Postman":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Postman","title":"ReportPortal Postman Integration","description":"There is an agent to integrate Postman (based on Newman collection runner) with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","title":"ReportPortal TestCafe Integration","description":"There is an agent to integrate TestCafe with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","title":"ReportPortal WebdriverIO Integration","description":"There is an agent to integrate Webdriver.io with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/index":{"id":"log-data-in-reportportal/test-framework-integration/Net/index","title":".Net","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","title":"ReportPortal Log4Net Integration","description":"Log4net is a logging library for .NET applications. It offers a versatile and customizable architecture for recording application events to a number of locations, including files, databases, and remote servers.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","title":"ReportPortal NLog Integration","description":"NLog is a logging platform for .NET platforms. It supports a range of logging formats, including plain text and JSON.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","title":"ReportPortal Serilog Integration","description":"Serilog is a logging library for .Net. Serilog was created with powerful organized event data in mind, unlike other logging libraries.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","title":"ReportPortal TraceListener Integration","description":"TraceListener is a component of the .NET Framework\'s logging system. Provides receiving and handling trace messages and forwarding them to the appropriate destination.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/NUnit":{"id":"log-data-in-reportportal/test-framework-integration/Net/NUnit","title":"ReportPortal NUnit Integration","description":"There is an agent to integrate NUnit with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/SpecFlow":{"id":"log-data-in-reportportal/test-framework-integration/Net/SpecFlow","title":"ReportPortal SpecFlow Integration","description":"There is an agent to integrate SpecFlow with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/VSTest":{"id":"log-data-in-reportportal/test-framework-integration/Net/VSTest","title":"ReportPortal VSTest Integration","description":"There is an agent to integrate VSTest with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/xUnit":{"id":"log-data-in-reportportal/test-framework-integration/Net/xUnit","title":"ReportPortal xUnit Integration","description":"There is an agent to integrate xUnit with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Other/index":{"id":"log-data-in-reportportal/test-framework-integration/Other/index","title":"Other","description":"Please find the full list of available integrations with test frameworks in our GitHub repositories.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/Behat":{"id":"log-data-in-reportportal/test-framework-integration/PHP/Behat","title":"ReportPortal Behat Integration","description":"There is an agent to integrate Behat with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/Codeception":{"id":"log-data-in-reportportal/test-framework-integration/PHP/Codeception","title":"ReportPortal Codeception Integration","description":"There is an agent to integrate Codeception-based test framework with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/index":{"id":"log-data-in-reportportal/test-framework-integration/PHP/index","title":"PHP","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit":{"id":"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","title":"ReportPortal PHPUnit Integration","description":"There is an agent to integrate PHPUnit with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/behave":{"id":"log-data-in-reportportal/test-framework-integration/Python/behave","title":"ReportPortal behave Integration","description":"There is Behave extension for reporting test results of Behave to the ReportalPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/index":{"id":"log-data-in-reportportal/test-framework-integration/Python/index","title":"Python","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/nosetests":{"id":"log-data-in-reportportal/test-framework-integration/Python/nosetests","title":"ReportPortal nosetests Integration","description":"There is Nose plugin for reporting test results of Nose to the ReportalPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/pytest":{"id":"log-data-in-reportportal/test-framework-integration/Python/pytest","title":"ReportPortal pytest Integration","description":"There is an agent to integrate pytest with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/RobotFramework":{"id":"log-data-in-reportportal/test-framework-integration/Python/RobotFramework","title":"ReportPortal Robot Framework Integration","description":"There is a Listener for RobotFramework to report results to ReportPortal.","sidebar":"defaultSidebar"},"plugins/AtlassianJiraCloud":{"id":"plugins/AtlassianJiraCloud","title":"Atlassian Jira Cloud","description":"ReportPortal and Jira Cloud integration streamlines testing, tracks issues and enhances collaboration for improved productivity.","sidebar":"defaultSidebar"},"plugins/AtlassianJiraServer":{"id":"plugins/AtlassianJiraServer","title":"Atlassian Jira Server","description":"To install the Jira Server plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"plugins/AzureDevOpsBTS":{"id":"plugins/AzureDevOpsBTS","title":"Azure DevOps BTS","description":"To install the Azure DevOps BTS plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"plugins/EmailServer":{"id":"plugins/EmailServer","title":"E-mail server","description":"E-mail server plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"plugins/ManagePlugins":{"id":"plugins/ManagePlugins","title":"Manage plugins","description":"ReportPortal as a test management system can be reinforced by uploading plugins. For now, you can install the next plugins from the box:","sidebar":"defaultSidebar"},"plugins/Rally":{"id":"plugins/Rally","title":"Rally","description":"To install the Rally plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"plugins/SauceLabs":{"id":"plugins/SauceLabs","title":"Sauce Labs","description":"To install the Sauce Labs plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"quality-gates/AssessmentOfTestResultsUsingQualityGates":{"id":"quality-gates/AssessmentOfTestResultsUsingQualityGates","title":"Assessment of test results using Quality Gates","description":"Now the system is preconfigured, and you can start using Quality Gates Analysis.","sidebar":"defaultSidebar"},"quality-gates/DeleteQualityGates":{"id":"quality-gates/DeleteQualityGates","title":"Delete Quality Gates","description":"If you want to delete Quality Gate:","sidebar":"defaultSidebar"},"quality-gates/FeatureOverview":{"id":"quality-gates/FeatureOverview","title":"Feature overview","description":"Quality Gate analysis provides capabilities to speed up CI/CD pipeline by sending auto-feedback to your CI/CD tools. ReportPortal assesses the build quality and sends auto feedback to CI/CD.","sidebar":"defaultSidebar"},"quality-gates/HowToInstallQualityGates":{"id":"quality-gates/HowToInstallQualityGates","title":"How to install Quality Gates","description":"The Quality Gate feature is available in the scope of the ReportPortal premium version started from version 5.6. Our continuous testing platform provides it for clients in the scope of paid support engagement.","sidebar":"defaultSidebar"},"quality-gates/IntegrationWithCICD/index":{"id":"quality-gates/IntegrationWithCICD/index","title":"Integration with CI/CD","description":"ReportPortal is a CI agnostic tool, it integrates on the test framework level, but to ease configuration we have auxiliary code in RP for some CI tools.","sidebar":"defaultSidebar"},"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI":{"id":"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","title":"Integration with GitLab CI","description":"In this tutorial we will walk you through the process of integrating ReportPortal with GitLab CI. It is not the case for GitLab, but there are some recipes.","sidebar":"defaultSidebar"},"quality-gates/IntegrationWithCICD/IntegrationWithJenkins":{"id":"quality-gates/IntegrationWithCICD/IntegrationWithJenkins","title":"Integration with Jenkins","description":"Jenkins configuration","sidebar":"defaultSidebar"},"quality-gates/QualityGateEdit":{"id":"quality-gates/QualityGateEdit","title":"Quality Gate Edit","description":"If user edit Quality Gates, previous reports for these Quality Gates would not be recalculated.","sidebar":"defaultSidebar"},"quality-gates/QualityGatePurpose":{"id":"quality-gates/QualityGatePurpose","title":"Quality Gate Purpose","description":"ReportPortal is a continuous testing platform with build-in functionality - Quality Gates.","sidebar":"defaultSidebar"},"quality-gates/QualityRulesConfiguration":{"id":"quality-gates/QualityRulesConfiguration","title":"Quality Rules Configuration","description":"Now let\'s configure the Quality rule, which will be used for launch quality assessment.","sidebar":"defaultSidebar"},"quality-gates/UploadQualityGateToReportPortal":{"id":"quality-gates/UploadQualityGateToReportPortal","title":"Upload Quality Gate to ReportPortal","description":"The default configuration of our continuous testing platform doesn\'t contain Quality Gate. For adding this feature, you need to receive a link to the .jar file from ReportPortal.","sidebar":"defaultSidebar"},"releases/Version23.2":{"id":"releases/Version23.2","title":"Version v.23.2","description":"1. What\'s Changed:","sidebar":"defaultSidebar"},"releases/Version3.3.2":{"id":"releases/Version3.3.2","title":"Version 3.3.2","description":"milestone 3.3","sidebar":"defaultSidebar"},"releases/Version3.3.2-1":{"id":"releases/Version3.3.2-1","title":"Version 3.3.2-1","description":"Update instructions","sidebar":"defaultSidebar"},"releases/Version4.0.0":{"id":"releases/Version4.0.0","title":"Version 4.0.0","description":"Issues and features in milestone 4.0","sidebar":"defaultSidebar"},"releases/Version4.1.0":{"id":"releases/Version4.1.0","title":"Version 4.1.0","description":"Issues and features in milestone 4.1","sidebar":"defaultSidebar"},"releases/Version4.2.0":{"id":"releases/Version4.2.0","title":"Version 4.2.0","description":"Features","sidebar":"defaultSidebar"},"releases/Version4.3":{"id":"releases/Version4.3","title":"Version 4.2.0","description":"Features","sidebar":"defaultSidebar"},"releases/Version5.0.0":{"id":"releases/Version5.0.0","title":"Version 5.0.0","description":"Finally we are glad to introduce a new release of ReportPortal.","sidebar":"defaultSidebar"},"releases/Version5.0RC":{"id":"releases/Version5.0RC","title":"Version 5.0RC","description":"This is the Beta release.","sidebar":"defaultSidebar"},"releases/Version5.1.0":{"id":"releases/Version5.1.0","title":"Version 5.1.0","description":"Important: We are constantly improving ReportPortal. And in version 5.1 we have changed a way we encrypt your personal data. Please be aware, that for successful interaction with version 5.1 you need to change a password at the first login.","sidebar":"defaultSidebar"},"releases/Version5.2.0":{"id":"releases/Version5.2.0","title":"Version 5.2.0","description":"Small and nice updates","sidebar":"defaultSidebar"},"releases/Version5.2.1":{"id":"releases/Version5.2.1","title":"Version 5.2.1","description":"Fix reportportal/kubernetes #115","sidebar":"defaultSidebar"},"releases/Version5.2.2":{"id":"releases/Version5.2.2","title":"Version 5.2.2","description":"Improvements","sidebar":"defaultSidebar"},"releases/Version5.2.3":{"id":"releases/Version5.2.3","title":"Version 5.2.3","description":"Bugs","sidebar":"defaultSidebar"},"releases/Version5.3.0":{"id":"releases/Version5.3.0","title":"Version 5.3.0","description":"Brand new features","sidebar":"defaultSidebar"},"releases/Version5.3.1.":{"id":"releases/Version5.3.1.","title":"Version 5.3.1","description":"Bug fixing","sidebar":"defaultSidebar"},"releases/Version5.3.2":{"id":"releases/Version5.3.2","title":"Version 5.3.2","description":"Bug fixing","sidebar":"defaultSidebar"},"releases/Version5.3.3":{"id":"releases/Version5.3.3","title":"Version 5.3.3","description":"New features","sidebar":"defaultSidebar"},"releases/Version5.3.5":{"id":"releases/Version5.3.5","title":"Version 5.3.5","description":"- Fixed: #950 Problems with DB locks on SELECT","sidebar":"defaultSidebar"},"releases/Version5.4.0":{"id":"releases/Version5.4.0","title":"Version 5.4.0","description":"Migration guide","sidebar":"defaultSidebar"},"releases/Version5.5.0":{"id":"releases/Version5.5.0","title":"Version 5.5.0","description":"Migration guide","sidebar":"defaultSidebar"},"releases/Version5.6.0":{"id":"releases/Version5.6.0","title":"Version 5.6.0","description":"Migration guide","sidebar":"defaultSidebar"},"releases/Version5.6.1":{"id":"releases/Version5.6.1","title":"Version 5.6.1","description":"Bugfixing","sidebar":"defaultSidebar"},"releases/Version5.6.2":{"id":"releases/Version5.6.2","title":"Version 5.6.2","description":"- ReportPortal release 5.6.2 aimed at fixing Log4J vulnerabilities: CVE-2021-44228, CVE-2021-45046 and CVE-2021-45105","sidebar":"defaultSidebar"},"releases/Version5.6.3":{"id":"releases/Version5.6.3","title":"Version 5.6.3","description":"Bugfixing","sidebar":"defaultSidebar"},"releases/Version5.7.0":{"id":"releases/Version5.7.0","title":"Version 5.7.0","description":"New Features:","sidebar":"defaultSidebar"},"releases/Version5.7.1":{"id":"releases/Version5.7.1","title":"Version 5.7.1","description":"Technical Improvements:","sidebar":"defaultSidebar"},"releases/Version5.7.2":{"id":"releases/Version5.7.2","title":"Version 5.7.2","description":"What\'s Changed:","sidebar":"defaultSidebar"},"releases/Version5.7.3":{"id":"releases/Version5.7.3","title":"Version 5.7.3","description":"Features:","sidebar":"defaultSidebar"},"releases/Version5.7.4":{"id":"releases/Version5.7.4","title":"Version 5.7.4","description":"What\'s Changed:","sidebar":"defaultSidebar"},"releases/Versionv23.1":{"id":"releases/Versionv23.1","title":"Version v.23.1","description":"1. What\'s Changed:","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/ActiveDirectory":{"id":"reportportal-configuration/authorization/ActiveDirectory","title":"Active Directory","description":"Active Directory plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/GitHub":{"id":"reportportal-configuration/authorization/GitHub","title":"GitHub","description":"Our open source test reporting tool allows logging in via GitHub OAuth Web Application Flow.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/index":{"id":"reportportal-configuration/authorization/index","title":"Authorization","description":"ReportPortal Admin can configure an easy authorization on the instance. From the box we provide OAuth with:","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/LDAP":{"id":"reportportal-configuration/authorization/LDAP","title":"LDAP","description":"LDAP plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/SAMLProvider/AzureSAML":{"id":"reportportal-configuration/authorization/SAMLProvider/AzureSAML","title":"Azure SAML","description":"SAML plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/SAMLProvider/index":{"id":"reportportal-configuration/authorization/SAMLProvider/index","title":"SAML provider","description":"If you have a pre-created Internal user, you can\'t log in by SAML using their credentials (Email or Name).","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/SAMLProvider/OktaSAML":{"id":"reportportal-configuration/authorization/SAMLProvider/OktaSAML","title":"Okta SAML","description":"SAML plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/ComponentsOverview":{"id":"reportportal-configuration/ComponentsOverview","title":"Components Overview","description":"Gateway","sidebar":"defaultSidebar"},"reportportal-configuration/CreationOfProjectAndAddingUsers":{"id":"reportportal-configuration/CreationOfProjectAndAddingUsers","title":"Creation of project and adding users","description":"The main question of how you can organize your working space in ReportPortal.","sidebar":"defaultSidebar"},"reportportal-configuration/HowToGetAnAccessTokenInReportPortal":{"id":"reportportal-configuration/HowToGetAnAccessTokenInReportPortal","title":"How to get an access token in ReportPortal","description":"There are two ways to authorize in the ReportPortal API:","sidebar":"defaultSidebar"},"reportportal-configuration/IntegrationViaPlugin":{"id":"reportportal-configuration/IntegrationViaPlugin","title":"Integration via plugin","description":"Users can reinforce ReportPortal with adding additional integrations with:","sidebar":"defaultSidebar"},"reportportal-configuration/ProjectConfiguration":{"id":"reportportal-configuration/ProjectConfiguration","title":"Project configuration","description":"To see the list of available projects and open a project, click the drop-down list in the top of the left menu.","sidebar":"defaultSidebar"},"reportportal-configuration/ReportPortalJobsConfiguration":{"id":"reportportal-configuration/ReportPortalJobsConfiguration","title":"ReportPortal jobs configuration","description":"Currently, ReportPortal has 5 configurable jobs for data removing:","sidebar":"defaultSidebar"},"reportportal-glossary/index":{"id":"reportportal-glossary/index","title":"ReportPortal Glossary","description":"Agent","sidebar":"defaultSidebar"},"reportportal-tutorial/index":{"id":"reportportal-tutorial/index","title":"ReportPortal Tutorial","description":"ReportPortal guide. How to do test failure analysis, how to create dashboard to manage test results and use capabilities of continuous testing platform.","sidebar":"defaultSidebar"},"saved-searches-filters/CreateFilters":{"id":"saved-searches-filters/CreateFilters","title":"Create filters","description":"Filters in the our test automation reporting dashboard are saved searches of the launches.","sidebar":"defaultSidebar"},"saved-searches-filters/FiltersPage":{"id":"saved-searches-filters/FiltersPage","title":"Filters page","description":"You can see the list of your saved searches and filters created by other team members on the \\"Filters\\" page.","sidebar":"defaultSidebar"},"saved-searches-filters/ManageFilters":{"id":"saved-searches-filters/ManageFilters","title":"Manage filters","description":"Filters feature is a base for data visualization in test automation because widgets are built on their basis.","sidebar":"defaultSidebar"},"terms-and-conditions/GoogleAnalyticsUsageByReportPortal":{"id":"terms-and-conditions/GoogleAnalyticsUsageByReportPortal","title":"Google Analytics usage by ReportPortal","description":"ReportPortal uses Google Analytics (GA) for web analytics capabilities. GA helps the ReportPortal Team to understand product usage and make ReportPortal more convenient and useful for our users. To address any concerns about the data we collect, we want to be transparent about which data is sent to GA, and assure you that no personal or confidential data is transferred. To be clear, we do not gather personal information at all through GA. In this article, we explain how Google Analytics works on ReportPortal, its benefits, and how you can turn it off if you want.","sidebar":"defaultSidebar"},"terms-and-conditions/PremiumFeatures":{"id":"terms-and-conditions/PremiumFeatures","title":"Premium Features","description":"At ReportPortal, we understand that every enterprise\'s testing environment is unique, requiring tailored solutions that address specific needs. To cater to this demand, we\'ve introduced our Premium Features, exclusively available to our Managed Services and SaaS subscription clients.","sidebar":"defaultSidebar"},"user-account/DataRetentionProcedure":{"id":"user-account/DataRetentionProcedure","title":"Data retention procedure","description":"Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days.","sidebar":"defaultSidebar"},"user-account/DeleteAccount":{"id":"user-account/DeleteAccount","title":"Delete account","description":"Starting from version 23.2, ReportPortal users can delete their accounts along with their personal data.","sidebar":"defaultSidebar"},"user-account/EditPersonalInformation":{"id":"user-account/EditPersonalInformation","title":"Edit personal information","description":"To navigate to the User Profile page, open menu at the bottom of the page and select \\"Profile\\" option.","sidebar":"defaultSidebar"},"user-account/RestoreAPassword":{"id":"user-account/RestoreAPassword","title":"Restore a password","description":"If you forgot your password, you can restore it on the login page. To do that, perform the following steps:","sidebar":"defaultSidebar"},"user-role-guides/index":{"id":"user-role-guides/index","title":"User role guides","description":"Here are the links to User Guide sections divided by ReportPortal User roles.","sidebar":"defaultSidebar"},"work-with-reports/FilteringLaunches":{"id":"work-with-reports/FilteringLaunches","title":"Filtering launches","description":"The data tables for the \\"Launches\\" and the \\"Debug\\" modes can be filtered with","sidebar":"defaultSidebar"},"work-with-reports/HistoryOfLaunches":{"id":"work-with-reports/HistoryOfLaunches","title":"History of launches","description":"Historical trend of executions","sidebar":"defaultSidebar"},"work-with-reports/InvestigationOfFailure":{"id":"work-with-reports/InvestigationOfFailure","title":"Investigation of failure","description":"Set defect type","sidebar":"defaultSidebar"},"work-with-reports/OperationsUnderLaunches":{"id":"work-with-reports/OperationsUnderLaunches","title":"Operations under launches","description":"There are several ways of how launches could be modified and managed in our test automation reporting dashboard.","sidebar":"defaultSidebar"},"work-with-reports/TestCaseId":{"id":"work-with-reports/TestCaseId","title":"Test case ID","description":"What is it: Test case ID","sidebar":"defaultSidebar"},"work-with-reports/UniqueId":{"id":"work-with-reports/UniqueId","title":"Unique ID","description":"(deprecated/ will be replaced by Test Case ID gradually)","sidebar":"defaultSidebar"},"work-with-reports/ViewLaunches":{"id":"work-with-reports/ViewLaunches","title":"View launches","description":"Viewing information about all launches","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.d2adc4b1.js b/assets/js/935f2afb.d2adc4b1.js deleted file mode 100644 index e8c574a09..000000000 --- a/assets/js/935f2afb.d2adc4b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"defaultSidebar":[{"type":"link","label":"What is ReportPortal?","href":"/docs/","docId":"intro"},{"type":"category","label":"Features","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Unified test reporting","href":"/docs/features/UnifiedTestReporting","docId":"features/UnifiedTestReporting"},{"type":"link","label":"Categorisation of failures","href":"/docs/features/CategorisationOfFailures","docId":"features/CategorisationOfFailures"},{"type":"link","label":"AI failure reason detection","href":"/docs/features/AIFailureReasonDetection","docId":"features/AIFailureReasonDetection"},{"type":"link","label":"Rich artifacts in test reports","href":"/docs/features/RichArtifactsInTestReports","docId":"features/RichArtifactsInTestReports"},{"type":"link","label":"Real-time reporting","href":"/docs/features/RealTimeReporting","docId":"features/RealTimeReporting"},{"type":"link","label":"Visualisation of test results","href":"/docs/features/VisualisationOfTestResults","docId":"features/VisualisationOfTestResults"},{"type":"link","label":"Quality Gates","href":"/docs/features/QualityGates","docId":"features/QualityGates"},{"type":"link","label":"REST API","href":"/docs/features/RESTAPI","docId":"features/RESTAPI"}],"href":"/docs/category/features"},{"type":"link","label":"ReportPortal Tutorial","href":"/docs/reportportal-tutorial/","docId":"reportportal-tutorial/index"},{"type":"category","label":"Installation Steps","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Optimal Performance Hardware setup","href":"/docs/installation-steps/OptimalPerformanceHardwareSetup","docId":"installation-steps/OptimalPerformanceHardwareSetup"},{"type":"link","label":"Basic monitoring configuration","href":"/docs/installation-steps/BasicMonitoringConfiguration","docId":"installation-steps/BasicMonitoringConfiguration"},{"type":"link","label":"Deploy with Docker on Linux/Mac","href":"/docs/installation-steps/DeployWithDockerOnLinuxMac","docId":"installation-steps/DeployWithDockerOnLinuxMac"},{"type":"link","label":"Deploy with Docker on Windows","href":"/docs/installation-steps/DeployWithDockerOnWindows","docId":"installation-steps/DeployWithDockerOnWindows"},{"type":"link","label":"Deploy without Docker","href":"/docs/installation-steps/DeployWithoutDocker","docId":"installation-steps/DeployWithoutDocker"},{"type":"link","label":"Deploy with Kubernetes","href":"/docs/installation-steps/DeployWithKubernetes","docId":"installation-steps/DeployWithKubernetes"},{"type":"link","label":"Maintain commands Cheat sheet","href":"/docs/installation-steps/MaintainCommandsCheatSheet","docId":"installation-steps/MaintainCommandsCheatSheet"},{"type":"link","label":"Additional configuration parameters","href":"/docs/installation-steps/AdditionalConfigurationParameters","docId":"installation-steps/AdditionalConfigurationParameters"},{"type":"link","label":"Setup TLS(SSL) in Traefik 2.0.x","href":"/docs/installation-steps/SetupTSLSSLInTraefik2.0.x","docId":"installation-steps/SetupTSLSSLInTraefik2.0.x"},{"type":"link","label":"Deploy on Ubuntu OS","href":"/docs/installation-steps/DeployOnUbuntuOS","docId":"installation-steps/DeployOnUbuntuOS"},{"type":"link","label":"Deploy with AWS ECS Fargate","href":"/docs/installation-steps/DeployWithAWSECSFargate","docId":"installation-steps/DeployWithAWSECSFargate"},{"type":"link","label":"ReportPortal 23.1 File storage options","href":"/docs/installation-steps/ReportPortal23.1FileStorageOptions","docId":"installation-steps/ReportPortal23.1FileStorageOptions"},{"type":"link","label":"Scaling Up the ReportPortal Service API","href":"/docs/installation-steps/ScalingUpReportPortalAPIService","docId":"installation-steps/ScalingUpReportPortalAPIService"}],"href":"/docs/category/installation-steps"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Version v.23.2","href":"/docs/releases/Version23.2","docId":"releases/Version23.2"},{"type":"link","label":"Version v.23.1","href":"/docs/releases/Versionv23.1","docId":"releases/Versionv23.1"},{"type":"link","label":"Version 5.7.4","href":"/docs/releases/Version5.7.4","docId":"releases/Version5.7.4"},{"type":"link","label":"Version 5.7.3","href":"/docs/releases/Version5.7.3","docId":"releases/Version5.7.3"},{"type":"link","label":"Version 5.7.2","href":"/docs/releases/Version5.7.2","docId":"releases/Version5.7.2"},{"type":"link","label":"Version 5.7.1","href":"/docs/releases/Version5.7.1","docId":"releases/Version5.7.1"},{"type":"link","label":"Version 5.7.0","href":"/docs/releases/Version5.7.0","docId":"releases/Version5.7.0"},{"type":"link","label":"Version 5.6.3","href":"/docs/releases/Version5.6.3","docId":"releases/Version5.6.3"},{"type":"link","label":"Version 5.6.2","href":"/docs/releases/Version5.6.2","docId":"releases/Version5.6.2"},{"type":"link","label":"Version 5.6.1","href":"/docs/releases/Version5.6.1","docId":"releases/Version5.6.1"},{"type":"link","label":"Version 5.6.0","href":"/docs/releases/Version5.6.0","docId":"releases/Version5.6.0"},{"type":"link","label":"Version 5.5.0","href":"/docs/releases/Version5.5.0","docId":"releases/Version5.5.0"},{"type":"link","label":"Version 5.4.0","href":"/docs/releases/Version5.4.0","docId":"releases/Version5.4.0"},{"type":"link","label":"Version 5.3.5","href":"/docs/releases/Version5.3.5","docId":"releases/Version5.3.5"},{"type":"link","label":"Version 5.3.3","href":"/docs/releases/Version5.3.3","docId":"releases/Version5.3.3"},{"type":"link","label":"Version 5.3.2","href":"/docs/releases/Version5.3.2","docId":"releases/Version5.3.2"},{"type":"link","label":"Version 5.3.1","href":"/docs/releases/Version5.3.1.","docId":"releases/Version5.3.1."},{"type":"link","label":"Version 5.3.0","href":"/docs/releases/Version5.3.0","docId":"releases/Version5.3.0"},{"type":"link","label":"Version 5.2.3","href":"/docs/releases/Version5.2.3","docId":"releases/Version5.2.3"},{"type":"link","label":"Version 5.2.2","href":"/docs/releases/Version5.2.2","docId":"releases/Version5.2.2"},{"type":"link","label":"Version 5.2.1","href":"/docs/releases/Version5.2.1","docId":"releases/Version5.2.1"},{"type":"link","label":"Version 5.2.0","href":"/docs/releases/Version5.2.0","docId":"releases/Version5.2.0"},{"type":"link","label":"Version 5.1.0","href":"/docs/releases/Version5.1.0","docId":"releases/Version5.1.0"},{"type":"link","label":"Version 5.0.0","href":"/docs/releases/Version5.0.0","docId":"releases/Version5.0.0"},{"type":"link","label":"Version 5.0RC","href":"/docs/releases/Version5.0RC","docId":"releases/Version5.0RC"},{"type":"link","label":"Version 4.3","href":"/docs/releases/Version4.3","docId":"releases/Version4.3"},{"type":"link","label":"Version 4.2.0","href":"/docs/releases/Version4.2.0","docId":"releases/Version4.2.0"},{"type":"link","label":"Version 4.1.0","href":"/docs/releases/Version4.1.0","docId":"releases/Version4.1.0"},{"type":"link","label":"Version 4.0.0","href":"/docs/releases/Version4.0.0","docId":"releases/Version4.0.0"},{"type":"link","label":"Version 3.3.2-1","href":"/docs/releases/Version3.3.2-1","docId":"releases/Version3.3.2-1"},{"type":"link","label":"Version 3.3.2","href":"/docs/releases/Version3.3.2","docId":"releases/Version3.3.2"}],"href":"/docs/category/releases"},{"type":"category","label":"ReportPortal Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Components Overview","href":"/docs/reportportal-configuration/ComponentsOverview","docId":"reportportal-configuration/ComponentsOverview"},{"type":"link","label":"Creation of project and adding users","href":"/docs/reportportal-configuration/CreationOfProjectAndAddingUsers","docId":"reportportal-configuration/CreationOfProjectAndAddingUsers"},{"type":"link","label":"Project configuration","href":"/docs/reportportal-configuration/ProjectConfiguration","docId":"reportportal-configuration/ProjectConfiguration"},{"type":"link","label":"ReportPortal jobs configuration","href":"/docs/reportportal-configuration/ReportPortalJobsConfiguration","docId":"reportportal-configuration/ReportPortalJobsConfiguration"},{"type":"link","label":"Integration via plugin","href":"/docs/reportportal-configuration/IntegrationViaPlugin","docId":"reportportal-configuration/IntegrationViaPlugin"},{"type":"link","label":"How to get an access token in ReportPortal","href":"/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal","docId":"reportportal-configuration/HowToGetAnAccessTokenInReportPortal"},{"type":"category","label":"Authorization","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Active Directory","href":"/docs/reportportal-configuration/authorization/ActiveDirectory","docId":"reportportal-configuration/authorization/ActiveDirectory"},{"type":"link","label":"GitHub","href":"/docs/reportportal-configuration/authorization/GitHub","docId":"reportportal-configuration/authorization/GitHub"},{"type":"link","label":"LDAP","href":"/docs/reportportal-configuration/authorization/LDAP","docId":"reportportal-configuration/authorization/LDAP"},{"type":"category","label":"SAML Provider","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Azure SAML","href":"/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAML","docId":"reportportal-configuration/authorization/SAMLProvider/AzureSAML"},{"type":"link","label":"Okta SAML","href":"/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAML","docId":"reportportal-configuration/authorization/SAMLProvider/OktaSAML"}],"href":"/docs/reportportal-configuration/authorization/SAMLProvider/"}],"href":"/docs/reportportal-configuration/authorization/"}],"href":"/docs/category/reportportal-configuration"},{"type":"category","label":"User account","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Edit personal information","href":"/docs/user-account/EditPersonalInformation","docId":"user-account/EditPersonalInformation"},{"type":"link","label":"Restore a password","href":"/docs/user-account/RestoreAPassword","docId":"user-account/RestoreAPassword"},{"type":"link","label":"Delete account","href":"/docs/user-account/DeleteAccount","docId":"user-account/DeleteAccount"},{"type":"link","label":"Data retention procedure","href":"/docs/user-account/DataRetentionProcedure","docId":"user-account/DataRetentionProcedure"}],"href":"/docs/category/user-account"},{"type":"category","label":"Log data in ReportPortal","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Implement own integration","href":"/docs/log-data-in-reportportal/ImplementOwnIntegration","docId":"log-data-in-reportportal/ImplementOwnIntegration"},{"type":"link","label":"Reporting SDK","href":"/docs/log-data-in-reportportal/ReportingSDK","docId":"log-data-in-reportportal/ReportingSDK"},{"type":"link","label":"Import data to ReportPortal","href":"/docs/log-data-in-reportportal/ImportDataToReportPortal","docId":"log-data-in-reportportal/ImportDataToReportPortal"},{"type":"link","label":"How to run your tests","href":"/docs/log-data-in-reportportal/HowToRunYourTests","docId":"log-data-in-reportportal/HowToRunYourTests"},{"type":"category","label":"Test Framework Integration","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Java","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"JUnit5","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5","docId":"log-data-in-reportportal/test-framework-integration/Java/JUnit5"},{"type":"link","label":"JUnit4","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4","docId":"log-data-in-reportportal/test-framework-integration/Java/JUnit4"},{"type":"link","label":"TestNG","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/TestNG","docId":"log-data-in-reportportal/test-framework-integration/Java/TestNG"},{"type":"link","label":"Cucumber","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumber","docId":"log-data-in-reportportal/test-framework-integration/Java/Cucumber"},{"type":"link","label":"JBehave","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/JBehave","docId":"log-data-in-reportportal/test-framework-integration/Java/JBehave"},{"type":"link","label":"Spock","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Spock","docId":"log-data-in-reportportal/test-framework-integration/Java/Spock"},{"type":"link","label":"SoapUI (outdated)","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUI","docId":"log-data-in-reportportal/test-framework-integration/Java/SoapUI"},{"type":"category","label":"Loggers","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Logback","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback"},{"type":"link","label":"Log4J","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J"},{"type":"link","label":"Rest Assured","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured"},{"type":"link","label":"Selenide","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide"},{"type":"link","label":"OkHttp3","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3"},{"type":"link","label":"Apache HttpComponents","href":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","docId":"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents"}],"href":"/docs/category/loggers"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/Java/"},{"type":"category","label":"JavaScript","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Playwright","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright"},{"type":"link","label":"CucumberJS","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS"},{"type":"link","label":"Codecept","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept"},{"type":"link","label":"WebdriverIO","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO"},{"type":"link","label":"Postman","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postman","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Postman"},{"type":"link","label":"Cypress","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress"},{"type":"link","label":"Mocha","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha"},{"type":"link","label":"Jest","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jest","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Jest"},{"type":"link","label":"TestCafe","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe"},{"type":"link","label":"Jasmine","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine"},{"type":"link","label":"Nightwatch","href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","docId":"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/"},{"type":"category","label":".Net","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NUnit","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/NUnit","docId":"log-data-in-reportportal/test-framework-integration/Net/NUnit"},{"type":"link","label":"VSTest","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/VSTest","docId":"log-data-in-reportportal/test-framework-integration/Net/VSTest"},{"type":"link","label":"SpecFlow","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlow","docId":"log-data-in-reportportal/test-framework-integration/Net/SpecFlow"},{"type":"link","label":"xUnit","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/xUnit","docId":"log-data-in-reportportal/test-framework-integration/Net/xUnit"},{"type":"category","label":"Loggers","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Serilog","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog"},{"type":"link","label":"Log4Net","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net"},{"type":"link","label":"NLog","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog"},{"type":"link","label":"TraceListener","href":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","docId":"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener"}],"href":"/docs/category/loggers-1"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/Net/"},{"type":"category","label":"Python","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"pytest","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/pytest","docId":"log-data-in-reportportal/test-framework-integration/Python/pytest"},{"type":"link","label":"Robot Framework","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFramework","docId":"log-data-in-reportportal/test-framework-integration/Python/RobotFramework"},{"type":"link","label":"behave","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/behave","docId":"log-data-in-reportportal/test-framework-integration/Python/behave"},{"type":"link","label":"nosetests","href":"/docs/log-data-in-reportportal/test-framework-integration/Python/nosetests","docId":"log-data-in-reportportal/test-framework-integration/Python/nosetests"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/Python/"},{"type":"category","label":"PHP","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"PHPUnit","href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","docId":"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit"},{"type":"link","label":"Behat","href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/Behat","docId":"log-data-in-reportportal/test-framework-integration/PHP/Behat"},{"type":"link","label":"Codeception","href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeception","docId":"log-data-in-reportportal/test-framework-integration/PHP/Codeception"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/PHP/"},{"type":"link","label":"Other","href":"/docs/log-data-in-reportportal/test-framework-integration/Other/","docId":"log-data-in-reportportal/test-framework-integration/Other/index"}],"href":"/docs/log-data-in-reportportal/test-framework-integration/"}],"href":"/docs/category/log-data-in-reportportal"},{"type":"category","label":"Developers guides","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"API differences between v4 and v5","href":"/docs/dev-guides/APIDifferencesBetweenV4AndV5","docId":"dev-guides/APIDifferencesBetweenV4AndV5"},{"type":"link","label":"Asynchronous reporting","href":"/docs/dev-guides/AsynchronousReporting","docId":"dev-guides/AsynchronousReporting"},{"type":"link","label":"Attachments (Screenshots) Guide","href":"/docs/dev-guides/AttachmentsGuide","docId":"dev-guides/AttachmentsGuide"},{"type":"link","label":"Back-end Java contribution guide","href":"/docs/dev-guides/BackEndJavaContributionGuide","docId":"dev-guides/BackEndJavaContributionGuide"},{"type":"link","label":"Interactions between API and Analyzer","href":"/docs/dev-guides/InteractionsBetweenAPIAndAnalyzer","docId":"dev-guides/InteractionsBetweenAPIAndAnalyzer"},{"type":"link","label":"Plugin developers guide","href":"/docs/dev-guides/PluginDevelopersGuide","docId":"dev-guides/PluginDevelopersGuide"},{"type":"link","label":"ReportPortal API","href":"/docs/dev-guides/ReportPortalAPI","docId":"dev-guides/ReportPortalAPI"},{"type":"link","label":"Reporting developers guide","href":"/docs/dev-guides/ReportingDevelopersGuide","docId":"dev-guides/ReportingDevelopersGuide"},{"type":"link","label":"Rerun developers guide","href":"/docs/dev-guides/RerunDevelopersGuide","docId":"dev-guides/RerunDevelopersGuide"},{"type":"link","label":"Retries reporting","href":"/docs/dev-guides/RetriesReporting","docId":"dev-guides/RetriesReporting"}],"href":"/docs/category/developers-guides"},{"type":"category","label":"Work with reports","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"View launches","href":"/docs/work-with-reports/ViewLaunches","docId":"work-with-reports/ViewLaunches"},{"type":"link","label":"Operations under launches","href":"/docs/work-with-reports/OperationsUnderLaunches","docId":"work-with-reports/OperationsUnderLaunches"},{"type":"link","label":"Filtering launches","href":"/docs/work-with-reports/FilteringLaunches","docId":"work-with-reports/FilteringLaunches"},{"type":"link","label":"Investigation of failure","href":"/docs/work-with-reports/InvestigationOfFailure","docId":"work-with-reports/InvestigationOfFailure"},{"type":"link","label":"History of launches","href":"/docs/work-with-reports/HistoryOfLaunches","docId":"work-with-reports/HistoryOfLaunches"},{"type":"link","label":"Test case ID","href":"/docs/work-with-reports/TestCaseId","docId":"work-with-reports/TestCaseId"},{"type":"link","label":"Unique ID","href":"/docs/work-with-reports/UniqueId","docId":"work-with-reports/UniqueId"}],"href":"/docs/category/work-with-reports"},{"type":"category","label":"Analysis","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Auto-Analysis of launches","href":"/docs/analysis/AutoAnalysisOfLaunches","docId":"analysis/AutoAnalysisOfLaunches"},{"type":"link","label":"Search for the similar \\"To investigate\\" items","href":"/docs/analysis/SearchForTheSimilarToInvestigateItems","docId":"analysis/SearchForTheSimilarToInvestigateItems"},{"type":"link","label":"ML Suggestions","href":"/docs/analysis/MLSuggestions","docId":"analysis/MLSuggestions"},{"type":"link","label":"How models are retrained","href":"/docs/analysis/HowModelsAreRetrained","docId":"analysis/HowModelsAreRetrained"},{"type":"link","label":"Manual Analysis","href":"/docs/analysis/ManualAnalysis","docId":"analysis/ManualAnalysis"},{"type":"link","label":"Pattern Analysis","href":"/docs/analysis/PatternAnalysis","docId":"analysis/PatternAnalysis"},{"type":"link","label":"Unique Error Analysis","href":"/docs/analysis/UniqueErrorAnalysis","docId":"analysis/UniqueErrorAnalysis"}],"href":"/docs/category/analysis"},{"type":"category","label":"Saved searches (filters)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Create filters","href":"/docs/saved-searches-filters/CreateFilters","docId":"saved-searches-filters/CreateFilters"},{"type":"link","label":"Manage filters","href":"/docs/saved-searches-filters/ManageFilters","docId":"saved-searches-filters/ManageFilters"},{"type":"link","label":"Filters page","href":"/docs/saved-searches-filters/FiltersPage","docId":"saved-searches-filters/FiltersPage"}],"href":"/docs/category/saved-searches-filters"},{"type":"category","label":"Dashboards and widgets","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Possible Dashboards in ReportPortal","href":"/docs/dashboards-and-widgets/PossibleDashboardsInReportPortal","docId":"dashboards-and-widgets/PossibleDashboardsInReportPortal"},{"type":"link","label":"Work with dashboards","href":"/docs/dashboards-and-widgets/WorkWithDashboards","docId":"dashboards-and-widgets/WorkWithDashboards"},{"type":"link","label":"Widget Creation","href":"/docs/dashboards-and-widgets/WidgetCreation","docId":"dashboards-and-widgets/WidgetCreation"},{"type":"link","label":"Manage Widgets","href":"/docs/dashboards-and-widgets/ManageWidgets","docId":"dashboards-and-widgets/ManageWidgets"},{"type":"link","label":"Launch statistics chart","href":"/docs/dashboards-and-widgets/LaunchStatisticsChart","docId":"dashboards-and-widgets/LaunchStatisticsChart"},{"type":"link","label":"Overall statistics","href":"/docs/dashboards-and-widgets/OverallStatistics","docId":"dashboards-and-widgets/OverallStatistics"},{"type":"link","label":"Launches duration chart","href":"/docs/dashboards-and-widgets/LaunchesDurationChart","docId":"dashboards-and-widgets/LaunchesDurationChart"},{"type":"link","label":"Launch execution and issue statistic","href":"/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatistic","docId":"dashboards-and-widgets/LaunchExecutionAndIssueStatistic"},{"type":"link","label":"Project activity panel","href":"/docs/dashboards-and-widgets/ProjectActivityPanel","docId":"dashboards-and-widgets/ProjectActivityPanel"},{"type":"link","label":"Test-cases growth trend chart","href":"/docs/dashboards-and-widgets/TestCasesGrowthTrendChart","docId":"dashboards-and-widgets/TestCasesGrowthTrendChart"},{"type":"link","label":"Investigated percentage of launches","href":"/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunches","docId":"dashboards-and-widgets/InvestigatedPercentageOfLaunches"},{"type":"link","label":"Launches table","href":"/docs/dashboards-and-widgets/LaunchesTable","docId":"dashboards-and-widgets/LaunchesTable"},{"type":"link","label":"Unique bugs table","href":"/docs/dashboards-and-widgets/UniqueBugsTable","docId":"dashboards-and-widgets/UniqueBugsTable"},{"type":"link","label":"Most failed test-cases table (TOP-50)","href":"/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50","docId":"dashboards-and-widgets/MostFailedTestCasesTableTop50"},{"type":"link","label":"Failed cases trend chart","href":"/docs/dashboards-and-widgets/FailedCasesTrendChart","docId":"dashboards-and-widgets/FailedCasesTrendChart"},{"type":"link","label":"Non-passed test-cases trend chart","href":"/docs/dashboards-and-widgets/NonPassedTestCasesTrendChart","docId":"dashboards-and-widgets/NonPassedTestCasesTrendChart"},{"type":"link","label":"Different launches comparison chart","href":"/docs/dashboards-and-widgets/DifferentLaunchesComparisonChart","docId":"dashboards-and-widgets/DifferentLaunchesComparisonChart"},{"type":"link","label":"Passing rate per launch","href":"/docs/dashboards-and-widgets/PassingRatePerLaunch","docId":"dashboards-and-widgets/PassingRatePerLaunch"},{"type":"link","label":"Passing rate summary","href":"/docs/dashboards-and-widgets/PassingRateSummary","docId":"dashboards-and-widgets/PassingRateSummary"},{"type":"link","label":"Flaky test cases table (TOP-20)","href":"/docs/dashboards-and-widgets/FlakyTestCasesTableTop20","docId":"dashboards-and-widgets/FlakyTestCasesTableTop20"},{"type":"link","label":"Cumulative trend chart","href":"/docs/dashboards-and-widgets/CumulativeTrendChart","docId":"dashboards-and-widgets/CumulativeTrendChart"},{"type":"link","label":"Most popular pattern table (TOP-20)","href":"/docs/dashboards-and-widgets/MostPopularPatternTableTop20","docId":"dashboards-and-widgets/MostPopularPatternTableTop20"},{"type":"link","label":"Component health check","href":"/docs/dashboards-and-widgets/ComponentHealthCheck","docId":"dashboards-and-widgets/ComponentHealthCheck"},{"type":"link","label":"Table Component health check","href":"/docs/dashboards-and-widgets/TableComponentHealthCheck","docId":"dashboards-and-widgets/TableComponentHealthCheck"},{"type":"link","label":"Most time-consuming test cases widget (TOP-20)","href":"/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","docId":"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20"}],"href":"/docs/category/dashboards-and-widgets"},{"type":"category","label":"Admin Panel","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"All Projects page","href":"/docs/admin-panel/AllProjectsPage","docId":"admin-panel/AllProjectsPage"},{"type":"link","label":"All Users page","href":"/docs/admin-panel/AllUsersPage","docId":"admin-panel/AllUsersPage"},{"type":"link","label":"Event monitoring","href":"/docs/admin-panel/EventMonitoring","docId":"admin-panel/EventMonitoring"}],"href":"/docs/category/admin-panel"},{"type":"category","label":"Plugins","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Manage plugins","href":"/docs/plugins/ManagePlugins","docId":"plugins/ManagePlugins"},{"type":"link","label":"Atlassian Jira Server","href":"/docs/plugins/AtlassianJiraServer","docId":"plugins/AtlassianJiraServer"},{"type":"link","label":"Atlassian Jira Cloud","href":"/docs/plugins/AtlassianJiraCloud","docId":"plugins/AtlassianJiraCloud"},{"type":"link","label":"Azure DevOps BTS","href":"/docs/plugins/AzureDevOpsBTS","docId":"plugins/AzureDevOpsBTS"},{"type":"link","label":"Rally","href":"/docs/plugins/Rally","docId":"plugins/Rally"},{"type":"link","label":"E-mail server","href":"/docs/plugins/EmailServer","docId":"plugins/EmailServer"},{"type":"link","label":"Sauce Labs","href":"/docs/plugins/SauceLabs","docId":"plugins/SauceLabs"}],"href":"/docs/category/plugins"},{"type":"category","label":"Quality Gates","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Quality Gate Purpose","href":"/docs/quality-gates/QualityGatePurpose","docId":"quality-gates/QualityGatePurpose"},{"type":"link","label":"How to install Quality Gates","href":"/docs/quality-gates/HowToInstallQualityGates","docId":"quality-gates/HowToInstallQualityGates"},{"type":"link","label":"Feature overview","href":"/docs/quality-gates/FeatureOverview","docId":"quality-gates/FeatureOverview"},{"type":"link","label":"Upload Quality Gate to ReportPortal","href":"/docs/quality-gates/UploadQualityGateToReportPortal","docId":"quality-gates/UploadQualityGateToReportPortal"},{"type":"link","label":"Quality Rules Configuration","href":"/docs/quality-gates/QualityRulesConfiguration","docId":"quality-gates/QualityRulesConfiguration"},{"type":"link","label":"Quality Gate Edit","href":"/docs/quality-gates/QualityGateEdit","docId":"quality-gates/QualityGateEdit"},{"type":"link","label":"Delete Quality Gates","href":"/docs/quality-gates/DeleteQualityGates","docId":"quality-gates/DeleteQualityGates"},{"type":"link","label":"Assessment of test results using Quality Gates","href":"/docs/quality-gates/AssessmentOfTestResultsUsingQualityGates","docId":"quality-gates/AssessmentOfTestResultsUsingQualityGates"},{"type":"category","label":"Integration with CI/CD","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Integration with GitLab CI","href":"/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","docId":"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI"},{"type":"link","label":"Integration with Jenkins","href":"/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins","docId":"quality-gates/IntegrationWithCICD/IntegrationWithJenkins"}],"href":"/docs/quality-gates/IntegrationWithCICD/"}],"href":"/docs/category/quality-gates"},{"type":"link","label":"User role guides","href":"/docs/user-role-guides/","docId":"user-role-guides/index"},{"type":"category","label":"Issues Troubleshooting","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Tuning CI tool","href":"/docs/issues-troubleshooting/TuningCITool","docId":"issues-troubleshooting/TuningCITool"},{"type":"link","label":"Issues with JIRA bug tracking system: how to resolve","href":"/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","docId":"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve"},{"type":"link","label":"How to avoid local execution reported into project space","href":"/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","docId":"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace"},{"type":"link","label":"How to add a test stack trace to a description automatically","href":"/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","docId":"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically"},{"type":"link","label":"Issues with LDAPS: how to resolve","href":"/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolve","docId":"issues-troubleshooting/IssuesWithLDAPSHowToResolve"},{"type":"link","label":"Resolve Analyzer Known Issues","href":"/docs/issues-troubleshooting/ResolveAnalyzerKnownIssues","docId":"issues-troubleshooting/ResolveAnalyzerKnownIssues"},{"type":"link","label":"How to check LDAP connection","href":"/docs/issues-troubleshooting/HowToCheckLDAPConnection","docId":"issues-troubleshooting/HowToCheckLDAPConnection"},{"type":"link","label":"How to clean up the ReportPortal database using PG_REPACK","href":"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","docId":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack"},{"type":"link","label":"How to clean up the ReportPortal database using VACUUM FULL","href":"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","docId":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull"},{"type":"link","label":"How to resolve issues with migration to the new version","href":"/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","docId":"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion"}],"href":"/docs/category/issues-troubleshooting"},{"type":"category","label":"Case Studies","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Reducing regression time by 50%","href":"/docs/case-studies/ReducingRegressionTimeBy50","docId":"case-studies/ReducingRegressionTimeBy50"},{"type":"link","label":"Increasing test automation stability and visibility","href":"/docs/case-studies/IncreasingTestAutomationStabilityAndVisibility","docId":"case-studies/IncreasingTestAutomationStabilityAndVisibility"},{"type":"link","label":"Reducing regression analysis efforts","href":"/docs/case-studies/ReducingRegressionAnalysisEfforts","docId":"case-studies/ReducingRegressionAnalysisEfforts"},{"type":"link","label":"Improving test automation stability","href":"/docs/case-studies/ImprovingTestAutomationStability","docId":"case-studies/ImprovingTestAutomationStability"}],"href":"/docs/category/case-studies"},{"type":"link","label":"ReportPortal Glossary","href":"/docs/reportportal-glossary/","docId":"reportportal-glossary/index"},{"type":"link","label":"FAQ","href":"/docs/FAQ/","docId":"FAQ/index"},{"type":"category","label":"Terms & conditions","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Premium Features","href":"/docs/terms-and-conditions/PremiumFeatures","docId":"terms-and-conditions/PremiumFeatures"},{"type":"link","label":"Google Analytics usage by ReportPortal","href":"/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortal","docId":"terms-and-conditions/GoogleAnalyticsUsageByReportPortal"}],"href":"/docs/category/terms--conditions"}]},"docs":{"admin-panel/AllProjectsPage":{"id":"admin-panel/AllProjectsPage","title":"All Projects page","description":"Users with the Administrator role have access to the ReportPortal \\"Administrate\\" section.","sidebar":"defaultSidebar"},"admin-panel/AllUsersPage":{"id":"admin-panel/AllUsersPage","title":"All Users page","description":"The \\"All Users\\" page in \\"Administrate\\" section provides the access to see all available users in the our Testops system.","sidebar":"defaultSidebar"},"admin-panel/EventMonitoring":{"id":"admin-panel/EventMonitoring","title":"Event monitoring","description":"Starting from version 23.2, ReportPortal can monitor all activities (events) at both the project and instance levels.","sidebar":"defaultSidebar"},"analysis/AutoAnalysisOfLaunches":{"id":"analysis/AutoAnalysisOfLaunches","title":"Auto-Analysis of launches","description":"The analysis feature of the ReportPortal makes it possible for the application to check and pass part of the routine duties by itself.","sidebar":"defaultSidebar"},"analysis/HowModelsAreRetrained":{"id":"analysis/HowModelsAreRetrained","title":"How models are retrained","description":"In the Auto-analysis and ML suggestions processes several models take part:","sidebar":"defaultSidebar"},"analysis/ManualAnalysis":{"id":"analysis/ManualAnalysis","title":"Manual Analysis","description":"Manual Analysis is presented on our test report dashboard by \u201cMake decision\u201d modal.","sidebar":"defaultSidebar"},"analysis/MLSuggestions":{"id":"analysis/MLSuggestions","title":"ML Suggestions","description":"ML suggestions functionality is based on previously analyzed results (either manually or via Auto-analysis feature) using Machine Learning. The functionality is provided by the Analyzer service in combination with ElasticSearch.","sidebar":"defaultSidebar"},"analysis/PatternAnalysis":{"id":"analysis/PatternAnalysis","title":"Pattern Analysis","description":"Pattern analysis is a feature that helps you to speed up test failure analysis by finding common patterns in error logs.","sidebar":"defaultSidebar"},"analysis/SearchForTheSimilarToInvestigateItems":{"id":"analysis/SearchForTheSimilarToInvestigateItems","title":"Search for the similar \\"To investigate\\" items","description":"Let\'s consider below an example of ML-driven failure triage in ReportPortal.","sidebar":"defaultSidebar"},"analysis/UniqueErrorAnalysis":{"id":"analysis/UniqueErrorAnalysis","title":"Unique Error Analysis","description":"You can look at the test failure analysis from different points of view: qualitative (passing rate \u2013 How many tests have failed?) and quantitative (Why have they failed?). For example, if 1000 test cases are failed, then","sidebar":"defaultSidebar"},"case-studies/ImprovingTestAutomationStability":{"id":"case-studies/ImprovingTestAutomationStability","title":"Improving test automation stability","description":"Challenges","sidebar":"defaultSidebar"},"case-studies/IncreasingTestAutomationStabilityAndVisibility":{"id":"case-studies/IncreasingTestAutomationStabilityAndVisibility","title":"Increasing test automation stability and visibility","description":"Challenges","sidebar":"defaultSidebar"},"case-studies/ReducingRegressionAnalysisEfforts":{"id":"case-studies/ReducingRegressionAnalysisEfforts","title":"Reducing regression analysis efforts","description":"Challenges","sidebar":"defaultSidebar"},"case-studies/ReducingRegressionTimeBy50":{"id":"case-studies/ReducingRegressionTimeBy50","title":"Reducing regression time by 50%","description":"EPAM helps a Canadian retail company to reverse-engineer their legacy IBM-based store management system to a modern tech stack. As part of this project, ReportPortal was deployed as a centralized test reporting tool.","sidebar":"defaultSidebar"},"dashboards-and-widgets/ComponentHealthCheck":{"id":"dashboards-and-widgets/ComponentHealthCheck","title":"Component health check","description":"Shows the passing rate of the application components which are indicated by the specified attributes.","sidebar":"defaultSidebar"},"dashboards-and-widgets/CumulativeTrendChart":{"id":"dashboards-and-widgets/CumulativeTrendChart","title":"Cumulative trend chart","description":"Shows the growth trend of summary statistics of launches with the same attribute key.","sidebar":"defaultSidebar"},"dashboards-and-widgets/DifferentLaunchesComparisonChart":{"id":"dashboards-and-widgets/DifferentLaunchesComparisonChart","title":"Different launches comparison chart","description":"The widget allows you to compare statistics for the 2 last launches side by side.","sidebar":"defaultSidebar"},"dashboards-and-widgets/FailedCasesTrendChart":{"id":"dashboards-and-widgets/FailedCasesTrendChart","title":"Failed cases trend chart","description":"The widget shows the trend of growth in the number of failed test cases (Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates) from run to run.","sidebar":"defaultSidebar"},"dashboards-and-widgets/FlakyTestCasesTableTop20":{"id":"dashboards-and-widgets/FlakyTestCasesTableTop20","title":"Flaky test cases table (TOP-20)","description":"Shows the TOP-20 the flakiest test cases within the specified previous launches. The widget defines test cases with the highest percentage of switching their status in the execution. So that you can click on the test cases and be redirected to the last test item in execution to check the reasons.","sidebar":"defaultSidebar"},"dashboards-and-widgets/InvestigatedPercentageOfLaunches":{"id":"dashboards-and-widgets/InvestigatedPercentageOfLaunches","title":"Investigated percentage of launches","description":"The widget can be used in two modes - Launch mode and Timeline mode:","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchesDurationChart":{"id":"dashboards-and-widgets/LaunchesDurationChart","title":"Launches duration chart","description":"The Launch Duration Chart shows the duration of the selected launches.","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchesTable":{"id":"dashboards-and-widgets/LaunchesTable","title":"Launches table","description":"The widget shows a configurable table of launches.","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchExecutionAndIssueStatistic":{"id":"dashboards-and-widgets/LaunchExecutionAndIssueStatistic","title":"Launch execution and issue statistic","description":"The Launch Execution and Issue Statistic chart shows the status and issues statistics for the last launch of a specified range.","sidebar":"defaultSidebar"},"dashboards-and-widgets/LaunchStatisticsChart":{"id":"dashboards-and-widgets/LaunchStatisticsChart","title":"Launch statistics chart","description":"The widget can be used in two modes - Launch mode and Timeline mode:","sidebar":"defaultSidebar"},"dashboards-and-widgets/ManageWidgets":{"id":"dashboards-and-widgets/ManageWidgets","title":"Manage Widgets","description":"Customize widget","sidebar":"defaultSidebar"},"dashboards-and-widgets/MostFailedTestCasesTableTop50":{"id":"dashboards-and-widgets/MostFailedTestCasesTableTop50","title":"Most failed test-cases table (TOP-50)","description":"The widget contains a table with statistical information about the TOP-50 most problematic test cases.","sidebar":"defaultSidebar"},"dashboards-and-widgets/MostPopularPatternTableTop20":{"id":"dashboards-and-widgets/MostPopularPatternTableTop20","title":"Most popular pattern table (TOP-20)","description":"Widget\'s parameters:","sidebar":"defaultSidebar"},"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20":{"id":"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","title":"Most time-consuming test cases widget (TOP-20)","description":"Show the TOP 20 test cases with the highest duration in the last execution of the specified launch.","sidebar":"defaultSidebar"},"dashboards-and-widgets/NonPassedTestCasesTrendChart":{"id":"dashboards-and-widgets/NonPassedTestCasesTrendChart","title":"Non-passed test-cases trend chart","description":"The widget shows the percent ratio of non-passed test cases \\"Failed + Skipped\\" and \\"Total\\" cases from run to run.","sidebar":"defaultSidebar"},"dashboards-and-widgets/OverallStatistics":{"id":"dashboards-and-widgets/OverallStatistics","title":"Overall statistics","description":"The panel shows a summary of test cases with each status for each selected launch.","sidebar":"defaultSidebar"},"dashboards-and-widgets/PassingRatePerLaunch":{"id":"dashboards-and-widgets/PassingRatePerLaunch","title":"Passing rate per launch","description":"Shows the percentage ratio of Passed test cases to Total test cases for the last run of selected launch.","sidebar":"defaultSidebar"},"dashboards-and-widgets/PassingRateSummary":{"id":"dashboards-and-widgets/PassingRateSummary","title":"Passing rate summary","description":"Shows the percentage ratio of Passed test cases to Total test cases for set of launches.","sidebar":"defaultSidebar"},"dashboards-and-widgets/PossibleDashboardsInReportPortal":{"id":"dashboards-and-widgets/PossibleDashboardsInReportPortal","title":"Possible Dashboards in ReportPortal","description":"ReportPortal.io is a powerful test automation reporting dashboard that acquires a lot of analytics. With this manual, we are wanting to help you to configure simple and understandable reports for your teams.","sidebar":"defaultSidebar"},"dashboards-and-widgets/ProjectActivityPanel":{"id":"dashboards-and-widgets/ProjectActivityPanel","title":"Project activity panel","description":"The widget shows all activities occurring on the project.","sidebar":"defaultSidebar"},"dashboards-and-widgets/TableComponentHealthCheck":{"id":"dashboards-and-widgets/TableComponentHealthCheck","title":"Table Component health check","description":"Shows the detailed statistics of the application components which are indicated by the specified attributes.","sidebar":"defaultSidebar"},"dashboards-and-widgets/TestCasesGrowthTrendChart":{"id":"dashboards-and-widgets/TestCasesGrowthTrendChart","title":"Test-cases growth trend chart","description":"The widget can be used in two modes - Launch mode and Timeline mode:","sidebar":"defaultSidebar"},"dashboards-and-widgets/UniqueBugsTable":{"id":"dashboards-and-widgets/UniqueBugsTable","title":"Unique bugs table","description":"The widget shows real identified bugs, posted to the Bug Tracking System from ReportPortal, and existing bugs, that were added to the items on ReportPortal.","sidebar":"defaultSidebar"},"dashboards-and-widgets/WidgetCreation":{"id":"dashboards-and-widgets/WidgetCreation","title":"Widget Creation","description":"In our test automation dashboard widgets contain special graphical control elements that were designed to provide a simple and","sidebar":"defaultSidebar"},"dashboards-and-widgets/WorkWithDashboards":{"id":"dashboards-and-widgets/WorkWithDashboards","title":"Work with dashboards","description":"Dashboards on our continuous testing platform are special containers, where users can create widgets.","sidebar":"defaultSidebar"},"dev-guides/APIDifferencesBetweenV4AndV5":{"id":"dev-guides/APIDifferencesBetweenV4AndV5","title":"API differences between v4 and v5","description":"New endpoints","sidebar":"defaultSidebar"},"dev-guides/AsynchronousReporting":{"id":"dev-guides/AsynchronousReporting","title":"Asynchronous reporting","description":"Overview","sidebar":"defaultSidebar"},"dev-guides/AttachmentsGuide":{"id":"dev-guides/AttachmentsGuide","title":"Attachments (Screenshots) Guide","description":"The Attachments feature allows you to add any file or screenshot to the test case logs. It can be useful for further test failure analysis.","sidebar":"defaultSidebar"},"dev-guides/BackEndJavaContributionGuide":{"id":"dev-guides/BackEndJavaContributionGuide","title":"Back-end Java contribution guide","description":"Useful links","sidebar":"defaultSidebar"},"dev-guides/InteractionsBetweenAPIAndAnalyzer":{"id":"dev-guides/InteractionsBetweenAPIAndAnalyzer","title":"Interactions between API and Analyzer","description":"Overview","sidebar":"defaultSidebar"},"dev-guides/PluginDevelopersGuide":{"id":"dev-guides/PluginDevelopersGuide","title":"Plugin developers guide","description":"Introduction","sidebar":"defaultSidebar"},"dev-guides/ReportingDevelopersGuide":{"id":"dev-guides/ReportingDevelopersGuide","title":"Reporting developers guide","description":"Preconditions","sidebar":"defaultSidebar"},"dev-guides/ReportPortalAPI":{"id":"dev-guides/ReportPortalAPI","title":"ReportPortal API","description":"To find API documentation for our test automation reporting platform, log in to the ReportPortal application and open the API section in the left menu.","sidebar":"defaultSidebar"},"dev-guides/RerunDevelopersGuide":{"id":"dev-guides/RerunDevelopersGuide","title":"Rerun developers guide","description":"What is rerun","sidebar":"defaultSidebar"},"dev-guides/RetriesReporting":{"id":"dev-guides/RetriesReporting","title":"Retries reporting","description":"Some frameworks allow to retry Test execution according to provided conditions (TestNG) or just retry it predefined number of times.","sidebar":"defaultSidebar"},"FAQ/index":{"id":"FAQ/index","title":"FAQ","description":"On this page, we have put together a list of the most frequently asked questions. Here, you can find prompt responses.","sidebar":"defaultSidebar"},"features/AIFailureReasonDetection":{"id":"features/AIFailureReasonDetection","title":"AI-based failure reason detection","description":"In the realm of test automation, failure analysis often becomes a bottleneck, consuming valuable time and resources. ReportPortal introduces a game-changing solution with its AI-powered failure reason detection feature. Employing advanced Machine Learning (ML) algorithms, this feature streamlines your test processes, enabling quicker, more accurate results.","sidebar":"defaultSidebar"},"features/CategorisationOfFailures":{"id":"features/CategorisationOfFailures","title":"Categorization of failures based on issue roots","description":"In the realm of software development and QA, test failure analysis isn\'t just a task\u2014it\'s a critical practice. The way we categorize test failures informs not only the testing process but also how quickly and efficiently developers can resolve issues. ReportPortal provides an advanced, feature-rich environment for streamlined failure categorization, which is an integral part of any agile development cycle.","sidebar":"defaultSidebar"},"features/QualityGates":{"id":"features/QualityGates","title":"Quality Gates","description":"Quality Gates is a feature thanks to which ReportPortal becomes an integral part of continuous testing platform. It prevents the code from moving forward if it doesn\u2019t meet testing criteria. ReportPortal uses aggregated data and rule engine to verify testing results against required conditions.","sidebar":"defaultSidebar"},"features/RealTimeReporting":{"id":"features/RealTimeReporting","title":"Real-time reporting","description":"Real-time test reporting provides the most current data without delay. Thanks to near real-time capabilities, you can receive the first test results in a matter of seconds after the execution has started and benefit from the advantage of getting the entire execution results before it is completed.","sidebar":"defaultSidebar"},"features/RESTAPI":{"id":"features/RESTAPI","title":"REST API","description":"ReportPortal offers a robust set of features through its REST API, covering test data, user data, project data, statistics, integrations, and more.","sidebar":"defaultSidebar"},"features/RichArtifactsInTestReports":{"id":"features/RichArtifactsInTestReports","title":"Rich artifacts in test reports","description":"Test execution report in ReportPortal may contain extra details in addition to the standard test results (passed/failed status).","sidebar":"defaultSidebar"},"features/UnifiedTestReporting":{"id":"features/UnifiedTestReporting","title":"Single-entry point and unified test reporting","description":"ReportPortal was created with the idea in mind to be a single tool to acquire and aggregate the results of all automated tests for projects. Our centralized test automation tool is a great focus area for managers and test engineers because all test results can be accessed, reviewed and analyzed in one place.","sidebar":"defaultSidebar"},"features/VisualisationOfTestResults":{"id":"features/VisualisationOfTestResults","title":"Visualization of test data","description":"ReportPortal\'s dynamic visualization capabilities provide teams with real-time insights, enabling them to make informed decisions quickly and efficiently.","sidebar":"defaultSidebar"},"installation-steps/AdditionalConfigurationParameters":{"id":"installation-steps/AdditionalConfigurationParameters","title":"Additional configuration parameters","description":"| Configuration parameter | Default Value | Service | Description |","sidebar":"defaultSidebar"},"installation-steps/BasicMonitoringConfiguration":{"id":"installation-steps/BasicMonitoringConfiguration","title":"Basic monitoring configuration","description":"The common ReportPortal instance consists of two main parts \u2013 the application server and the database server \u2013 both of which must be covered by basic system-level and application-level metrics. Basic system-level monitoring should include metrics tracking the main application and database servers\' VM and cluster resources, such as:","sidebar":"defaultSidebar"},"installation-steps/DeployOnUbuntuOS":{"id":"installation-steps/DeployOnUbuntuOS","title":"Deploy on Ubuntu OS","description":"*Provided by @Tset Noitamotuahe. The article might be outdated.","sidebar":"defaultSidebar"},"installation-steps/DeployWithAWSECSFargate":{"id":"installation-steps/DeployWithAWSECSFargate","title":"Deploy with AWS ECS Fargate","description":"Provided by contributor, not verified by RP team, please use with caution.","sidebar":"defaultSidebar"},"installation-steps/DeployWithDockerOnLinuxMac":{"id":"installation-steps/DeployWithDockerOnLinuxMac","title":"Deploy with Docker on Linux/Mac","description":"Make your test automation reporting more portable. Reduce the risk of configuration issues with your test reporting tool using Docker.","sidebar":"defaultSidebar"},"installation-steps/DeployWithDockerOnWindows":{"id":"installation-steps/DeployWithDockerOnWindows","title":"Deploy with Docker on Windows","description":"A portable way to manage your real time test results. Using Docker makes it easy to share test execution report and collaborate with other team members.","sidebar":"defaultSidebar"},"installation-steps/DeployWithKubernetes":{"id":"installation-steps/DeployWithKubernetes","title":"Deploy with Kubernetes","description":"We use Helm package manager charts to bootstrap a ReportPortal deployment on a Kubernetes cluster","sidebar":"defaultSidebar"},"installation-steps/DeployWithoutDocker":{"id":"installation-steps/DeployWithoutDocker","title":"Deploy without Docker","description":"*The instruction designed for the version 5.3.5 and might be outdated for the latest versions.","sidebar":"defaultSidebar"},"installation-steps/MaintainCommandsCheatSheet":{"id":"installation-steps/MaintainCommandsCheatSheet","title":"Maintain commands Cheat sheet","description":"Export as env var:","sidebar":"defaultSidebar"},"installation-steps/OptimalPerformanceHardwareSetup":{"id":"installation-steps/OptimalPerformanceHardwareSetup","title":"Optimal Performance Hardware setup","description":"Find below the recommended hardware configuration to set up ReportPortal and have good performance using our centralized test automation tool.","sidebar":"defaultSidebar"},"installation-steps/ReportPortal23.1FileStorageOptions":{"id":"installation-steps/ReportPortal23.1FileStorageOptions","title":"ReportPortal 23.1 File storage options","description":"In ReportPortal 23.1 we can use multiple ways to store log attachments, user pictures and plugins.","sidebar":"defaultSidebar"},"installation-steps/ScalingUpReportPortalAPIService":{"id":"installation-steps/ScalingUpReportPortalAPIService","title":"Scaling Up the ReportPortal Service API","description":"Due to the current implementation specifics Asynchronous Reporting Scheme, horizontal auto-scaling of the ReportPortal service API is not feasible. However, manual scaling is achievable. This limitation stems from the way RabbitMQ, in conjunction with the API, manages the number of queues on the RabbitMQ side.","sidebar":"defaultSidebar"},"installation-steps/SetupTSLSSLInTraefik2.0.x":{"id":"installation-steps/SetupTSLSSLInTraefik2.0.x","title":"Setup TLS(SSL) in Traefik 2.0.x","description":"This is a short guideline that provides information on how to configure ReportPortal to use Let TLS/SSL certificate setup for your existing ReportPortal environment.","sidebar":"defaultSidebar"},"intro":{"id":"intro","title":"What is ReportPortal?","description":"How to get started with our test reporting tool. Improve testing process with ML-driven failure triage. Get real time results and test failure analytics.","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically":{"id":"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","title":"How to add a test stack trace to a description automatically","description":"You can make your process of a test analysis more convenient and quick by adding a description for failed tests that will include a last error message from the test log.","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace":{"id":"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","title":"How to avoid local execution reported into project space","description":"Option 1:","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToCheckLDAPConnection":{"id":"issues-troubleshooting/HowToCheckLDAPConnection","title":"How to check LDAP connection","description":"Firstly, check the availability of your LDAP server from the server when ReportPortal is installed. For example, use the command ldapsearch.","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack":{"id":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","title":"How to clean up the ReportPortal database using PG_REPACK","description":"Description","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull":{"id":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","title":"How to clean up the ReportPortal database using VACUUM FULL","description":"General information","sidebar":"defaultSidebar"},"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion":{"id":"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","title":"How to resolve issues with migration to the new version","description":"Error: Dirty database version XX. Fix and force version.","sidebar":"defaultSidebar"},"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve":{"id":"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","title":"Issues with JIRA bug tracking system: how to resolve","description":"In case user is connecting to JIRA system and gets the error like","sidebar":"defaultSidebar"},"issues-troubleshooting/IssuesWithLDAPSHowToResolve":{"id":"issues-troubleshooting/IssuesWithLDAPSHowToResolve","title":"Issues with LDAPS: how to resolve","description":"When configuring LDAP to work with ldaps","sidebar":"defaultSidebar"},"issues-troubleshooting/ResolveAnalyzerKnownIssues":{"id":"issues-troubleshooting/ResolveAnalyzerKnownIssues","title":"Resolve Analyzer Known Issues","description":"Problem 1. Auto-Analyser doesn\'t work. Analyzer health check status failed: Elasticsearch is not healthy","sidebar":"defaultSidebar"},"issues-troubleshooting/TuningCITool":{"id":"issues-troubleshooting/TuningCITool","title":"Tuning CI tool","description":"How to provide parameters via system variables in the CI tool (for example - Jenkins) for our continuous testing platform.","sidebar":"defaultSidebar"},"log-data-in-reportportal/HowToRunYourTests":{"id":"log-data-in-reportportal/HowToRunYourTests","title":"How to run your tests","description":"Automated tests can be executed in the any CI tool you are using on the project (Jenkins, Bamboo, Azure DevOps, GitHub Actions, CircleCI, TeamCity, GitLab, Travis CI, Codeship, Buddy, GoCD, Wercker and more).","sidebar":"defaultSidebar"},"log-data-in-reportportal/ImplementOwnIntegration":{"id":"log-data-in-reportportal/ImplementOwnIntegration","title":"Implement own integration","description":"You can find a detailed description of how report results to ReportPortal in our developers` guide.","sidebar":"defaultSidebar"},"log-data-in-reportportal/ImportDataToReportPortal":{"id":"log-data-in-reportportal/ImportDataToReportPortal","title":"Import data to ReportPortal","description":"Import functionality gives the opportunity to upload log files via UI.","sidebar":"defaultSidebar"},"log-data-in-reportportal/ReportingSDK":{"id":"log-data-in-reportportal/ReportingSDK","title":"Reporting SDK","description":"How to report tests with nested steps?","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/index":{"id":"log-data-in-reportportal/test-framework-integration/index","title":"Test Framework Integration","description":"ReportPortal is a system that integrates with your Test Framework, listens for events and visualizes test results. You cannot execute results right from ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Cucumber":{"id":"log-data-in-reportportal/test-framework-integration/Java/Cucumber","title":"ReportPortal Cucumber Integration","description":"There is an agent to integrate Cucumber with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/index":{"id":"log-data-in-reportportal/test-framework-integration/Java/index","title":"Java","description":"To integrate your Java test framework with ReportPortal, you need to create a file named reportportal.properties in your in your Java project in a source folder src/main/resources or src/test/resources (depending on where your tests are located):","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/JBehave":{"id":"log-data-in-reportportal/test-framework-integration/Java/JBehave","title":"ReportPortal JBehave Integration","description":"There is an agent to integrate JBehave with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/JUnit4":{"id":"log-data-in-reportportal/test-framework-integration/Java/JUnit4","title":"ReportPortal JUnit4 Integration","description":"There is an agent to integrate JUnit4 with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/JUnit5":{"id":"log-data-in-reportportal/test-framework-integration/Java/JUnit5","title":"ReportPortal JUnit5 Integration","description":"There is an agent to integrate JUnit5 with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","title":"ReportPortal Apache HttpComponents Integration","description":"The logger intercept and logs all Requests and Responses issued by Apache HttpComponents into ReportPortal in Markdown format, including multipart requests. It recognizes payload types and attach them in corresponding manner: image types will be logged as images with thumbnails, binary types will be logged as entry attachments, text types will be formatted and logged in Markdown code blocks.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","title":"ReportPortal Log4J Integration","description":"Log4j is one of several Java logging frameworks that provides a flexible and configurable way to capture and manage application logs.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","title":"ReportPortal Logback Integration","description":"Using the Logback appender for ReportPortal, developers can collect and send the logs generated by their application to ReportPortal for additional analysis and reporting. Using this appender, developers can configure Logback to send logs directly to ReportPortal, where they can be examined alongside other testing data to understand the behavior of the application and identify any issues.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","title":"ReportPortal OkHttp3 Integration","description":"The logger intercept and logs all Requests and Responses issued by OkHttp into ReportPortal in Markdown format, including multipart requests. It recognizes payload types and attach them in corresponding manner: image types will be logged as images with thumbnails, binary types will be logged as entry attachments, text types will be formatted and logged in Markdown code blocks.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","title":"ReportPortal Rest Assured Integration","description":"The logger intercept and logs all Requests and Responses issued by REST Assured into ReportPortal in Markdown format, including multipart","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide":{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","title":"ReportPortal Selenide Integration","description":"Selenide step logging listener for ReportPortal. The listener listen for Selenide log events and send them to Report Portal as steps. It has ability to log screenshots and page sources on failure, this is enabled by default. Also, it is possible to attach different types of WebDriver logs on failure.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/SoapUI":{"id":"log-data-in-reportportal/test-framework-integration/Java/SoapUI","title":"ReportPortal SoapUI Integration","description":"There is an agent to integrate SoapUI with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/Spock":{"id":"log-data-in-reportportal/test-framework-integration/Java/Spock","title":"ReportPortal Spock Integration","description":"There is an agent to integrate Spock with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Java/TestNG":{"id":"log-data-in-reportportal/test-framework-integration/Java/TestNG","title":"ReportPortal TestNG Integration","description":"There is an agent to integrate TestNG with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","title":"ReportPortal Codecept Integration","description":"There is an agent to integrate Codecept with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","title":"ReportPortal CucumberJS Integration","description":"There is an agent to integrate CucumberJS with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","title":"ReportPortal Cypress Integration","description":"There is an agent to integrate Cypress with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/index":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/index","title":"JavaScript","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","title":"ReportPortal Jasmine Integration","description":"There is an agent to integrate Jasmine with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Jest":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Jest","title":"ReportPortal Jest Integration","description":"There is an agent to integrate Jest with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","title":"ReportPortal Mocha Integration","description":"There is an agent to integrate Mocha with ReportPortal. It was designed to work with mocha programmatically, in order to be able to parametrize each test run.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","title":"ReportPortal Nightwatch Integration","description":"There is an agent to integrate Nightwatch with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","title":"ReportPortal Playwright Integration","description":"There is an agent to integrate Playwright with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/Postman":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Postman","title":"ReportPortal Postman Integration","description":"There is an agent to integrate Postman (based on Newman collection runner) with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","title":"ReportPortal TestCafe Integration","description":"There is an agent to integrate TestCafe with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO":{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","title":"ReportPortal WebdriverIO Integration","description":"There is an agent to integrate Webdriver.io with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/index":{"id":"log-data-in-reportportal/test-framework-integration/Net/index","title":".Net","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","title":"ReportPortal Log4Net Integration","description":"Log4net is a logging library for .NET applications. It offers a versatile and customizable architecture for recording application events to a number of locations, including files, databases, and remote servers.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","title":"ReportPortal NLog Integration","description":"NLog is a logging platform for .NET platforms. It supports a range of logging formats, including plain text and JSON.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","title":"ReportPortal Serilog Integration","description":"Serilog is a logging library for .Net. Serilog was created with powerful organized event data in mind, unlike other logging libraries.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener":{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","title":"ReportPortal TraceListener Integration","description":"TraceListener is a component of the .NET Framework\'s logging system. Provides receiving and handling trace messages and forwarding them to the appropriate destination.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/NUnit":{"id":"log-data-in-reportportal/test-framework-integration/Net/NUnit","title":"ReportPortal NUnit Integration","description":"There is an agent to integrate NUnit with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/SpecFlow":{"id":"log-data-in-reportportal/test-framework-integration/Net/SpecFlow","title":"ReportPortal SpecFlow Integration","description":"There is an agent to integrate SpecFlow with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/VSTest":{"id":"log-data-in-reportportal/test-framework-integration/Net/VSTest","title":"ReportPortal VSTest Integration","description":"There is an agent to integrate VSTest with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Net/xUnit":{"id":"log-data-in-reportportal/test-framework-integration/Net/xUnit","title":"ReportPortal xUnit Integration","description":"There is an agent to integrate xUnit with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Other/index":{"id":"log-data-in-reportportal/test-framework-integration/Other/index","title":"Other","description":"Please find the full list of available integrations with test frameworks in our GitHub repositories.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/Behat":{"id":"log-data-in-reportportal/test-framework-integration/PHP/Behat","title":"ReportPortal Behat Integration","description":"There is an agent to integrate Behat with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/Codeception":{"id":"log-data-in-reportportal/test-framework-integration/PHP/Codeception","title":"ReportPortal Codeception Integration","description":"There is an agent to integrate Codeception-based test framework with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/index":{"id":"log-data-in-reportportal/test-framework-integration/PHP/index","title":"PHP","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit":{"id":"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","title":"ReportPortal PHPUnit Integration","description":"There is an agent to integrate PHPUnit with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/behave":{"id":"log-data-in-reportportal/test-framework-integration/Python/behave","title":"ReportPortal behave Integration","description":"There is Behave extension for reporting test results of Behave to the ReportalPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/index":{"id":"log-data-in-reportportal/test-framework-integration/Python/index","title":"Python","description":"If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/nosetests":{"id":"log-data-in-reportportal/test-framework-integration/Python/nosetests","title":"ReportPortal nosetests Integration","description":"There is Nose plugin for reporting test results of Nose to the ReportalPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/pytest":{"id":"log-data-in-reportportal/test-framework-integration/Python/pytest","title":"ReportPortal pytest Integration","description":"There is an agent to integrate pytest with ReportPortal.","sidebar":"defaultSidebar"},"log-data-in-reportportal/test-framework-integration/Python/RobotFramework":{"id":"log-data-in-reportportal/test-framework-integration/Python/RobotFramework","title":"ReportPortal Robot Framework Integration","description":"There is a Listener for RobotFramework to report results to ReportPortal.","sidebar":"defaultSidebar"},"plugins/AtlassianJiraCloud":{"id":"plugins/AtlassianJiraCloud","title":"Atlassian Jira Cloud","description":"ReportPortal and Jira Cloud integration streamlines testing, tracks issues and enhances collaboration for improved productivity.","sidebar":"defaultSidebar"},"plugins/AtlassianJiraServer":{"id":"plugins/AtlassianJiraServer","title":"Atlassian Jira Server","description":"To install the Jira Server plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"plugins/AzureDevOpsBTS":{"id":"plugins/AzureDevOpsBTS","title":"Azure DevOps BTS","description":"To install the Azure DevOps BTS plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"plugins/EmailServer":{"id":"plugins/EmailServer","title":"E-mail server","description":"E-mail server plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"plugins/ManagePlugins":{"id":"plugins/ManagePlugins","title":"Manage plugins","description":"ReportPortal as a test management system can be reinforced by uploading plugins. For now, you can install the next plugins from the box:","sidebar":"defaultSidebar"},"plugins/Rally":{"id":"plugins/Rally","title":"Rally","description":"To install the Rally plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"plugins/SauceLabs":{"id":"plugins/SauceLabs","title":"Sauce Labs","description":"To install the Sauce Labs plugin, see Upload plugin section.","sidebar":"defaultSidebar"},"quality-gates/AssessmentOfTestResultsUsingQualityGates":{"id":"quality-gates/AssessmentOfTestResultsUsingQualityGates","title":"Assessment of test results using Quality Gates","description":"Now the system is preconfigured, and you can start using Quality Gates Analysis.","sidebar":"defaultSidebar"},"quality-gates/DeleteQualityGates":{"id":"quality-gates/DeleteQualityGates","title":"Delete Quality Gates","description":"If you want to delete Quality Gate:","sidebar":"defaultSidebar"},"quality-gates/FeatureOverview":{"id":"quality-gates/FeatureOverview","title":"Feature overview","description":"Quality Gate analysis provides capabilities to speed up CI/CD pipeline by sending auto-feedback to your CI/CD tools. ReportPortal assesses the build quality and sends auto feedback to CI/CD.","sidebar":"defaultSidebar"},"quality-gates/HowToInstallQualityGates":{"id":"quality-gates/HowToInstallQualityGates","title":"How to install Quality Gates","description":"The Quality Gate feature is available in the scope of the ReportPortal premium version started from version 5.6. Our continuous testing platform provides it for clients in the scope of paid support engagement.","sidebar":"defaultSidebar"},"quality-gates/IntegrationWithCICD/index":{"id":"quality-gates/IntegrationWithCICD/index","title":"Integration with CI/CD","description":"ReportPortal is a CI agnostic tool, it integrates on the test framework level, but to ease configuration we have auxiliary code in RP for some CI tools.","sidebar":"defaultSidebar"},"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI":{"id":"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","title":"Integration with GitLab CI","description":"In this tutorial we will walk you through the process of integrating ReportPortal with GitLab CI. It is not the case for GitLab, but there are some recipes.","sidebar":"defaultSidebar"},"quality-gates/IntegrationWithCICD/IntegrationWithJenkins":{"id":"quality-gates/IntegrationWithCICD/IntegrationWithJenkins","title":"Integration with Jenkins","description":"Jenkins configuration","sidebar":"defaultSidebar"},"quality-gates/QualityGateEdit":{"id":"quality-gates/QualityGateEdit","title":"Quality Gate Edit","description":"If user edit Quality Gates, previous reports for these Quality Gates would not be recalculated.","sidebar":"defaultSidebar"},"quality-gates/QualityGatePurpose":{"id":"quality-gates/QualityGatePurpose","title":"Quality Gate Purpose","description":"ReportPortal is a continuous testing platform with build-in functionality - Quality Gates.","sidebar":"defaultSidebar"},"quality-gates/QualityRulesConfiguration":{"id":"quality-gates/QualityRulesConfiguration","title":"Quality Rules Configuration","description":"Now let\'s configure the Quality rule, which will be used for launch quality assessment.","sidebar":"defaultSidebar"},"quality-gates/UploadQualityGateToReportPortal":{"id":"quality-gates/UploadQualityGateToReportPortal","title":"Upload Quality Gate to ReportPortal","description":"The default configuration of our continuous testing platform doesn\'t contain Quality Gate. For adding this feature, you need to receive a link to the .jar file from ReportPortal.","sidebar":"defaultSidebar"},"releases/Version23.2":{"id":"releases/Version23.2","title":"Version v.23.2","description":"1. What\'s Changed:","sidebar":"defaultSidebar"},"releases/Version3.3.2":{"id":"releases/Version3.3.2","title":"Version 3.3.2","description":"milestone 3.3","sidebar":"defaultSidebar"},"releases/Version3.3.2-1":{"id":"releases/Version3.3.2-1","title":"Version 3.3.2-1","description":"Update instructions","sidebar":"defaultSidebar"},"releases/Version4.0.0":{"id":"releases/Version4.0.0","title":"Version 4.0.0","description":"Issues and features in milestone 4.0","sidebar":"defaultSidebar"},"releases/Version4.1.0":{"id":"releases/Version4.1.0","title":"Version 4.1.0","description":"Issues and features in milestone 4.1","sidebar":"defaultSidebar"},"releases/Version4.2.0":{"id":"releases/Version4.2.0","title":"Version 4.2.0","description":"Features","sidebar":"defaultSidebar"},"releases/Version4.3":{"id":"releases/Version4.3","title":"Version 4.2.0","description":"Features","sidebar":"defaultSidebar"},"releases/Version5.0.0":{"id":"releases/Version5.0.0","title":"Version 5.0.0","description":"Finally we are glad to introduce a new release of ReportPortal.","sidebar":"defaultSidebar"},"releases/Version5.0RC":{"id":"releases/Version5.0RC","title":"Version 5.0RC","description":"This is the Beta release.","sidebar":"defaultSidebar"},"releases/Version5.1.0":{"id":"releases/Version5.1.0","title":"Version 5.1.0","description":"Important: We are constantly improving ReportPortal. And in version 5.1 we have changed a way we encrypt your personal data. Please be aware, that for successful interaction with version 5.1 you need to change a password at the first login.","sidebar":"defaultSidebar"},"releases/Version5.2.0":{"id":"releases/Version5.2.0","title":"Version 5.2.0","description":"Small and nice updates","sidebar":"defaultSidebar"},"releases/Version5.2.1":{"id":"releases/Version5.2.1","title":"Version 5.2.1","description":"Fix reportportal/kubernetes #115","sidebar":"defaultSidebar"},"releases/Version5.2.2":{"id":"releases/Version5.2.2","title":"Version 5.2.2","description":"Improvements","sidebar":"defaultSidebar"},"releases/Version5.2.3":{"id":"releases/Version5.2.3","title":"Version 5.2.3","description":"Bugs","sidebar":"defaultSidebar"},"releases/Version5.3.0":{"id":"releases/Version5.3.0","title":"Version 5.3.0","description":"Brand new features","sidebar":"defaultSidebar"},"releases/Version5.3.1.":{"id":"releases/Version5.3.1.","title":"Version 5.3.1","description":"Bug fixing","sidebar":"defaultSidebar"},"releases/Version5.3.2":{"id":"releases/Version5.3.2","title":"Version 5.3.2","description":"Bug fixing","sidebar":"defaultSidebar"},"releases/Version5.3.3":{"id":"releases/Version5.3.3","title":"Version 5.3.3","description":"New features","sidebar":"defaultSidebar"},"releases/Version5.3.5":{"id":"releases/Version5.3.5","title":"Version 5.3.5","description":"- Fixed: #950 Problems with DB locks on SELECT","sidebar":"defaultSidebar"},"releases/Version5.4.0":{"id":"releases/Version5.4.0","title":"Version 5.4.0","description":"Migration guide","sidebar":"defaultSidebar"},"releases/Version5.5.0":{"id":"releases/Version5.5.0","title":"Version 5.5.0","description":"Migration guide","sidebar":"defaultSidebar"},"releases/Version5.6.0":{"id":"releases/Version5.6.0","title":"Version 5.6.0","description":"Migration guide","sidebar":"defaultSidebar"},"releases/Version5.6.1":{"id":"releases/Version5.6.1","title":"Version 5.6.1","description":"Bugfixing","sidebar":"defaultSidebar"},"releases/Version5.6.2":{"id":"releases/Version5.6.2","title":"Version 5.6.2","description":"- ReportPortal release 5.6.2 aimed at fixing Log4J vulnerabilities: CVE-2021-44228, CVE-2021-45046 and CVE-2021-45105","sidebar":"defaultSidebar"},"releases/Version5.6.3":{"id":"releases/Version5.6.3","title":"Version 5.6.3","description":"Bugfixing","sidebar":"defaultSidebar"},"releases/Version5.7.0":{"id":"releases/Version5.7.0","title":"Version 5.7.0","description":"New Features:","sidebar":"defaultSidebar"},"releases/Version5.7.1":{"id":"releases/Version5.7.1","title":"Version 5.7.1","description":"Technical Improvements:","sidebar":"defaultSidebar"},"releases/Version5.7.2":{"id":"releases/Version5.7.2","title":"Version 5.7.2","description":"What\'s Changed:","sidebar":"defaultSidebar"},"releases/Version5.7.3":{"id":"releases/Version5.7.3","title":"Version 5.7.3","description":"Features:","sidebar":"defaultSidebar"},"releases/Version5.7.4":{"id":"releases/Version5.7.4","title":"Version 5.7.4","description":"What\'s Changed:","sidebar":"defaultSidebar"},"releases/Versionv23.1":{"id":"releases/Versionv23.1","title":"Version v.23.1","description":"1. What\'s Changed:","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/ActiveDirectory":{"id":"reportportal-configuration/authorization/ActiveDirectory","title":"Active Directory","description":"Active Directory plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/GitHub":{"id":"reportportal-configuration/authorization/GitHub","title":"GitHub","description":"Our open source test reporting tool allows logging in via GitHub OAuth Web Application Flow.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/index":{"id":"reportportal-configuration/authorization/index","title":"Authorization","description":"ReportPortal Admin can configure an easy authorization on the instance. From the box we provide OAuth with:","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/LDAP":{"id":"reportportal-configuration/authorization/LDAP","title":"LDAP","description":"LDAP plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/SAMLProvider/AzureSAML":{"id":"reportportal-configuration/authorization/SAMLProvider/AzureSAML","title":"Azure SAML","description":"SAML plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/SAMLProvider/index":{"id":"reportportal-configuration/authorization/SAMLProvider/index","title":"SAML provider","description":"If you have a pre-created Internal user, you can\'t log in by SAML using their credentials (Email or Name).","sidebar":"defaultSidebar"},"reportportal-configuration/authorization/SAMLProvider/OktaSAML":{"id":"reportportal-configuration/authorization/SAMLProvider/OktaSAML","title":"Okta SAML","description":"SAML plugin is available in ReportPortal on the Plugins page.","sidebar":"defaultSidebar"},"reportportal-configuration/ComponentsOverview":{"id":"reportportal-configuration/ComponentsOverview","title":"Components Overview","description":"Gateway","sidebar":"defaultSidebar"},"reportportal-configuration/CreationOfProjectAndAddingUsers":{"id":"reportportal-configuration/CreationOfProjectAndAddingUsers","title":"Creation of project and adding users","description":"The main question of how you can organize your working space in ReportPortal.","sidebar":"defaultSidebar"},"reportportal-configuration/HowToGetAnAccessTokenInReportPortal":{"id":"reportportal-configuration/HowToGetAnAccessTokenInReportPortal","title":"How to get an access token in ReportPortal","description":"There are two ways to authorize in the ReportPortal API:","sidebar":"defaultSidebar"},"reportportal-configuration/IntegrationViaPlugin":{"id":"reportportal-configuration/IntegrationViaPlugin","title":"Integration via plugin","description":"Users can reinforce ReportPortal with adding additional integrations with:","sidebar":"defaultSidebar"},"reportportal-configuration/ProjectConfiguration":{"id":"reportportal-configuration/ProjectConfiguration","title":"Project configuration","description":"To see the list of available projects and open a project, click the drop-down list in the top of the left menu.","sidebar":"defaultSidebar"},"reportportal-configuration/ReportPortalJobsConfiguration":{"id":"reportportal-configuration/ReportPortalJobsConfiguration","title":"ReportPortal jobs configuration","description":"Currently, ReportPortal has 5 configurable jobs for data removing:","sidebar":"defaultSidebar"},"reportportal-glossary/index":{"id":"reportportal-glossary/index","title":"ReportPortal Glossary","description":"Agent","sidebar":"defaultSidebar"},"reportportal-tutorial/index":{"id":"reportportal-tutorial/index","title":"ReportPortal Tutorial","description":"ReportPortal guide. How to do test failure analysis, how to create dashboard to manage test results and use capabilities of continuous testing platform.","sidebar":"defaultSidebar"},"saved-searches-filters/CreateFilters":{"id":"saved-searches-filters/CreateFilters","title":"Create filters","description":"Filters in the our test automation reporting dashboard are saved searches of the launches.","sidebar":"defaultSidebar"},"saved-searches-filters/FiltersPage":{"id":"saved-searches-filters/FiltersPage","title":"Filters page","description":"You can see the list of your saved searches and filters created by other team members on the \\"Filters\\" page.","sidebar":"defaultSidebar"},"saved-searches-filters/ManageFilters":{"id":"saved-searches-filters/ManageFilters","title":"Manage filters","description":"Filters feature is a base for data visualization in test automation because widgets are built on their basis.","sidebar":"defaultSidebar"},"terms-and-conditions/GoogleAnalyticsUsageByReportPortal":{"id":"terms-and-conditions/GoogleAnalyticsUsageByReportPortal","title":"Google Analytics usage by ReportPortal","description":"ReportPortal uses Google Analytics (GA) for web analytics capabilities. GA helps the ReportPortal Team to understand product usage and make ReportPortal more convenient and useful for our users. To address any concerns about the data we collect, we want to be transparent about which data is sent to GA, and assure you that no personal or confidential data is transferred. To be clear, we do not gather personal information at all through GA. In this article, we explain how Google Analytics works on ReportPortal, its benefits, and how you can turn it off if you want.","sidebar":"defaultSidebar"},"terms-and-conditions/PremiumFeatures":{"id":"terms-and-conditions/PremiumFeatures","title":"Premium Features","description":"At ReportPortal, we understand that every enterprise\'s testing environment is unique, requiring tailored solutions that address specific needs. To cater to this demand, we\'ve introduced our Premium Features, exclusively available to our Managed Services and SaaS subscription clients.","sidebar":"defaultSidebar"},"user-account/DataRetentionProcedure":{"id":"user-account/DataRetentionProcedure","title":"Data retention procedure","description":"Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days.","sidebar":"defaultSidebar"},"user-account/DeleteAccount":{"id":"user-account/DeleteAccount","title":"Delete account","description":"Starting from version 23.2, ReportPortal users can delete their accounts along with their personal data.","sidebar":"defaultSidebar"},"user-account/EditPersonalInformation":{"id":"user-account/EditPersonalInformation","title":"Edit personal information","description":"To navigate to the User Profile page, open menu at the bottom of the page and select \\"Profile\\" option.","sidebar":"defaultSidebar"},"user-account/RestoreAPassword":{"id":"user-account/RestoreAPassword","title":"Restore a password","description":"If you forgot your password, you can restore it on the login page. To do that, perform the following steps:","sidebar":"defaultSidebar"},"user-role-guides/index":{"id":"user-role-guides/index","title":"User role guides","description":"Here are the links to User Guide sections divided by ReportPortal User roles.","sidebar":"defaultSidebar"},"work-with-reports/FilteringLaunches":{"id":"work-with-reports/FilteringLaunches","title":"Filtering launches","description":"The data tables for the \\"Launches\\" and the \\"Debug\\" modes can be filtered with","sidebar":"defaultSidebar"},"work-with-reports/HistoryOfLaunches":{"id":"work-with-reports/HistoryOfLaunches","title":"History of launches","description":"Historical trend of executions","sidebar":"defaultSidebar"},"work-with-reports/InvestigationOfFailure":{"id":"work-with-reports/InvestigationOfFailure","title":"Investigation of failure","description":"Set defect type","sidebar":"defaultSidebar"},"work-with-reports/OperationsUnderLaunches":{"id":"work-with-reports/OperationsUnderLaunches","title":"Operations under launches","description":"There are several ways of how launches could be modified and managed in our test automation reporting dashboard.","sidebar":"defaultSidebar"},"work-with-reports/TestCaseId":{"id":"work-with-reports/TestCaseId","title":"Test case ID","description":"What is it: Test case ID","sidebar":"defaultSidebar"},"work-with-reports/UniqueId":{"id":"work-with-reports/UniqueId","title":"Unique ID","description":"(deprecated/ will be replaced by Test Case ID gradually)","sidebar":"defaultSidebar"},"work-with-reports/ViewLaunches":{"id":"work-with-reports/ViewLaunches","title":"View launches","description":"Viewing information about all launches","sidebar":"defaultSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b738733a.bde0391c.js b/assets/js/b738733a.bde0391c.js new file mode 100644 index 000000000..4d4eee347 --- /dev/null +++ b/assets/js/b738733a.bde0391c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[2507],{3905:(t,e,r)=>{r.d(e,{Zo:()=>p,kt:()=>f});var a=r(67294);function o(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function n(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,a)}return r}function i(t){for(var e=1;e=0||(o[r]=t[r]);return o}(t,e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}var s=a.createContext({}),c=function(t){var e=a.useContext(s),r=e;return t&&(r="function"==typeof t?t(e):i(i({},e),t)),r},p=function(t){var e=c(t.components);return a.createElement(s.Provider,{value:e},t.children)},u="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return a.createElement(a.Fragment,{},e)}},m=a.forwardRef((function(t,e){var r=t.components,o=t.mdxType,n=t.originalType,s=t.parentName,p=l(t,["components","mdxType","originalType","parentName"]),u=c(r),m=o,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||n;return r?a.createElement(f,i(i({ref:e},p),{},{components:r})):a.createElement(f,i({ref:e},p))}));function f(t,e){var r=arguments,o=e&&e.mdxType;if("string"==typeof t||o){var n=r.length,i=new Array(n);i[0]=m;var l={};for(var s in e)hasOwnProperty.call(e,s)&&(l[s]=e[s]);l.originalType=t,l[u]="string"==typeof t?t:o,i[1]=l;for(var c=2;c{r.d(e,{Z:()=>h});var a=r(67294),o=r(86010),n=r(52802),i=r(39960),l=r(13919),s=r(95999);const c={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function p(t){let{href:e,children:r}=t;return a.createElement(i.Z,{href:e,className:(0,o.Z)("card padding--lg",c.cardContainer)},r)}function u(t){let{href:e,icon:r,title:n,description:i}=t;return a.createElement(p,{href:e},a.createElement("h2",{className:(0,o.Z)("text--truncate",c.cardTitle),title:n},r," ",n),i&&a.createElement("p",{className:(0,o.Z)("text--truncate",c.cardDescription),title:i},i))}function d(t){let{item:e}=t;const r=(0,n.Wl)(e);return r?a.createElement(u,{href:r,icon:"\ud83d\uddc3\ufe0f",title:e.label,description:e.description??(0,s.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:e.items.length})}):null}function m(t){let{item:e}=t;const r=(0,l.Z)(e.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",o=(0,n.xz)(e.docId??void 0);return a.createElement(u,{href:e.href,icon:r,title:e.label,description:e.description??o?.description})}function f(t){let{item:e}=t;switch(e.type){case"link":return a.createElement(m,{item:e});case"category":return a.createElement(d,{item:e});default:throw new Error(`unknown item type ${JSON.stringify(e)}`)}}function g(t){let{className:e}=t;const r=(0,n.jA)();return a.createElement(h,{items:r.items,className:e})}function h(t){const{items:e,className:r}=t;if(!e)return a.createElement(g,t);const i=(0,n.MN)(e);return a.createElement("section",{className:(0,o.Z)("row",r)},i.map(((t,e)=>a.createElement("article",{key:e,className:"col col--6 margin-bottom--lg"},a.createElement(f,{item:t})))))}},38111:(t,e,r)=>{r.r(e),r.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var a=r(87462),o=(r(67294),r(3905)),n=r(52991);const i={title:"Log data in ReportPortal"},l="Log data in ReportPortal",s={unversionedId:"log-data-in-reportportal/index",id:"log-data-in-reportportal/index",title:"Log data in ReportPortal",description:"ReportPortal is a CI/CD agnostic tool. Therefore, you can continue using your favorite CI/CD tool (GitLab, Jenkins, GitHub, Azure DevOps, Bamboo) to send data to ReportPortal and get test results of execution.",source:"@site/docs/log-data-in-reportportal/index.md",sourceDirName:"log-data-in-reportportal",slug:"/log-data-in-reportportal/",permalink:"/docs/log-data-in-reportportal/",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/log-data-in-reportportal/index.md",tags:[],version:"current",frontMatter:{title:"Log data in ReportPortal"},sidebar:"defaultSidebar",previous:{title:"Data retention procedure",permalink:"/docs/user-account/DataRetentionProcedure"},next:{title:"Implement own integration",permalink:"/docs/log-data-in-reportportal/ImplementOwnIntegration"}},c={},p=[],u={toc:p},d="wrapper";function m(t){let{components:e,...r}=t;return(0,o.kt)(d,(0,a.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"log-data-in-reportportal"},"Log data in ReportPortal"),(0,o.kt)("p",null,"ReportPortal is a CI/CD agnostic tool. Therefore, you can continue using your favorite CI/CD tool (GitLab, Jenkins, GitHub, Azure DevOps, Bamboo) to send data to ReportPortal and get test results of execution."),(0,o.kt)("p",null,"The data transmission is regulated not by the CI/CD process, but by the test framework. The only requirement is to ensure that the machine where your CI/CD is located has access to the ReportPortal instance to which you are trying to send the data."),(0,o.kt)("p",null,"As for test frameworks, a generic approach is to set the address of ReportPortal and other data in your test framework via properties or a configuration file, and your test framework will start reporting data to ReportPortal."),(0,o.kt)("p",null,"ReportPortal supports various frameworks. For example, we have integration with ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Java/"},"Java frameworks")," (",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Java/TestNG"},"TestNG"),", ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Java/JBehave"},"Jbehave"),", etc.), ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Python/"},"Python frameworks")," (",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Python/pytest"},"Pytest"),", ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Python/RobotFramework"},"Robot Framework"),", etc.), ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/JavaScript/"},"JavaScript frameworks")," (",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright"},"Playwright"),", ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/JavaScript/Postman"},"Postman"),", etc.), ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Net/"},".NET frameworks")," (",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Net/NUnit"},"NUnit"),", ",(0,o.kt)("a",{parentName:"p",href:"/log-data-in-reportportal/test-framework-integration/Net/VSTest"},"VSTest"),", etc.)."),(0,o.kt)("p",null,"Integration with ReportPortal is not dependent on the type of tests you run. It can be API tests, integration tests, or UI tests such as Selenium, Cypress, so, you can run different types of tests and get test results."),(0,o.kt)("p",null,"ReportPortal can be integrated with external services, enabling you to report test results from platforms like Browserstack, Sauce Labs, and other third-party services. For Sauce Labs integration, we have a ",(0,o.kt)("a",{parentName:"p",href:"/plugins/SauceLabs"},"plugin"),"."),(0,o.kt)(n.Z,{mdxType:"DocCardList"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/caf5215e.2fdaaccd.js b/assets/js/caf5215e.efb3579e.js similarity index 52% rename from assets/js/caf5215e.2fdaaccd.js rename to assets/js/caf5215e.efb3579e.js index 99eef390f..1230ae89b 100644 --- a/assets/js/caf5215e.2fdaaccd.js +++ b/assets/js/caf5215e.efb3579e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[6056],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),f=o,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={sidebar_position:4,sidebar_label:"Data retention procedure"},i="Data retention procedure",s={unversionedId:"user-account/DataRetentionProcedure",id:"user-account/DataRetentionProcedure",title:"Data retention procedure",description:"Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days.",source:"@site/docs/user-account/DataRetentionProcedure.md",sourceDirName:"user-account",slug:"/user-account/DataRetentionProcedure",permalink:"/docs/user-account/DataRetentionProcedure",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/user-account/DataRetentionProcedure.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,sidebar_label:"Data retention procedure"},sidebar:"defaultSidebar",previous:{title:"Delete account",permalink:"/docs/user-account/DeleteAccount"},next:{title:"Log data in ReportPortal",permalink:"/docs/category/log-data-in-reportportal"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"data-retention-procedure"},"Data retention procedure"),(0,o.kt)("p",null,"Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Docker")),(0,o.kt)("p",null,"To activate data retention, add the following environment variables to Service Jobs:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# Int (days)\nRP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_RETENTIONPERIOD:\n\n# CRON\nRP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_CRON:\nRP_ENVIRONMENT_VARIABLE_NOTIFICATION_EXPIREDUSER_CRON:\n")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Kubernetes")),(0,o.kt)("p",null,"Fill in Service Jobs values in the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/reportportal/kubernetes/blob/master/reportportal/values.yaml"},"values.yaml")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"servicejobs:\ncoreJobs:\n # Int (days) \n notifyExpiredUserCron: \n\n # CRON \n cleanExpiredUserCron: \n cleanExpiredUserRetention: \n")),(0,o.kt)("p",null,"If the data retention option is enabled but a specific number of days for deleting inactive users is not specified, no deletions will occur. In the case of specifying 0 or a negative value, an error will be displayed in the logs."),(0,o.kt)("p",null,"When the data retention option is activated, the job will run daily to identify inactive users and obfuscate their data."),(0,o.kt)("p",null,"Inactive users are defined as follows:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Users who have not logged in for N days.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Users who have not reported testing data for N days."))),(0,o.kt)("p",null,"Users are only classified as inactive if both conditions are satisfied."),(0,o.kt)("p",null,"In cases where a user logs in but doesn\u2019t submit any reports, they are not deleted as the second condition isn\u2019t fulfilled. Similarly, if a user has not logged in but has submitted reports, they are still considered active."),(0,o.kt)("p",null,"Before performing deletions, the system sends out email notifications as follows: notification \u21161 is dispatched to inactive users N-60 days before deletion, notification \u21162 is sent N-30 days prior, and notification \u21163 is sent 1 day before obfuscation. Notifications about account deletion are also sent by the system."),(0,o.kt)("p",null,"Users will be able to return whenever they are invited to the project."),(0,o.kt)("p",null,"In summary, a data retention policy optimizes resources and helps create a more efficient, secure, and effective environment for data management, which fosters business success."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[6056],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),f=o,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||a;return n?r.createElement(m,i(i({ref:t},u),{},{components:n})):r.createElement(m,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:o,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(87462),o=(n(67294),n(3905));const a={sidebar_position:4,sidebar_label:"Data retention procedure"},i="Data retention procedure",s={unversionedId:"user-account/DataRetentionProcedure",id:"user-account/DataRetentionProcedure",title:"Data retention procedure",description:"Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days.",source:"@site/docs/user-account/DataRetentionProcedure.md",sourceDirName:"user-account",slug:"/user-account/DataRetentionProcedure",permalink:"/docs/user-account/DataRetentionProcedure",draft:!1,editUrl:"https://github.com/reportportal/docs/blob/develop/docs/user-account/DataRetentionProcedure.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,sidebar_label:"Data retention procedure"},sidebar:"defaultSidebar",previous:{title:"Delete account",permalink:"/docs/user-account/DeleteAccount"},next:{title:"Log data in ReportPortal",permalink:"/docs/log-data-in-reportportal/"}},l={},c=[],u={toc:c},d="wrapper";function p(e){let{components:t,...n}=e;return(0,o.kt)(d,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"data-retention-procedure"},"Data retention procedure"),(0,o.kt)("p",null,"Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Docker")),(0,o.kt)("p",null,"To activate data retention, add the following environment variables to Service Jobs:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"# Int (days)\nRP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_RETENTIONPERIOD:\n\n# CRON\nRP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_CRON:\nRP_ENVIRONMENT_VARIABLE_NOTIFICATION_EXPIREDUSER_CRON:\n")),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"Kubernetes")),(0,o.kt)("p",null,"Fill in Service Jobs values in the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/reportportal/kubernetes/blob/master/reportportal/values.yaml"},"values.yaml")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"servicejobs:\ncoreJobs:\n # Int (days) \n notifyExpiredUserCron: \n\n # CRON \n cleanExpiredUserCron: \n cleanExpiredUserRetention: \n")),(0,o.kt)("p",null,"If the data retention option is enabled but a specific number of days for deleting inactive users is not specified, no deletions will occur. In the case of specifying 0 or a negative value, an error will be displayed in the logs."),(0,o.kt)("p",null,"When the data retention option is activated, the job will run daily to identify inactive users and obfuscate their data."),(0,o.kt)("p",null,"Inactive users are defined as follows:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Users who have not logged in for N days.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Users who have not reported testing data for N days."))),(0,o.kt)("p",null,"Users are only classified as inactive if both conditions are satisfied."),(0,o.kt)("p",null,"In cases where a user logs in but doesn\u2019t submit any reports, they are not deleted as the second condition isn\u2019t fulfilled. Similarly, if a user has not logged in but has submitted reports, they are still considered active."),(0,o.kt)("p",null,"Before performing deletions, the system sends out email notifications as follows: notification \u21161 is dispatched to inactive users N-60 days before deletion, notification \u21162 is sent N-30 days prior, and notification \u21163 is sent 1 day before obfuscation. Notifications about account deletion are also sent by the system."),(0,o.kt)("p",null,"Users will be able to return whenever they are invited to the project."),(0,o.kt)("p",null,"In summary, a data retention policy optimizes resources and helps create a more efficient, secure, and effective environment for data management, which fosters business success."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.173b7bca.js b/assets/js/main.173b7bca.js deleted file mode 100644 index eb23265d5..000000000 --- a/assets/js/main.173b7bca.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.173b7bca.js.LICENSE.txt */ -(self.webpackChunkdocumentation=self.webpackChunkdocumentation||[]).push([[179],{20830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(67294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},57052:(e,t,n)=>{"use strict";n.d(t,{D:()=>a});var r=n(67294);function a(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(87462),o=n(68356),i=n.n(o),s=n(16887);const l={"00685d85":[()=>n.e(9417).then(n.bind(n,25197)),"@site/docs/quality-gates/UploadQualityGateToReportPortal.mdx",25197],"00dd8e60":[()=>n.e(3466).then(n.bind(n,49737)),"@site/docs/reportportal-glossary/index.mdx",49737],"00e97bf6":[()=>n.e(4946).then(n.bind(n,93641)),"@site/docs/dashboards-and-widgets/TableComponentHealthCheck.mdx",93641],"0225d014":[()=>n.e(4587).then(n.bind(n,64621)),"@site/docs/dev-guides/ReportPortalAPI.mdx",64621],"027748e9":[()=>n.e(5973).then(n.bind(n,41190)),"@site/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50.mdx",41190],"027cf034":[()=>n.e(9168).then(n.bind(n,22090)),"@site/docs/log-data-in-reportportal/ImplementOwnIntegration.md",22090],"05bac479":[()=>n.e(5114).then(n.bind(n,47933)),"@site/docs/dev-guides/ReportingDevelopersGuide.md",47933],"066b0604":[()=>n.e(4665).then(n.t.bind(n,71621,19)),"~docs/default/category-docs-defaultsidebar-category-features-557.json",71621],"069ddc90":[()=>n.e(1006).then(n.bind(n,49656)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured.md",49656],"06de0160":[()=>n.e(2654).then(n.t.bind(n,14573,19)),"~docs/default/category-docs-defaultsidebar-category-reportportal-configuration-471.json",14573],"07801322":[()=>n.e(9413).then(n.bind(n,58516)),"@site/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolve.md",58516],"07d78bf6":[()=>n.e(747).then(n.bind(n,5440)),"@site/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20.mdx",5440],"086e8e8b":[()=>n.e(5296).then(n.bind(n,45257)),"@site/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull.md",45257],"0a099a4f":[()=>n.e(1995).then(n.bind(n,73255)),"@site/docs/work-with-reports/UniqueId.md",73255],"0e384e19":[()=>n.e(9671).then(n.bind(n,59881)),"@site/docs/intro.md",59881],"0e3ba2c6":[()=>n.e(9314).then(n.t.bind(n,13487,19)),"~docs/default/category-docs-defaultsidebar-category-user-account-a12.json",13487],"11ffa791":[()=>n.e(3969).then(n.bind(n,80060)),"@site/docs/dev-guides/RerunDevelopersGuide.mdx",80060],"145e5b9f":[()=>n.e(5106).then(n.bind(n,32333)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/index.md",32333],"146035e7":[()=>n.e(8193).then(n.bind(n,44323)),"@site/docs/dev-guides/InteractionsBetweenAPIAndAnalyzer.mdx",44323],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,34228)),"@theme/DocCategoryGeneratedIndexPage",34228],17896441:[()=>Promise.all([n.e(532),n.e(1949),n.e(7918)]).then(n.bind(n,34465)),"@theme/DocItem",34465],"17cee6e7":[()=>n.e(7810).then(n.bind(n,8988)),"@site/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace.md",8988],"17e33bf8":[()=>n.e(4216).then(n.bind(n,80054)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch.md",80054],"18fa88f3":[()=>n.e(3099).then(n.bind(n,50487)),"@site/docs/releases/Version5.3.0.md",50487],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,56675)),"@theme/SearchPage",56675],"1a613e91":[()=>n.e(5398).then(n.t.bind(n,20618,19)),"~docs/default/category-docs-defaultsidebar-category-loggers-1-389.json",20618],"1be78505":[()=>Promise.all([n.e(532),n.e(8382),n.e(9514)]).then(n.bind(n,19963)),"@theme/DocPage",19963],"1d9da1f4":[()=>n.e(2387).then(n.bind(n,58957)),"@site/docs/features/UnifiedTestReporting.md",58957],"1da087e0":[()=>n.e(2297).then(n.t.bind(n,74909,19)),"~docs/default/category-docs-defaultsidebar-category-issues-troubleshooting-13a.json",74909],"1e1599cb":[()=>n.e(2630).then(n.bind(n,56951)),"@site/docs/log-data-in-reportportal/test-framework-integration/PHP/Behat.md",56951],"1f98178b":[()=>n.e(9714).then(n.bind(n,38238)),"@site/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins.mdx",38238],"220207ff":[()=>n.e(2147).then(n.bind(n,83758)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress.md",83758],"223301d0":[()=>n.e(9709).then(n.bind(n,448)),"@site/docs/releases/Version5.7.2.md",448],"23a9762f":[()=>n.e(2253).then(n.bind(n,34234)),"@site/docs/dev-guides/AsynchronousReporting.mdx",34234],"24317c98":[()=>n.e(8010).then(n.bind(n,38980)),"@site/docs/installation-steps/BasicMonitoringConfiguration.md",38980],"247783bb":[()=>n.e(9334).then(n.t.bind(n,83769,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"24ad2548":[()=>n.e(5165).then(n.t.bind(n,99082,19)),"~docs/default/category-docs-defaultsidebar-category-saved-searches-filters-344.json",99082],"267ccbc6":[()=>n.e(2169).then(n.bind(n,94199)),"@site/docs/log-data-in-reportportal/test-framework-integration/Other/index.md",94199],"269e975a":[()=>n.e(3079).then(n.bind(n,31187)),"@site/docs/log-data-in-reportportal/test-framework-integration/Python/behave.md",31187],"28b23d2a":[()=>n.e(5711).then(n.t.bind(n,5446,19)),"~docs/default/category-docs-defaultsidebar-category-terms-conditions-559.json",5446],"295d89fa":[()=>n.e(452).then(n.bind(n,75272)),"@site/docs/dashboards-and-widgets/UniqueBugsTable.mdx",75272],"2a424e83":[()=>n.e(2310).then(n.bind(n,11046)),"@site/docs/quality-gates/QualityRulesConfiguration.mdx",11046],"2baa0d2f":[()=>n.e(5400).then(n.bind(n,4472)),"@site/docs/dashboards-and-widgets/ComponentHealthCheck.mdx",4472],"2c6eda14":[()=>n.e(9866).then(n.bind(n,43319)),"@site/docs/FAQ/index.md",43319],"306aee24":[()=>n.e(414).then(n.bind(n,35860)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/xUnit.md",35860],"33580f2e":[()=>n.e(2106).then(n.bind(n,49538)),"@site/docs/installation-steps/DeployWithDockerOnLinuxMac.md",49538],"338561f9":[()=>n.e(3885).then(n.bind(n,53510)),"@site/docs/dashboards-and-widgets/PassingRateSummary.mdx",53510],"35b6bff0":[()=>n.e(7819).then(n.bind(n,31426)),"@site/docs/case-studies/ImprovingTestAutomationStability.mdx",31426],"37a6abbb":[()=>n.e(742).then(n.bind(n,41146)),"@site/docs/analysis/SearchForTheSimilarToInvestigateItems.mdx",41146],"37e2c88f":[()=>n.e(1688).then(n.bind(n,66844)),"@site/docs/installation-steps/DeployOnUbuntuOS.md",66844],"3938886d":[()=>n.e(1434).then(n.bind(n,61490)),"@site/docs/dashboards-and-widgets/MostPopularPatternTableTop20.mdx",61490],"396f0464":[()=>n.e(2720).then(n.t.bind(n,14501,19)),"~docs/default/category-docs-defaultsidebar-category-loggers-48e.json",14501],"39df2a2d":[()=>n.e(9836).then(n.bind(n,30831)),"@site/docs/installation-steps/DeployWithKubernetes.md",30831],"3ac6333e":[()=>n.e(9998).then(n.t.bind(n,56373,19)),"~docs/default/category-docs-defaultsidebar-category-log-data-in-reportportal-f77.json",56373],"3c75ee7d":[()=>n.e(9222).then(n.bind(n,16619)),"@site/docs/installation-steps/MaintainCommandsCheatSheet.md",16619],"3d7d2ef4":[()=>n.e(4580).then(n.bind(n,43477)),"@site/docs/work-with-reports/TestCaseId.md",43477],"402a601e":[()=>n.e(1229).then(n.bind(n,2928)),"@site/docs/releases/Version5.0.0.md",2928],"40be41a9":[()=>n.e(6325).then(n.bind(n,3848)),"@site/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAML.mdx",3848],"41a0b225":[()=>n.e(1392).then(n.bind(n,18057)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J.md",18057],"4656db35":[()=>n.e(7260).then(n.bind(n,41639)),"@site/docs/log-data-in-reportportal/ReportingSDK.md",41639],"46ef8a18":[()=>n.e(5090).then(n.bind(n,11556)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents.md",11556],"4779d29a":[()=>n.e(110).then(n.bind(n,25025)),"@site/docs/releases/Version4.3.md",25025],"47aa7b91":[()=>n.e(6365).then(n.bind(n,21274)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jest.md",21274],"4859ca05":[()=>n.e(5635).then(n.bind(n,98059)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUI.md",98059],"491e614f":[()=>n.e(7003).then(n.bind(n,63135)),"@site/docs/releases/Version5.7.0.md",63135],"4b05701a":[()=>n.e(2822).then(n.bind(n,32864)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener.md",32864],50343655:[()=>n.e(9878).then(n.bind(n,12803)),"@site/docs/plugins/AtlassianJiraServer.mdx",12803],"50df0f53":[()=>n.e(7778).then(n.bind(n,5396)),"@site/docs/features/RESTAPI.md",5396],"512e5a2f":[()=>n.e(8960).then(n.bind(n,672)),"@site/docs/releases/Version5.2.0.md",672],"5200637f":[()=>n.e(9106).then(n.bind(n,84855)),"@site/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit.md",84855],"525802b3":[()=>n.e(8934).then(n.bind(n,66465)),"@site/docs/user-account/RestoreAPassword.mdx",66465],"527a0828":[()=>n.e(104).then(n.bind(n,94696)),"@site/docs/plugins/Rally.mdx",94696],"53e81573":[()=>n.e(5421).then(n.bind(n,13651)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha.md",13651],"54146d47":[()=>n.e(150).then(n.bind(n,11710)),"@site/docs/analysis/UniqueErrorAnalysis.mdx",11710],"5668619f":[()=>n.e(225).then(n.bind(n,4636)),"@site/docs/reportportal-configuration/ProjectConfiguration.mdx",4636],"5718d6db":[()=>n.e(5222).then(n.bind(n,97937)),"@site/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion.md",97937],"58f41459":[()=>n.e(8658).then(n.bind(n,30734)),"@site/docs/analysis/MLSuggestions.md",30734],"59b068d1":[()=>n.e(6385).then(n.t.bind(n,7085,19)),"/home/runner/work/docs/docs/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],"5aa350ff":[()=>n.e(195).then(n.bind(n,5119)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine.md",5119],"5c2df135":[()=>n.e(2629).then(n.bind(n,77737)),"@site/docs/plugins/SauceLabs.mdx",77737],"5ce704b9":[()=>n.e(2439).then(n.bind(n,78201)),"@site/docs/analysis/ManualAnalysis.mdx",78201],"5e24e3bc":[()=>n.e(2539).then(n.bind(n,31389)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3.md",31389],"6063f56a":[()=>n.e(7543).then(n.bind(n,40046)),"@site/docs/dev-guides/APIDifferencesBetweenV4AndV5.md",40046],"60ab5c4c":[()=>n.e(8877).then(n.bind(n,44390)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net.md",44390],"61d84721":[()=>n.e(2813).then(n.bind(n,92928)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe.md",92928],"63a8a649":[()=>n.e(9145).then(n.bind(n,9421)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Spock.md",9421],"6417b00a":[()=>n.e(39).then(n.bind(n,56779)),"@site/docs/quality-gates/HowToInstallQualityGates.md",56779],"661e81a0":[()=>n.e(2066).then(n.bind(n,36005)),"@site/docs/log-data-in-reportportal/test-framework-integration/PHP/index.md",36005],"67854d34":[()=>n.e(9944).then(n.bind(n,16373)),"@site/docs/quality-gates/QualityGatePurpose.mdx",16373],"67d29b54":[()=>n.e(7162).then(n.bind(n,59109)),"@site/docs/releases/Version4.2.0.md",59109],"68053dc3":[()=>n.e(2471).then(n.t.bind(n,16187,19)),"~docs/default/category-docs-defaultsidebar-category-work-with-reports-040.json",16187],"69c1213a":[()=>n.e(9052).then(n.bind(n,33967)),"@site/docs/analysis/AutoAnalysisOfLaunches.mdx",33967],"69cd44f6":[()=>n.e(8448).then(n.bind(n,83156)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog.md",83156],"6b0c725a":[()=>n.e(1992).then(n.t.bind(n,35981,19)),"~docs/default/category-docs-defaultsidebar-category-releases-267.json",35981],"6bc80c47":[()=>n.e(4021).then(n.bind(n,91197)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/index.md",91197],"6e16c901":[()=>n.e(1613).then(n.bind(n,61269)),"@site/docs/issues-troubleshooting/ResolveAnalyzerKnownIssues.mdx",61269],"6ef1a459":[()=>n.e(6027).then(n.bind(n,30383)),"@site/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAML.mdx",30383],"6efd3b1f":[()=>n.e(1472).then(n.bind(n,48913)),"@site/docs/installation-steps/SetupTSLSSLInTraefik2.0.x.md",48913],"6f37af33":[()=>n.e(7971).then(n.bind(n,80411)),"@site/docs/releases/Version5.2.2.md",80411],"71498ad5":[()=>n.e(1413).then(n.bind(n,59715)),"@site/docs/log-data-in-reportportal/ImportDataToReportPortal.mdx",59715],"72119d79":[()=>n.e(5212).then(n.t.bind(n,15739,19)),"~docs/default/category-docs-defaultsidebar-category-quality-gates-e33.json",15739],"7236dcb4":[()=>n.e(7213).then(n.bind(n,10517)),"@site/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortal.mdx",10517],"73bb90fb":[()=>n.e(5326).then(n.bind(n,3514)),"@site/docs/quality-gates/IntegrationWithCICD/index.md",3514],"74cbe0b8":[()=>n.e(367).then(n.bind(n,79883)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS.md",79883],"75581c38":[()=>n.e(130).then(n.bind(n,37410)),"@site/docs/releases/Version5.3.1..md",37410],"76c8ca36":[()=>n.e(3047).then(n.bind(n,48059)),"@site/docs/releases/Versionv23.1.md",48059],"781adc30":[()=>n.e(3761).then(n.bind(n,73395)),"@site/docs/releases/Version3.3.2.md",73395],"7821a10c":[()=>n.e(1490).then(n.bind(n,53654)),"@site/docs/issues-troubleshooting/TuningCITool.mdx",53654],"78dfb7e9":[()=>n.e(795).then(n.bind(n,24146)),"@site/docs/quality-gates/QualityGateEdit.md",24146],"7a3e07c8":[()=>n.e(288).then(n.bind(n,708)),"@site/docs/releases/Version5.4.0.md",708],"7a770024":[()=>n.e(562).then(n.bind(n,2166)),"@site/docs/work-with-reports/InvestigationOfFailure.md",2166],"7bbaf234":[()=>n.e(7318).then(n.bind(n,19820)),"@site/docs/user-role-guides/index.md",19820],"7bd95ec4":[()=>n.e(3360).then(n.bind(n,18593)),"@site/docs/reportportal-configuration/authorization/ActiveDirectory.md",18593],"7ce8e9eb":[()=>n.e(8939).then(n.bind(n,8117)),"@site/docs/releases/Version5.2.1.md",8117],"7d141066":[()=>n.e(3931).then(n.bind(n,22699)),"@site/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve.md",22699],"7de4166c":[()=>n.e(3477).then(n.bind(n,53402)),"@site/docs/quality-gates/DeleteQualityGates.md",53402],"7ef0b1f8":[()=>n.e(8734).then(n.bind(n,32474)),"@site/docs/analysis/PatternAnalysis.mdx",32474],"7f9bbddb":[()=>n.e(4275).then(n.bind(n,47425)),"@site/docs/releases/Version4.1.0.md",47425],"81bc17b9":[()=>n.e(8069).then(n.bind(n,51293)),"@site/docs/reportportal-tutorial/index.mdx",51293],"8272edfd":[()=>n.e(8007).then(n.bind(n,4115)),"@site/docs/dashboards-and-widgets/DifferentLaunchesComparisonChart.mdx",4115],"838a8de2":[()=>n.e(8943).then(n.bind(n,23576)),"@site/docs/features/CategorisationOfFailures.md",23576],"84982dca":[()=>n.e(4472).then(n.bind(n,36861)),"@site/docs/dashboards-and-widgets/NonPassedTestCasesTrendChart.mdx",36861],"849f9212":[()=>n.e(1320).then(n.bind(n,89210)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/VSTest.md",89210],"84d47c34":[()=>n.e(5445).then(n.bind(n,13905)),"@site/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically.mdx",13905],"84e29575":[()=>n.e(6412).then(n.bind(n,69994)),"@site/docs/work-with-reports/ViewLaunches.mdx",69994],"855239bf":[()=>n.e(4695).then(n.bind(n,67322)),"@site/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunches.mdx",67322],"855c8e88":[()=>n.e(102).then(n.bind(n,95537)),"@site/docs/dashboards-and-widgets/OverallStatistics.mdx",95537],"85d780d7":[()=>n.e(7762).then(n.bind(n,96183)),"@site/docs/dashboards-and-widgets/PossibleDashboardsInReportPortal.mdx",96183],"87014e7c":[()=>n.e(1168).then(n.bind(n,77985)),"@site/docs/releases/Version4.0.0.md",77985],"882bd5c3":[()=>n.e(6255).then(n.bind(n,55480)),"@site/docs/dashboards-and-widgets/FailedCasesTrendChart.mdx",55480],"89b4dc5b":[()=>n.e(5502).then(n.bind(n,15060)),"@site/docs/releases/Version5.0RC.md",15060],"8a0d7266":[()=>n.e(3608).then(n.bind(n,28347)),"@site/docs/saved-searches-filters/CreateFilters.mdx",28347],"8c63d4ea":[()=>n.e(9911).then(n.bind(n,42326)),"@site/docs/features/QualityGates.md",42326],"8dc7c7b8":[()=>n.e(4485).then(n.bind(n,63527)),"@site/docs/saved-searches-filters/FiltersPage.md",63527],"8f8fcdca":[()=>n.e(5618).then(n.bind(n,58807)),"@site/docs/user-account/DeleteAccount.mdx",58807],"8fda0747":[()=>n.e(8916).then(n.bind(n,79990)),"@site/docs/log-data-in-reportportal/test-framework-integration/Python/index.md",79990],"8ff8e535":[()=>n.e(1608).then(n.bind(n,25356)),"@site/docs/releases/Version5.6.2.md",25356],"90abdf6b":[()=>n.e(4571).then(n.bind(n,31716)),"@site/docs/releases/Version5.2.3.md",31716],"910d5a4e":[()=>n.e(6059).then(n.bind(n,81278)),"@site/docs/plugins/EmailServer.mdx",81278],"914c5fe7":[()=>n.e(7868).then(n.bind(n,94210)),"@site/docs/reportportal-configuration/authorization/index.md",94210],"925c0b5c":[()=>n.e(5355).then(n.bind(n,27172)),"@site/docs/installation-steps/OptimalPerformanceHardwareSetup.mdx",27172],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"97b6d501":[()=>n.e(9559).then(n.bind(n,79203)),"@site/docs/releases/Version5.1.0.md",79203],"98a1fcd9":[()=>n.e(2516).then(n.bind(n,66603)),"@site/docs/dashboards-and-widgets/ManageWidgets.mdx",66603],"98b03dc7":[()=>n.e(2719).then(n.bind(n,29800)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/TestNG.md",29800],"98ca32ed":[()=>n.e(1985).then(n.t.bind(n,16669,19)),"~docs/default/category-docs-defaultsidebar-category-admin-panel-ca1.json",16669],"9a364eec":[()=>n.e(3155).then(n.bind(n,43973)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide.md",43973],"9bf2f1ad":[()=>n.e(26).then(n.bind(n,19692)),"@site/docs/dashboards-and-widgets/LaunchStatisticsChart.mdx",19692],"9bfb314f":[()=>n.e(3897).then(n.bind(n,87051)),"@site/docs/releases/Version5.6.1.md",87051],"9c874da5":[()=>n.e(2483).then(n.bind(n,71442)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO.md",71442],"9ce9f59c":[()=>n.e(757).then(n.bind(n,40877)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog.md",40877],a0d375c1:[()=>n.e(5069).then(n.bind(n,89137)),"@site/docs/case-studies/IncreasingTestAutomationStabilityAndVisibility.mdx",89137],a11133f1:[()=>n.e(529).then(n.bind(n,43409)),"@site/docs/dashboards-and-widgets/LaunchesDurationChart.mdx",43409],a194bf09:[()=>n.e(7727).then(n.bind(n,4649)),"@site/docs/issues-troubleshooting/HowToCheckLDAPConnection.md",4649],a1e6466d:[()=>n.e(2580).then(n.bind(n,8584)),"@site/docs/releases/Version3.3.2-1.md",8584],a4179dd8:[()=>n.e(7537).then(n.bind(n,78686)),"@site/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeception.md",78686],a573d8f7:[()=>n.e(3322).then(n.bind(n,5375)),"@site/docs/plugins/AzureDevOpsBTS.mdx",5375],a68ea571:[()=>n.e(6636).then(n.bind(n,50472)),"@site/docs/installation-steps/ReportPortal23.1FileStorageOptions.md",50472],a6ef86a7:[()=>n.e(9272).then(n.bind(n,69976)),"@site/docs/dashboards-and-widgets/CumulativeTrendChart.mdx",69976],a74ebc46:[()=>n.e(1510).then(n.bind(n,98051)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postman.md",98051],a76ff2eb:[()=>n.e(1904).then(n.bind(n,44512)),"@site/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal.mdx",44512],a7c4da1a:[()=>n.e(8846).then(n.bind(n,96859)),"@site/docs/admin-panel/EventMonitoring.mdx",96859],a7f8e40f:[()=>n.e(570).then(n.bind(n,25614)),"@site/docs/log-data-in-reportportal/test-framework-integration/index.mdx",25614],a830598a:[()=>n.e(5414).then(n.bind(n,99759)),"@site/docs/reportportal-configuration/ReportPortalJobsConfiguration.md",99759],a89000ee:[()=>n.e(6002).then(n.bind(n,84302)),"@site/docs/saved-searches-filters/ManageFilters.mdx",84302],ab510b4f:[()=>n.e(2024).then(n.bind(n,57702)),"@site/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFramework.md",57702],abf83c96:[()=>n.e(8633).then(n.bind(n,39056)),"@site/docs/dev-guides/AttachmentsGuide.mdx",39056],ac3f047d:[()=>n.e(1219).then(n.bind(n,42321)),"@site/docs/admin-panel/AllProjectsPage.mdx",42321],b02e6e62:[()=>n.e(38).then(n.bind(n,73733)),"@site/docs/dev-guides/RetriesReporting.mdx",73733],b3bfe149:[()=>n.e(6066).then(n.bind(n,9012)),"@site/docs/log-data-in-reportportal/HowToRunYourTests.md",9012],b8e550c7:[()=>n.e(7062).then(n.bind(n,78202)),"@site/docs/case-studies/ReducingRegressionTimeBy50.mdx",78202],b90e80fa:[()=>n.e(7312).then(n.bind(n,21935)),"@site/docs/releases/Version5.3.2.md",21935],ba4cd107:[()=>n.e(862).then(n.bind(n,9213)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/JBehave.md",9213],bc0c4574:[()=>n.e(6635).then(n.bind(n,94023)),"@site/docs/log-data-in-reportportal/test-framework-integration/Python/nosetests.md",94023],bc209e08:[()=>n.e(4772).then(n.t.bind(n,21061,19)),"~docs/default/category-docs-defaultsidebar-category-installation-steps-e47.json",21061],bc7fa033:[()=>n.e(2947).then(n.bind(n,8832)),"@site/docs/releases/Version5.3.5.md",8832],bc969540:[()=>n.e(1562).then(n.t.bind(n,64556,19)),"~docs/default/category-docs-defaultsidebar-category-case-studies-3f8.json",64556],bcc7741c:[()=>n.e(8963).then(n.bind(n,25318)),"@site/docs/installation-steps/ScalingUpReportPortalAPIService.md",25318],bdb17ab6:[()=>n.e(5792).then(n.bind(n,79682)),"@site/docs/dashboards-and-widgets/WidgetCreation.mdx",79682],be477480:[()=>n.e(5170).then(n.bind(n,522)),"@site/docs/analysis/HowModelsAreRetrained.md",522],bebf2496:[()=>n.e(4612).then(n.bind(n,90146)),"@site/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI.md",90146],befb6058:[()=>n.e(3197).then(n.bind(n,41705)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright.md",41705],bf044f46:[()=>n.e(8982).then(n.bind(n,39117)),"@site/docs/plugins/AtlassianJiraCloud.mdx",39117],bf477335:[()=>n.e(963).then(n.bind(n,75916)),"@site/docs/reportportal-configuration/CreationOfProjectAndAddingUsers.md",75916],c059af28:[()=>n.e(1078).then(n.bind(n,85784)),"@site/docs/features/AIFailureReasonDetection.md",85784],c3038888:[()=>n.e(7100).then(n.bind(n,94810)),"@site/docs/reportportal-configuration/IntegrationViaPlugin.mdx",94810],c3ddf248:[()=>n.e(4057).then(n.bind(n,88873)),"@site/docs/releases/Version5.6.0.md",88873],c60355ff:[()=>n.e(9063).then(n.bind(n,12e3)),"@site/docs/dashboards-and-widgets/WorkWithDashboards.mdx",12e3],c7b25a99:[()=>n.e(5449).then(n.bind(n,17696)),"@site/docs/work-with-reports/OperationsUnderLaunches.mdx",17696],c7dff32f:[()=>n.e(6329).then(n.bind(n,25202)),"@site/docs/dashboards-and-widgets/ProjectActivityPanel.mdx",25202],c84a9109:[()=>n.e(8760).then(n.bind(n,52587)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/NUnit.md",52587],c8588910:[()=>n.e(8834).then(n.bind(n,34419)),"@site/docs/dashboards-and-widgets/PassingRatePerLaunch.mdx",34419],c9eb37d0:[()=>n.e(376).then(n.bind(n,11223)),"@site/docs/quality-gates/AssessmentOfTestResultsUsingQualityGates.mdx",11223],ca88c6ba:[()=>n.e(9509).then(n.t.bind(n,92509,19)),"~docs/default/category-docs-defaultsidebar-category-developers-guides-baf.json",92509],caf5215e:[()=>n.e(6056).then(n.bind(n,65626)),"@site/docs/user-account/DataRetentionProcedure.md",65626],cdbcc403:[()=>n.e(2039).then(n.bind(n,7387)),"@site/docs/features/VisualisationOfTestResults.md",7387],ce42bfab:[()=>n.e(629).then(n.bind(n,28589)),"@site/docs/releases/Version5.6.3.md",28589],cf1f907d:[()=>n.e(3588).then(n.bind(n,62681)),"@site/docs/installation-steps/DeployWithoutDocker.md",62681],cf84801a:[()=>n.e(3962).then(n.t.bind(n,27507,19)),"~docs/default/category-docs-defaultsidebar-category-analysis-395.json",27507],d008ba81:[()=>n.e(3731).then(n.bind(n,66490)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4.md",66490],d09084ee:[()=>n.e(3653).then(n.bind(n,37833)),"@site/docs/reportportal-configuration/authorization/GitHub.md",37833],d26eef7b:[()=>n.e(3082).then(n.bind(n,37122)),"@site/docs/user-account/EditPersonalInformation.mdx",37122],d331ba2f:[()=>n.e(4143).then(n.bind(n,92650)),"@site/docs/plugins/ManagePlugins.mdx",92650],d5397252:[()=>n.e(9292).then(n.bind(n,44904)),"@site/docs/installation-steps/AdditionalConfigurationParameters.md",44904],d9fb2f5f:[()=>n.e(8105).then(n.bind(n,59137)),"@site/docs/log-data-in-reportportal/test-framework-integration/Python/pytest.md",59137],da84d3ce:[()=>n.e(5261).then(n.bind(n,16448)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumber.md",16448],dadf679c:[()=>n.e(7330).then(n.bind(n,10949)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5.md",10949],db699483:[()=>n.e(9721).then(n.bind(n,20588)),"@site/docs/installation-steps/DeployWithDockerOnWindows.md",20588],dbee08c0:[()=>n.e(6797).then(n.bind(n,30490)),"@site/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatistic.mdx",30490],dc2f4bb3:[()=>n.e(4415).then(n.bind(n,58709)),"@site/docs/work-with-reports/HistoryOfLaunches.mdx",58709],dc8f36d8:[()=>n.e(6863).then(n.bind(n,24846)),"@site/docs/reportportal-configuration/authorization/SAMLProvider/index.mdx",24846],de98de14:[()=>n.e(4953).then(n.bind(n,21562)),"@site/docs/reportportal-configuration/authorization/LDAP.md",21562],dffd512f:[()=>n.e(720).then(n.bind(n,10830)),"@site/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept.md",10830],e1b7d783:[()=>n.e(3892).then(n.bind(n,61182)),"@site/docs/dev-guides/PluginDevelopersGuide.mdx",61182],e2f45cda:[()=>n.e(4585).then(n.bind(n,38491)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback.md",38491],e378912b:[()=>n.e(7811).then(n.t.bind(n,45202,19)),"~docs/default/category-docs-defaultsidebar-category-plugins-0dd.json",45202],e3793912:[()=>n.e(2251).then(n.bind(n,5669)),"@site/docs/releases/Version5.7.4.md",5669],e4cd4c7a:[()=>n.e(3703).then(n.bind(n,80285)),"@site/docs/releases/Version23.2.md",80285],e4ce6935:[()=>n.e(666).then(n.bind(n,40363)),"@site/docs/features/RichArtifactsInTestReports.md",40363],e5386a75:[()=>n.e(6086).then(n.bind(n,55030)),"@site/docs/dashboards-and-widgets/FlakyTestCasesTableTop20.mdx",55030],e8be83b4:[()=>n.e(511).then(n.bind(n,61794)),"@site/docs/features/RealTimeReporting.md",61794],e9a76c81:[()=>n.e(7979).then(n.bind(n,64203)),"@site/docs/case-studies/ReducingRegressionAnalysisEfforts.mdx",64203],e9d600cd:[()=>n.e(3834).then(n.bind(n,68042)),"@site/docs/releases/Version5.5.0.md",68042],ea49187a:[()=>n.e(3854).then(n.bind(n,86530)),"@site/docs/terms-and-conditions/PremiumFeatures.md",86530],ea56d3e1:[()=>n.e(1451).then(n.bind(n,6673)),"@site/docs/reportportal-configuration/ComponentsOverview.md",6673],ec038b21:[()=>n.e(4735).then(n.bind(n,84828)),"@site/docs/dev-guides/BackEndJavaContributionGuide.mdx",84828],ed9ad71b:[()=>n.e(4708).then(n.t.bind(n,75344,19)),"~docs/default/category-docs-defaultsidebar-category-dashboards-and-widgets-de3.json",75344],eebb9f3e:[()=>n.e(7145).then(n.bind(n,46542)),"@site/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack.md",46542],ef6e5522:[()=>n.e(2650).then(n.bind(n,17616)),"@site/docs/releases/Version5.3.3.md",17616],ef851841:[()=>n.e(1627).then(n.bind(n,94812)),"@site/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlow.md",94812],f7444008:[()=>n.e(973).then(n.bind(n,58079)),"@site/docs/dashboards-and-widgets/LaunchesTable.mdx",58079],fa7527f5:[()=>n.e(8125).then(n.bind(n,10666)),"@site/docs/releases/Version5.7.1.md",10666],fb2c10d0:[()=>n.e(9779).then(n.bind(n,93706)),"@site/docs/work-with-reports/FilteringLaunches.mdx",93706],fb391353:[()=>n.e(3540).then(n.bind(n,72972)),"@site/docs/admin-panel/AllUsersPage.mdx",72972],fbe4c47e:[()=>n.e(8893).then(n.bind(n,64866)),"@site/docs/dashboards-and-widgets/TestCasesGrowthTrendChart.mdx",64866],fd1dd87b:[()=>n.e(2510).then(n.bind(n,39858)),"@site/docs/releases/Version5.7.3.md",39858],fd64f10f:[()=>n.e(8467).then(n.bind(n,79906)),"@site/docs/log-data-in-reportportal/test-framework-integration/Java/index.md",79906],fea2b63c:[()=>n.e(3938).then(n.bind(n,4621)),"@site/docs/quality-gates/FeatureOverview.md",4621],ff6a9465:[()=>n.e(2346).then(n.bind(n,10413)),"@site/docs/installation-steps/DeployWithAWSECSFargate.md",10413]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var d=n(99670),u=n(30226);function p(e,t){if("*"===e)return i()({loading:c,loader:()=>Promise.all([n.e(532),n.e(8382),n.e(6798)]).then(n.bind(n,86798)),modules:["@theme/NotFound"],webpack:()=>[86798],render(e,t){const n=e.default;return r.createElement(u.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=s[`${e}-${t}`],p={},f=[],m=[],g=(0,d.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:p,modules:f,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const s=n.split(".");s.slice(0,-1).forEach((e=>{o=o[e]})),o[s[s.length-1]]=a}));const s=i.__comp;delete i.__comp;const l=i.__context;return delete i.__context,r.createElement(u.z,{value:l},r.createElement(s,(0,a.Z)({},i,n)))}})}const f=[{path:"/docs/search",component:p("/docs/search","d02"),exact:!0},{path:"/docs/",component:p("/docs/","736"),routes:[{path:"/docs/",component:p("/docs/","157"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/admin-panel/AllProjectsPage",component:p("/docs/admin-panel/AllProjectsPage","cda"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/admin-panel/AllUsersPage",component:p("/docs/admin-panel/AllUsersPage","35a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/admin-panel/EventMonitoring",component:p("/docs/admin-panel/EventMonitoring","c38"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/AutoAnalysisOfLaunches",component:p("/docs/analysis/AutoAnalysisOfLaunches","5c8"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/HowModelsAreRetrained",component:p("/docs/analysis/HowModelsAreRetrained","ed8"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/ManualAnalysis",component:p("/docs/analysis/ManualAnalysis","465"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/MLSuggestions",component:p("/docs/analysis/MLSuggestions","c8a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/PatternAnalysis",component:p("/docs/analysis/PatternAnalysis","fcd"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/SearchForTheSimilarToInvestigateItems",component:p("/docs/analysis/SearchForTheSimilarToInvestigateItems","5ba"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/analysis/UniqueErrorAnalysis",component:p("/docs/analysis/UniqueErrorAnalysis","ec9"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/case-studies/ImprovingTestAutomationStability",component:p("/docs/case-studies/ImprovingTestAutomationStability","09e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/case-studies/IncreasingTestAutomationStabilityAndVisibility",component:p("/docs/case-studies/IncreasingTestAutomationStabilityAndVisibility","4af"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/case-studies/ReducingRegressionAnalysisEfforts",component:p("/docs/case-studies/ReducingRegressionAnalysisEfforts","e27"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/case-studies/ReducingRegressionTimeBy50",component:p("/docs/case-studies/ReducingRegressionTimeBy50","ef4"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/admin-panel",component:p("/docs/category/admin-panel","469"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/analysis",component:p("/docs/category/analysis","198"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/case-studies",component:p("/docs/category/case-studies","4fc"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/dashboards-and-widgets",component:p("/docs/category/dashboards-and-widgets","a92"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/developers-guides",component:p("/docs/category/developers-guides","72c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/features",component:p("/docs/category/features","e44"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/installation-steps",component:p("/docs/category/installation-steps","fc2"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/issues-troubleshooting",component:p("/docs/category/issues-troubleshooting","d5d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/log-data-in-reportportal",component:p("/docs/category/log-data-in-reportportal","696"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/loggers",component:p("/docs/category/loggers","64f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/loggers-1",component:p("/docs/category/loggers-1","004"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/plugins",component:p("/docs/category/plugins","e50"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/quality-gates",component:p("/docs/category/quality-gates","3c6"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/releases",component:p("/docs/category/releases","0bf"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/reportportal-configuration",component:p("/docs/category/reportportal-configuration","7a6"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/saved-searches-filters",component:p("/docs/category/saved-searches-filters","d4c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/terms--conditions",component:p("/docs/category/terms--conditions","13e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/user-account",component:p("/docs/category/user-account","0c6"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/category/work-with-reports",component:p("/docs/category/work-with-reports","a51"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/ComponentHealthCheck",component:p("/docs/dashboards-and-widgets/ComponentHealthCheck","656"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/CumulativeTrendChart",component:p("/docs/dashboards-and-widgets/CumulativeTrendChart","9c3"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/DifferentLaunchesComparisonChart",component:p("/docs/dashboards-and-widgets/DifferentLaunchesComparisonChart","d78"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/FailedCasesTrendChart",component:p("/docs/dashboards-and-widgets/FailedCasesTrendChart","c81"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/FlakyTestCasesTableTop20",component:p("/docs/dashboards-and-widgets/FlakyTestCasesTableTop20","ff5"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunches",component:p("/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunches","350"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/LaunchesDurationChart",component:p("/docs/dashboards-and-widgets/LaunchesDurationChart","9dd"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/LaunchesTable",component:p("/docs/dashboards-and-widgets/LaunchesTable","97c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatistic",component:p("/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatistic","c39"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/LaunchStatisticsChart",component:p("/docs/dashboards-and-widgets/LaunchStatisticsChart","d0d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/ManageWidgets",component:p("/docs/dashboards-and-widgets/ManageWidgets","1ac"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50",component:p("/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50","51a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/MostPopularPatternTableTop20",component:p("/docs/dashboards-and-widgets/MostPopularPatternTableTop20","601"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20",component:p("/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","2ad"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/NonPassedTestCasesTrendChart",component:p("/docs/dashboards-and-widgets/NonPassedTestCasesTrendChart","a20"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/OverallStatistics",component:p("/docs/dashboards-and-widgets/OverallStatistics","056"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/PassingRatePerLaunch",component:p("/docs/dashboards-and-widgets/PassingRatePerLaunch","7ce"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/PassingRateSummary",component:p("/docs/dashboards-and-widgets/PassingRateSummary","29a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/PossibleDashboardsInReportPortal",component:p("/docs/dashboards-and-widgets/PossibleDashboardsInReportPortal","1c3"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/ProjectActivityPanel",component:p("/docs/dashboards-and-widgets/ProjectActivityPanel","c5c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/TableComponentHealthCheck",component:p("/docs/dashboards-and-widgets/TableComponentHealthCheck","ded"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/TestCasesGrowthTrendChart",component:p("/docs/dashboards-and-widgets/TestCasesGrowthTrendChart","6fa"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/UniqueBugsTable",component:p("/docs/dashboards-and-widgets/UniqueBugsTable","69e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/WidgetCreation",component:p("/docs/dashboards-and-widgets/WidgetCreation","b77"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dashboards-and-widgets/WorkWithDashboards",component:p("/docs/dashboards-and-widgets/WorkWithDashboards","1cb"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/APIDifferencesBetweenV4AndV5",component:p("/docs/dev-guides/APIDifferencesBetweenV4AndV5","0d0"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/AsynchronousReporting",component:p("/docs/dev-guides/AsynchronousReporting","fcd"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/AttachmentsGuide",component:p("/docs/dev-guides/AttachmentsGuide","482"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/BackEndJavaContributionGuide",component:p("/docs/dev-guides/BackEndJavaContributionGuide","a58"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/InteractionsBetweenAPIAndAnalyzer",component:p("/docs/dev-guides/InteractionsBetweenAPIAndAnalyzer","eb2"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/PluginDevelopersGuide",component:p("/docs/dev-guides/PluginDevelopersGuide","36a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/ReportingDevelopersGuide",component:p("/docs/dev-guides/ReportingDevelopersGuide","764"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/ReportPortalAPI",component:p("/docs/dev-guides/ReportPortalAPI","a08"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/RerunDevelopersGuide",component:p("/docs/dev-guides/RerunDevelopersGuide","7c3"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/dev-guides/RetriesReporting",component:p("/docs/dev-guides/RetriesReporting","164"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/FAQ/",component:p("/docs/FAQ/","a88"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/AIFailureReasonDetection",component:p("/docs/features/AIFailureReasonDetection","f8d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/CategorisationOfFailures",component:p("/docs/features/CategorisationOfFailures","06a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/QualityGates",component:p("/docs/features/QualityGates","470"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/RealTimeReporting",component:p("/docs/features/RealTimeReporting","96c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/RESTAPI",component:p("/docs/features/RESTAPI","28b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/RichArtifactsInTestReports",component:p("/docs/features/RichArtifactsInTestReports","52f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/UnifiedTestReporting",component:p("/docs/features/UnifiedTestReporting","bbc"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/features/VisualisationOfTestResults",component:p("/docs/features/VisualisationOfTestResults","010"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/AdditionalConfigurationParameters",component:p("/docs/installation-steps/AdditionalConfigurationParameters","0da"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/BasicMonitoringConfiguration",component:p("/docs/installation-steps/BasicMonitoringConfiguration","46a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/DeployOnUbuntuOS",component:p("/docs/installation-steps/DeployOnUbuntuOS","c1b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/DeployWithAWSECSFargate",component:p("/docs/installation-steps/DeployWithAWSECSFargate","483"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/DeployWithDockerOnLinuxMac",component:p("/docs/installation-steps/DeployWithDockerOnLinuxMac","eca"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/DeployWithDockerOnWindows",component:p("/docs/installation-steps/DeployWithDockerOnWindows","80d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/DeployWithKubernetes",component:p("/docs/installation-steps/DeployWithKubernetes","8e3"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/DeployWithoutDocker",component:p("/docs/installation-steps/DeployWithoutDocker","cc7"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/MaintainCommandsCheatSheet",component:p("/docs/installation-steps/MaintainCommandsCheatSheet","3eb"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/OptimalPerformanceHardwareSetup",component:p("/docs/installation-steps/OptimalPerformanceHardwareSetup","006"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/ReportPortal23.1FileStorageOptions",component:p("/docs/installation-steps/ReportPortal23.1FileStorageOptions","1a8"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/ScalingUpReportPortalAPIService",component:p("/docs/installation-steps/ScalingUpReportPortalAPIService","408"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/installation-steps/SetupTSLSSLInTraefik2.0.x",component:p("/docs/installation-steps/SetupTSLSSLInTraefik2.0.x","f85"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically",component:p("/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","9f1"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace",component:p("/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","363"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/HowToCheckLDAPConnection",component:p("/docs/issues-troubleshooting/HowToCheckLDAPConnection","d7d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack",component:p("/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","72a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull",component:p("/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","3cf"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion",component:p("/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","b11"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve",component:p("/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","099"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolve",component:p("/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolve","616"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/ResolveAnalyzerKnownIssues",component:p("/docs/issues-troubleshooting/ResolveAnalyzerKnownIssues","60f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/issues-troubleshooting/TuningCITool",component:p("/docs/issues-troubleshooting/TuningCITool","1be"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/HowToRunYourTests",component:p("/docs/log-data-in-reportportal/HowToRunYourTests","60e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/ImplementOwnIntegration",component:p("/docs/log-data-in-reportportal/ImplementOwnIntegration","b31"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/ImportDataToReportPortal",component:p("/docs/log-data-in-reportportal/ImportDataToReportPortal","0dd"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/ReportingSDK",component:p("/docs/log-data-in-reportportal/ReportingSDK","eee"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/",component:p("/docs/log-data-in-reportportal/test-framework-integration/","3dc"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/","aac"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumber",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumber","d01"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/JBehave",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/JBehave","04b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4","779"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5","3a8"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","417"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","1a1"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","cdf"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","b11"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","934"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","bd6"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUI",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUI","064"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/Spock",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/Spock","258"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Java/TestNG",component:p("/docs/log-data-in-reportportal/test-framework-integration/Java/TestNG","306"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/","792"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","543"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","4fc"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","ff5"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","657"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jest",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jest","046"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","b7f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","80b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","861"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postman",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postman","442"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","c03"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO",component:p("/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","d4e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/","c7f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","d61"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","deb"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","cba"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","4bc"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/NUnit",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/NUnit","1e1"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlow",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlow","742"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/VSTest",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/VSTest","add"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Net/xUnit",component:p("/docs/log-data-in-reportportal/test-framework-integration/Net/xUnit","140"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Other/",component:p("/docs/log-data-in-reportportal/test-framework-integration/Other/","df0"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/PHP/",component:p("/docs/log-data-in-reportportal/test-framework-integration/PHP/","e46"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/PHP/Behat",component:p("/docs/log-data-in-reportportal/test-framework-integration/PHP/Behat","95a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeception",component:p("/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeception","21f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit",component:p("/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","016"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Python/",component:p("/docs/log-data-in-reportportal/test-framework-integration/Python/","ef5"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Python/behave",component:p("/docs/log-data-in-reportportal/test-framework-integration/Python/behave","052"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Python/nosetests",component:p("/docs/log-data-in-reportportal/test-framework-integration/Python/nosetests","797"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Python/pytest",component:p("/docs/log-data-in-reportportal/test-framework-integration/Python/pytest","058"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFramework",component:p("/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFramework","e76"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/AtlassianJiraCloud",component:p("/docs/plugins/AtlassianJiraCloud","150"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/AtlassianJiraServer",component:p("/docs/plugins/AtlassianJiraServer","514"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/AzureDevOpsBTS",component:p("/docs/plugins/AzureDevOpsBTS","d18"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/EmailServer",component:p("/docs/plugins/EmailServer","dd1"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/ManagePlugins",component:p("/docs/plugins/ManagePlugins","8e2"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/Rally",component:p("/docs/plugins/Rally","340"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/plugins/SauceLabs",component:p("/docs/plugins/SauceLabs","1aa"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/AssessmentOfTestResultsUsingQualityGates",component:p("/docs/quality-gates/AssessmentOfTestResultsUsingQualityGates","8d4"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/DeleteQualityGates",component:p("/docs/quality-gates/DeleteQualityGates","b60"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/FeatureOverview",component:p("/docs/quality-gates/FeatureOverview","f25"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/HowToInstallQualityGates",component:p("/docs/quality-gates/HowToInstallQualityGates","d16"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/IntegrationWithCICD/",component:p("/docs/quality-gates/IntegrationWithCICD/","7d8"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI",component:p("/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","c91"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins",component:p("/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins","998"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/QualityGateEdit",component:p("/docs/quality-gates/QualityGateEdit","412"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/QualityGatePurpose",component:p("/docs/quality-gates/QualityGatePurpose","98b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/QualityRulesConfiguration",component:p("/docs/quality-gates/QualityRulesConfiguration","fbe"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/quality-gates/UploadQualityGateToReportPortal",component:p("/docs/quality-gates/UploadQualityGateToReportPortal","bf7"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version23.2",component:p("/docs/releases/Version23.2","b9c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version3.3.2",component:p("/docs/releases/Version3.3.2","37d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version3.3.2-1",component:p("/docs/releases/Version3.3.2-1","75b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version4.0.0",component:p("/docs/releases/Version4.0.0","e0d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version4.1.0",component:p("/docs/releases/Version4.1.0","383"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version4.2.0",component:p("/docs/releases/Version4.2.0","f2a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version4.3",component:p("/docs/releases/Version4.3","4ac"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.0.0",component:p("/docs/releases/Version5.0.0","bee"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.0RC",component:p("/docs/releases/Version5.0RC","956"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.1.0",component:p("/docs/releases/Version5.1.0","132"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.2.0",component:p("/docs/releases/Version5.2.0","6f9"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.2.1",component:p("/docs/releases/Version5.2.1","ee4"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.2.2",component:p("/docs/releases/Version5.2.2","b48"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.2.3",component:p("/docs/releases/Version5.2.3","4b5"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.3.0",component:p("/docs/releases/Version5.3.0","9a2"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.3.1.",component:p("/docs/releases/Version5.3.1.","a41"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.3.2",component:p("/docs/releases/Version5.3.2","c4f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.3.3",component:p("/docs/releases/Version5.3.3","44a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.3.5",component:p("/docs/releases/Version5.3.5","59f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.4.0",component:p("/docs/releases/Version5.4.0","917"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.5.0",component:p("/docs/releases/Version5.5.0","92d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.6.0",component:p("/docs/releases/Version5.6.0","b1a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.6.1",component:p("/docs/releases/Version5.6.1","5ee"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.6.2",component:p("/docs/releases/Version5.6.2","222"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.6.3",component:p("/docs/releases/Version5.6.3","a05"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.7.0",component:p("/docs/releases/Version5.7.0","40b"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.7.1",component:p("/docs/releases/Version5.7.1","392"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.7.2",component:p("/docs/releases/Version5.7.2","c6e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.7.3",component:p("/docs/releases/Version5.7.3","49a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Version5.7.4",component:p("/docs/releases/Version5.7.4","68f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/releases/Versionv23.1",component:p("/docs/releases/Versionv23.1","b03"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/",component:p("/docs/reportportal-configuration/authorization/","253"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/ActiveDirectory",component:p("/docs/reportportal-configuration/authorization/ActiveDirectory","721"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/GitHub",component:p("/docs/reportportal-configuration/authorization/GitHub","1ca"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/LDAP",component:p("/docs/reportportal-configuration/authorization/LDAP","991"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/SAMLProvider/",component:p("/docs/reportportal-configuration/authorization/SAMLProvider/","554"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAML",component:p("/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAML","366"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAML",component:p("/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAML","cd2"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/ComponentsOverview",component:p("/docs/reportportal-configuration/ComponentsOverview","7fc"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/CreationOfProjectAndAddingUsers",component:p("/docs/reportportal-configuration/CreationOfProjectAndAddingUsers","390"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal",component:p("/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal","6f4"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/IntegrationViaPlugin",component:p("/docs/reportportal-configuration/IntegrationViaPlugin","568"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/ProjectConfiguration",component:p("/docs/reportportal-configuration/ProjectConfiguration","27f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-configuration/ReportPortalJobsConfiguration",component:p("/docs/reportportal-configuration/ReportPortalJobsConfiguration","769"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-glossary/",component:p("/docs/reportportal-glossary/","30f"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/reportportal-tutorial/",component:p("/docs/reportportal-tutorial/","0f9"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/saved-searches-filters/CreateFilters",component:p("/docs/saved-searches-filters/CreateFilters","357"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/saved-searches-filters/FiltersPage",component:p("/docs/saved-searches-filters/FiltersPage","f2c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/saved-searches-filters/ManageFilters",component:p("/docs/saved-searches-filters/ManageFilters","636"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortal",component:p("/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortal","2a2"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/terms-and-conditions/PremiumFeatures",component:p("/docs/terms-and-conditions/PremiumFeatures","721"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/user-account/DataRetentionProcedure",component:p("/docs/user-account/DataRetentionProcedure","73a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/user-account/DeleteAccount",component:p("/docs/user-account/DeleteAccount","bc4"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/user-account/EditPersonalInformation",component:p("/docs/user-account/EditPersonalInformation","092"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/user-account/RestoreAPassword",component:p("/docs/user-account/RestoreAPassword","69e"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/user-role-guides/",component:p("/docs/user-role-guides/","840"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/FilteringLaunches",component:p("/docs/work-with-reports/FilteringLaunches","a7d"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/HistoryOfLaunches",component:p("/docs/work-with-reports/HistoryOfLaunches","1a1"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/InvestigationOfFailure",component:p("/docs/work-with-reports/InvestigationOfFailure","c6a"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/OperationsUnderLaunches",component:p("/docs/work-with-reports/OperationsUnderLaunches","27c"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/TestCaseId",component:p("/docs/work-with-reports/TestCaseId","192"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/UniqueId",component:p("/docs/work-with-reports/UniqueId","6ec"),exact:!0,sidebar:"defaultSidebar"},{path:"/docs/work-with-reports/ViewLaunches",component:p("/docs/work-with-reports/ViewLaunches","627"),exact:!0,sidebar:"defaultSidebar"}]},{path:"*",component:p("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(67294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},49383:(e,t,n)=>{"use strict";var r=n(67294),a=n(73935),o=n(73727),i=n(70405),s=n(10412);const l=[n(32497),n(3310),n(18320),n(52295),n(61212)];var c=n(723),d=n(16550),u=n(18790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(87462),m=n(35742),g=n(52263),h=n(44996),b=n(86668),v=n(10833),y=n(94711),w=n(19727),S=n(43320),k=n(90197);function E(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,d.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function T(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(E,null),r.createElement(k.Z,{tag:S.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const C=new Map;function _(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,u.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var A=n(98934),P=n(58940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const L=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,u.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(L,{previousLocation:this.previousLocation,location:t},r.createElement(d.AW,{location:t,render:()=>e}))}}const D=O,N="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner",F="docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function U(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${N}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!s.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,U(e))),r.createElement("div",{id:N}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,d.TH)();return t&&n===e?r.createElement(j,null):null}function V(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,g.Z)(),i=(0,h.Z)(e),{htmlLang:s,direction:l}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:s,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var H=n(44763);function G(){const e=(0,u.H)(c.Z),t=(0,d.TH)();return r.createElement(H.Z,null,r.createElement(P.M,null,r.createElement(A.t,null,r.createElement(p,null,r.createElement(V,null),r.createElement(T,null),r.createElement(z,null),r.createElement(D,{location:_(t)},e)))))}var q=n(16887);const $=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var W=n(99670);const J=new Set,Z=new Set,Q=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,K={prefetch(e){if(!(e=>!Q()&&!Z.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,u.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,W.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?$(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Q()&&!Z.has(e))(e)&&(Z.add(e),I(e))},Y=Object.freeze(K);if(s.Z.canUseDOM){window.docusaurus=Y;const e=a.hydrate;I(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(G,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>u});var r=n(67294),a=n(36809);const o=JSON.parse('{"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-MK7ZHTL","id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/docs/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs/","mainDocId":"intro","docs":[{"id":"admin-panel/AllProjectsPage","path":"/docs/admin-panel/AllProjectsPage","sidebar":"defaultSidebar"},{"id":"admin-panel/AllUsersPage","path":"/docs/admin-panel/AllUsersPage","sidebar":"defaultSidebar"},{"id":"admin-panel/EventMonitoring","path":"/docs/admin-panel/EventMonitoring","sidebar":"defaultSidebar"},{"id":"analysis/AutoAnalysisOfLaunches","path":"/docs/analysis/AutoAnalysisOfLaunches","sidebar":"defaultSidebar"},{"id":"analysis/HowModelsAreRetrained","path":"/docs/analysis/HowModelsAreRetrained","sidebar":"defaultSidebar"},{"id":"analysis/ManualAnalysis","path":"/docs/analysis/ManualAnalysis","sidebar":"defaultSidebar"},{"id":"analysis/MLSuggestions","path":"/docs/analysis/MLSuggestions","sidebar":"defaultSidebar"},{"id":"analysis/PatternAnalysis","path":"/docs/analysis/PatternAnalysis","sidebar":"defaultSidebar"},{"id":"analysis/SearchForTheSimilarToInvestigateItems","path":"/docs/analysis/SearchForTheSimilarToInvestigateItems","sidebar":"defaultSidebar"},{"id":"analysis/UniqueErrorAnalysis","path":"/docs/analysis/UniqueErrorAnalysis","sidebar":"defaultSidebar"},{"id":"case-studies/ImprovingTestAutomationStability","path":"/docs/case-studies/ImprovingTestAutomationStability","sidebar":"defaultSidebar"},{"id":"case-studies/IncreasingTestAutomationStabilityAndVisibility","path":"/docs/case-studies/IncreasingTestAutomationStabilityAndVisibility","sidebar":"defaultSidebar"},{"id":"case-studies/ReducingRegressionAnalysisEfforts","path":"/docs/case-studies/ReducingRegressionAnalysisEfforts","sidebar":"defaultSidebar"},{"id":"case-studies/ReducingRegressionTimeBy50","path":"/docs/case-studies/ReducingRegressionTimeBy50","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/ComponentHealthCheck","path":"/docs/dashboards-and-widgets/ComponentHealthCheck","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/CumulativeTrendChart","path":"/docs/dashboards-and-widgets/CumulativeTrendChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/DifferentLaunchesComparisonChart","path":"/docs/dashboards-and-widgets/DifferentLaunchesComparisonChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/FailedCasesTrendChart","path":"/docs/dashboards-and-widgets/FailedCasesTrendChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/FlakyTestCasesTableTop20","path":"/docs/dashboards-and-widgets/FlakyTestCasesTableTop20","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/InvestigatedPercentageOfLaunches","path":"/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunches","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/LaunchesDurationChart","path":"/docs/dashboards-and-widgets/LaunchesDurationChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/LaunchesTable","path":"/docs/dashboards-and-widgets/LaunchesTable","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/LaunchExecutionAndIssueStatistic","path":"/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatistic","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/LaunchStatisticsChart","path":"/docs/dashboards-and-widgets/LaunchStatisticsChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/ManageWidgets","path":"/docs/dashboards-and-widgets/ManageWidgets","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/MostFailedTestCasesTableTop50","path":"/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/MostPopularPatternTableTop20","path":"/docs/dashboards-and-widgets/MostPopularPatternTableTop20","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","path":"/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/NonPassedTestCasesTrendChart","path":"/docs/dashboards-and-widgets/NonPassedTestCasesTrendChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/OverallStatistics","path":"/docs/dashboards-and-widgets/OverallStatistics","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/PassingRatePerLaunch","path":"/docs/dashboards-and-widgets/PassingRatePerLaunch","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/PassingRateSummary","path":"/docs/dashboards-and-widgets/PassingRateSummary","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/PossibleDashboardsInReportPortal","path":"/docs/dashboards-and-widgets/PossibleDashboardsInReportPortal","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/ProjectActivityPanel","path":"/docs/dashboards-and-widgets/ProjectActivityPanel","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/TableComponentHealthCheck","path":"/docs/dashboards-and-widgets/TableComponentHealthCheck","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/TestCasesGrowthTrendChart","path":"/docs/dashboards-and-widgets/TestCasesGrowthTrendChart","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/UniqueBugsTable","path":"/docs/dashboards-and-widgets/UniqueBugsTable","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/WidgetCreation","path":"/docs/dashboards-and-widgets/WidgetCreation","sidebar":"defaultSidebar"},{"id":"dashboards-and-widgets/WorkWithDashboards","path":"/docs/dashboards-and-widgets/WorkWithDashboards","sidebar":"defaultSidebar"},{"id":"dev-guides/APIDifferencesBetweenV4AndV5","path":"/docs/dev-guides/APIDifferencesBetweenV4AndV5","sidebar":"defaultSidebar"},{"id":"dev-guides/AsynchronousReporting","path":"/docs/dev-guides/AsynchronousReporting","sidebar":"defaultSidebar"},{"id":"dev-guides/AttachmentsGuide","path":"/docs/dev-guides/AttachmentsGuide","sidebar":"defaultSidebar"},{"id":"dev-guides/BackEndJavaContributionGuide","path":"/docs/dev-guides/BackEndJavaContributionGuide","sidebar":"defaultSidebar"},{"id":"dev-guides/InteractionsBetweenAPIAndAnalyzer","path":"/docs/dev-guides/InteractionsBetweenAPIAndAnalyzer","sidebar":"defaultSidebar"},{"id":"dev-guides/PluginDevelopersGuide","path":"/docs/dev-guides/PluginDevelopersGuide","sidebar":"defaultSidebar"},{"id":"dev-guides/ReportingDevelopersGuide","path":"/docs/dev-guides/ReportingDevelopersGuide","sidebar":"defaultSidebar"},{"id":"dev-guides/ReportPortalAPI","path":"/docs/dev-guides/ReportPortalAPI","sidebar":"defaultSidebar"},{"id":"dev-guides/RerunDevelopersGuide","path":"/docs/dev-guides/RerunDevelopersGuide","sidebar":"defaultSidebar"},{"id":"dev-guides/RetriesReporting","path":"/docs/dev-guides/RetriesReporting","sidebar":"defaultSidebar"},{"id":"FAQ/index","path":"/docs/FAQ/","sidebar":"defaultSidebar"},{"id":"features/AIFailureReasonDetection","path":"/docs/features/AIFailureReasonDetection","sidebar":"defaultSidebar"},{"id":"features/CategorisationOfFailures","path":"/docs/features/CategorisationOfFailures","sidebar":"defaultSidebar"},{"id":"features/QualityGates","path":"/docs/features/QualityGates","sidebar":"defaultSidebar"},{"id":"features/RealTimeReporting","path":"/docs/features/RealTimeReporting","sidebar":"defaultSidebar"},{"id":"features/RESTAPI","path":"/docs/features/RESTAPI","sidebar":"defaultSidebar"},{"id":"features/RichArtifactsInTestReports","path":"/docs/features/RichArtifactsInTestReports","sidebar":"defaultSidebar"},{"id":"features/UnifiedTestReporting","path":"/docs/features/UnifiedTestReporting","sidebar":"defaultSidebar"},{"id":"features/VisualisationOfTestResults","path":"/docs/features/VisualisationOfTestResults","sidebar":"defaultSidebar"},{"id":"installation-steps/AdditionalConfigurationParameters","path":"/docs/installation-steps/AdditionalConfigurationParameters","sidebar":"defaultSidebar"},{"id":"installation-steps/BasicMonitoringConfiguration","path":"/docs/installation-steps/BasicMonitoringConfiguration","sidebar":"defaultSidebar"},{"id":"installation-steps/DeployOnUbuntuOS","path":"/docs/installation-steps/DeployOnUbuntuOS","sidebar":"defaultSidebar"},{"id":"installation-steps/DeployWithAWSECSFargate","path":"/docs/installation-steps/DeployWithAWSECSFargate","sidebar":"defaultSidebar"},{"id":"installation-steps/DeployWithDockerOnLinuxMac","path":"/docs/installation-steps/DeployWithDockerOnLinuxMac","sidebar":"defaultSidebar"},{"id":"installation-steps/DeployWithDockerOnWindows","path":"/docs/installation-steps/DeployWithDockerOnWindows","sidebar":"defaultSidebar"},{"id":"installation-steps/DeployWithKubernetes","path":"/docs/installation-steps/DeployWithKubernetes","sidebar":"defaultSidebar"},{"id":"installation-steps/DeployWithoutDocker","path":"/docs/installation-steps/DeployWithoutDocker","sidebar":"defaultSidebar"},{"id":"installation-steps/MaintainCommandsCheatSheet","path":"/docs/installation-steps/MaintainCommandsCheatSheet","sidebar":"defaultSidebar"},{"id":"installation-steps/OptimalPerformanceHardwareSetup","path":"/docs/installation-steps/OptimalPerformanceHardwareSetup","sidebar":"defaultSidebar"},{"id":"installation-steps/ReportPortal23.1FileStorageOptions","path":"/docs/installation-steps/ReportPortal23.1FileStorageOptions","sidebar":"defaultSidebar"},{"id":"installation-steps/ScalingUpReportPortalAPIService","path":"/docs/installation-steps/ScalingUpReportPortalAPIService","sidebar":"defaultSidebar"},{"id":"installation-steps/SetupTSLSSLInTraefik2.0.x","path":"/docs/installation-steps/SetupTSLSSLInTraefik2.0.x","sidebar":"defaultSidebar"},{"id":"intro","path":"/docs/","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","path":"/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","path":"/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/HowToCheckLDAPConnection","path":"/docs/issues-troubleshooting/HowToCheckLDAPConnection","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","path":"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","path":"/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","path":"/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","path":"/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/IssuesWithLDAPSHowToResolve","path":"/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolve","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/ResolveAnalyzerKnownIssues","path":"/docs/issues-troubleshooting/ResolveAnalyzerKnownIssues","sidebar":"defaultSidebar"},{"id":"issues-troubleshooting/TuningCITool","path":"/docs/issues-troubleshooting/TuningCITool","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/HowToRunYourTests","path":"/docs/log-data-in-reportportal/HowToRunYourTests","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/ImplementOwnIntegration","path":"/docs/log-data-in-reportportal/ImplementOwnIntegration","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/ImportDataToReportPortal","path":"/docs/log-data-in-reportportal/ImportDataToReportPortal","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/ReportingSDK","path":"/docs/log-data-in-reportportal/ReportingSDK","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/index","path":"/docs/log-data-in-reportportal/test-framework-integration/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Cucumber","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumber","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/index","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/JBehave","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/JBehave","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/JUnit4","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/JUnit5","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/SoapUI","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUI","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/Spock","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/Spock","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Java/TestNG","path":"/docs/log-data-in-reportportal/test-framework-integration/Java/TestNG","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/index","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Jest","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jest","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/Postman","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postman","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","path":"/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/index","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/NUnit","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/NUnit","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/SpecFlow","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlow","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/VSTest","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/VSTest","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Net/xUnit","path":"/docs/log-data-in-reportportal/test-framework-integration/Net/xUnit","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Other/index","path":"/docs/log-data-in-reportportal/test-framework-integration/Other/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/PHP/Behat","path":"/docs/log-data-in-reportportal/test-framework-integration/PHP/Behat","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/PHP/Codeception","path":"/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeception","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/PHP/index","path":"/docs/log-data-in-reportportal/test-framework-integration/PHP/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","path":"/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Python/behave","path":"/docs/log-data-in-reportportal/test-framework-integration/Python/behave","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Python/index","path":"/docs/log-data-in-reportportal/test-framework-integration/Python/","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Python/nosetests","path":"/docs/log-data-in-reportportal/test-framework-integration/Python/nosetests","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Python/pytest","path":"/docs/log-data-in-reportportal/test-framework-integration/Python/pytest","sidebar":"defaultSidebar"},{"id":"log-data-in-reportportal/test-framework-integration/Python/RobotFramework","path":"/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFramework","sidebar":"defaultSidebar"},{"id":"plugins/AtlassianJiraCloud","path":"/docs/plugins/AtlassianJiraCloud","sidebar":"defaultSidebar"},{"id":"plugins/AtlassianJiraServer","path":"/docs/plugins/AtlassianJiraServer","sidebar":"defaultSidebar"},{"id":"plugins/AzureDevOpsBTS","path":"/docs/plugins/AzureDevOpsBTS","sidebar":"defaultSidebar"},{"id":"plugins/EmailServer","path":"/docs/plugins/EmailServer","sidebar":"defaultSidebar"},{"id":"plugins/ManagePlugins","path":"/docs/plugins/ManagePlugins","sidebar":"defaultSidebar"},{"id":"plugins/Rally","path":"/docs/plugins/Rally","sidebar":"defaultSidebar"},{"id":"plugins/SauceLabs","path":"/docs/plugins/SauceLabs","sidebar":"defaultSidebar"},{"id":"quality-gates/AssessmentOfTestResultsUsingQualityGates","path":"/docs/quality-gates/AssessmentOfTestResultsUsingQualityGates","sidebar":"defaultSidebar"},{"id":"quality-gates/DeleteQualityGates","path":"/docs/quality-gates/DeleteQualityGates","sidebar":"defaultSidebar"},{"id":"quality-gates/FeatureOverview","path":"/docs/quality-gates/FeatureOverview","sidebar":"defaultSidebar"},{"id":"quality-gates/HowToInstallQualityGates","path":"/docs/quality-gates/HowToInstallQualityGates","sidebar":"defaultSidebar"},{"id":"quality-gates/IntegrationWithCICD/index","path":"/docs/quality-gates/IntegrationWithCICD/","sidebar":"defaultSidebar"},{"id":"quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","path":"/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI","sidebar":"defaultSidebar"},{"id":"quality-gates/IntegrationWithCICD/IntegrationWithJenkins","path":"/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkins","sidebar":"defaultSidebar"},{"id":"quality-gates/QualityGateEdit","path":"/docs/quality-gates/QualityGateEdit","sidebar":"defaultSidebar"},{"id":"quality-gates/QualityGatePurpose","path":"/docs/quality-gates/QualityGatePurpose","sidebar":"defaultSidebar"},{"id":"quality-gates/QualityRulesConfiguration","path":"/docs/quality-gates/QualityRulesConfiguration","sidebar":"defaultSidebar"},{"id":"quality-gates/UploadQualityGateToReportPortal","path":"/docs/quality-gates/UploadQualityGateToReportPortal","sidebar":"defaultSidebar"},{"id":"releases/Version23.2","path":"/docs/releases/Version23.2","sidebar":"defaultSidebar"},{"id":"releases/Version3.3.2","path":"/docs/releases/Version3.3.2","sidebar":"defaultSidebar"},{"id":"releases/Version3.3.2-1","path":"/docs/releases/Version3.3.2-1","sidebar":"defaultSidebar"},{"id":"releases/Version4.0.0","path":"/docs/releases/Version4.0.0","sidebar":"defaultSidebar"},{"id":"releases/Version4.1.0","path":"/docs/releases/Version4.1.0","sidebar":"defaultSidebar"},{"id":"releases/Version4.2.0","path":"/docs/releases/Version4.2.0","sidebar":"defaultSidebar"},{"id":"releases/Version4.3","path":"/docs/releases/Version4.3","sidebar":"defaultSidebar"},{"id":"releases/Version5.0.0","path":"/docs/releases/Version5.0.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.0RC","path":"/docs/releases/Version5.0RC","sidebar":"defaultSidebar"},{"id":"releases/Version5.1.0","path":"/docs/releases/Version5.1.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.2.0","path":"/docs/releases/Version5.2.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.2.1","path":"/docs/releases/Version5.2.1","sidebar":"defaultSidebar"},{"id":"releases/Version5.2.2","path":"/docs/releases/Version5.2.2","sidebar":"defaultSidebar"},{"id":"releases/Version5.2.3","path":"/docs/releases/Version5.2.3","sidebar":"defaultSidebar"},{"id":"releases/Version5.3.0","path":"/docs/releases/Version5.3.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.3.1.","path":"/docs/releases/Version5.3.1.","sidebar":"defaultSidebar"},{"id":"releases/Version5.3.2","path":"/docs/releases/Version5.3.2","sidebar":"defaultSidebar"},{"id":"releases/Version5.3.3","path":"/docs/releases/Version5.3.3","sidebar":"defaultSidebar"},{"id":"releases/Version5.3.5","path":"/docs/releases/Version5.3.5","sidebar":"defaultSidebar"},{"id":"releases/Version5.4.0","path":"/docs/releases/Version5.4.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.5.0","path":"/docs/releases/Version5.5.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.6.0","path":"/docs/releases/Version5.6.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.6.1","path":"/docs/releases/Version5.6.1","sidebar":"defaultSidebar"},{"id":"releases/Version5.6.2","path":"/docs/releases/Version5.6.2","sidebar":"defaultSidebar"},{"id":"releases/Version5.6.3","path":"/docs/releases/Version5.6.3","sidebar":"defaultSidebar"},{"id":"releases/Version5.7.0","path":"/docs/releases/Version5.7.0","sidebar":"defaultSidebar"},{"id":"releases/Version5.7.1","path":"/docs/releases/Version5.7.1","sidebar":"defaultSidebar"},{"id":"releases/Version5.7.2","path":"/docs/releases/Version5.7.2","sidebar":"defaultSidebar"},{"id":"releases/Version5.7.3","path":"/docs/releases/Version5.7.3","sidebar":"defaultSidebar"},{"id":"releases/Version5.7.4","path":"/docs/releases/Version5.7.4","sidebar":"defaultSidebar"},{"id":"releases/Versionv23.1","path":"/docs/releases/Versionv23.1","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/ActiveDirectory","path":"/docs/reportportal-configuration/authorization/ActiveDirectory","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/GitHub","path":"/docs/reportportal-configuration/authorization/GitHub","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/index","path":"/docs/reportportal-configuration/authorization/","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/LDAP","path":"/docs/reportportal-configuration/authorization/LDAP","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/SAMLProvider/AzureSAML","path":"/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAML","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/SAMLProvider/index","path":"/docs/reportportal-configuration/authorization/SAMLProvider/","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/authorization/SAMLProvider/OktaSAML","path":"/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAML","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/ComponentsOverview","path":"/docs/reportportal-configuration/ComponentsOverview","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/CreationOfProjectAndAddingUsers","path":"/docs/reportportal-configuration/CreationOfProjectAndAddingUsers","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/HowToGetAnAccessTokenInReportPortal","path":"/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortal","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/IntegrationViaPlugin","path":"/docs/reportportal-configuration/IntegrationViaPlugin","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/ProjectConfiguration","path":"/docs/reportportal-configuration/ProjectConfiguration","sidebar":"defaultSidebar"},{"id":"reportportal-configuration/ReportPortalJobsConfiguration","path":"/docs/reportportal-configuration/ReportPortalJobsConfiguration","sidebar":"defaultSidebar"},{"id":"reportportal-glossary/index","path":"/docs/reportportal-glossary/","sidebar":"defaultSidebar"},{"id":"reportportal-tutorial/index","path":"/docs/reportportal-tutorial/","sidebar":"defaultSidebar"},{"id":"saved-searches-filters/CreateFilters","path":"/docs/saved-searches-filters/CreateFilters","sidebar":"defaultSidebar"},{"id":"saved-searches-filters/FiltersPage","path":"/docs/saved-searches-filters/FiltersPage","sidebar":"defaultSidebar"},{"id":"saved-searches-filters/ManageFilters","path":"/docs/saved-searches-filters/ManageFilters","sidebar":"defaultSidebar"},{"id":"terms-and-conditions/GoogleAnalyticsUsageByReportPortal","path":"/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortal","sidebar":"defaultSidebar"},{"id":"terms-and-conditions/PremiumFeatures","path":"/docs/terms-and-conditions/PremiumFeatures","sidebar":"defaultSidebar"},{"id":"user-account/DataRetentionProcedure","path":"/docs/user-account/DataRetentionProcedure","sidebar":"defaultSidebar"},{"id":"user-account/DeleteAccount","path":"/docs/user-account/DeleteAccount","sidebar":"defaultSidebar"},{"id":"user-account/EditPersonalInformation","path":"/docs/user-account/EditPersonalInformation","sidebar":"defaultSidebar"},{"id":"user-account/RestoreAPassword","path":"/docs/user-account/RestoreAPassword","sidebar":"defaultSidebar"},{"id":"user-role-guides/index","path":"/docs/user-role-guides/","sidebar":"defaultSidebar"},{"id":"work-with-reports/FilteringLaunches","path":"/docs/work-with-reports/FilteringLaunches","sidebar":"defaultSidebar"},{"id":"work-with-reports/HistoryOfLaunches","path":"/docs/work-with-reports/HistoryOfLaunches","sidebar":"defaultSidebar"},{"id":"work-with-reports/InvestigationOfFailure","path":"/docs/work-with-reports/InvestigationOfFailure","sidebar":"defaultSidebar"},{"id":"work-with-reports/OperationsUnderLaunches","path":"/docs/work-with-reports/OperationsUnderLaunches","sidebar":"defaultSidebar"},{"id":"work-with-reports/TestCaseId","path":"/docs/work-with-reports/TestCaseId","sidebar":"defaultSidebar"},{"id":"work-with-reports/UniqueId","path":"/docs/work-with-reports/UniqueId","sidebar":"defaultSidebar"},{"id":"work-with-reports/ViewLaunches","path":"/docs/work-with-reports/ViewLaunches","sidebar":"defaultSidebar"},{"id":"/category/features","path":"/docs/category/features","sidebar":"defaultSidebar"},{"id":"/category/installation-steps","path":"/docs/category/installation-steps","sidebar":"defaultSidebar"},{"id":"/category/releases","path":"/docs/category/releases","sidebar":"defaultSidebar"},{"id":"/category/reportportal-configuration","path":"/docs/category/reportportal-configuration","sidebar":"defaultSidebar"},{"id":"/category/user-account","path":"/docs/category/user-account","sidebar":"defaultSidebar"},{"id":"/category/log-data-in-reportportal","path":"/docs/category/log-data-in-reportportal","sidebar":"defaultSidebar"},{"id":"/category/loggers","path":"/docs/category/loggers","sidebar":"defaultSidebar"},{"id":"/category/loggers-1","path":"/docs/category/loggers-1","sidebar":"defaultSidebar"},{"id":"/category/developers-guides","path":"/docs/category/developers-guides","sidebar":"defaultSidebar"},{"id":"/category/work-with-reports","path":"/docs/category/work-with-reports","sidebar":"defaultSidebar"},{"id":"/category/analysis","path":"/docs/category/analysis","sidebar":"defaultSidebar"},{"id":"/category/saved-searches-filters","path":"/docs/category/saved-searches-filters","sidebar":"defaultSidebar"},{"id":"/category/dashboards-and-widgets","path":"/docs/category/dashboards-and-widgets","sidebar":"defaultSidebar"},{"id":"/category/admin-panel","path":"/docs/category/admin-panel","sidebar":"defaultSidebar"},{"id":"/category/plugins","path":"/docs/category/plugins","sidebar":"defaultSidebar"},{"id":"/category/quality-gates","path":"/docs/category/quality-gates","sidebar":"defaultSidebar"},{"id":"/category/issues-troubleshooting","path":"/docs/category/issues-troubleshooting","sidebar":"defaultSidebar"},{"id":"/category/case-studies","path":"/docs/category/case-studies","sidebar":"defaultSidebar"},{"id":"/category/terms--conditions","path":"/docs/category/terms--conditions","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/docs/","label":"intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const l=JSON.parse('{"docusaurusVersion":"2.4.0","siteVersion":"2.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.0"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"2.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.0"},"plugin-cookie-pro":{"type":"project"}}}'),c={siteConfig:a.Z,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(c);function u(e){let{children:t}=e;return r.createElement(d.Provider,{value:c},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(67294),a=n(10412),o=n(35742),i=n(18780),s=n(47063);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function d(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(d,e);class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??u)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(70405);function o(e){return r.createElement(a.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(87462),a=n(67294),o=n(73727),i=n(18780),s=n(52263),l=n(13919),c=n(10412);const d=a.createContext({collectLink:()=>{}});var u=n(44996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,s.Z)(),{withBaseUrl:S}=(0,u.C)(),k=(0,a.useContext)(d),E=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>E.current));const x=p||f;const T=(0,l.Z)(x),C=x?.replace("pathname://","");let _=void 0!==C?(A=C,b&&(e=>e.startsWith("/"))(A)?S(A):A):void 0;var A;_&&T&&(_=(0,i.applyTrailingSlash)(_,{trailingSlash:y,baseUrl:w}));const P=(0,a.useRef)(!1),R=n?o.OL:o.rU,L=c.Z.canUseIntersectionObserver,I=(0,a.useRef)(),O=()=>{P.current||null==_||(window.docusaurus.preload(_),P.current=!0)};(0,a.useEffect)((()=>(!L&&T&&null!=_&&window.docusaurus.prefetch(_),()=>{L&&I.current&&I.current.disconnect()})),[I,_,L,T]);const D=_?.startsWith("#")??!1,N=!_||!T||D;return N||h||k.collectLink(_),N?a.createElement("a",(0,r.Z)({ref:E,href:_},x&&!T&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(R,(0,r.Z)({},v,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{E.current=e,L&&e&&T&&(I.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(I.current.unobserve(e),I.current.disconnect(),null!=_&&window.docusaurus.prefetch(_))}))})),I.current.observe(e))},to:_},n&&{isActive:g,activeClassName:m}))}const f=a.forwardRef(p)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});var r=n(67294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(57529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function l(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const s=i({message:t,id:n});return r.createElement(r.Fragment,null,a(s,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(67294),a=n(52263),o=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(58940);function o(){return(0,r.useContext)(a._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(67294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>f,WS:()=>m,_r:()=>u,Jo:()=>v,zh:()=>p,yW:()=>h,gB:()=>g});var r=n(16550),a=n(52263),o=n(29935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=l(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const d={},u=()=>i("docusaurus-plugin-content-docs")??d,p=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:l(t.pluginData,n)}}function g(e){return p(e).versions}function h(e){const t=p(e);return s(t)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(87410),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.Z,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},47063:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Lt});var r=n(67294),a=n(86010),o=n(44763),i=n(10833),s=n(87462),l=n(16550),c=n(95999),d=n(85936);const u="docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(u);t&&p(t)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??m,{containerRef:n,onClick:a}=f();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,s.Z)({},e,{href:`#${u}`,onClick:a}),t))}var h=n(35281),b=n(19727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var w=n(86668),S=n(59689);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const E={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",E.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const T={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,a.Z)(T.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const _={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,S.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:_.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:_.announcementBarPlaceholder}),r.createElement(C,{className:_.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:_.announcementBarClose}))}var P=n(93163),R=n(12466);var L=n(902),I=n(13102);const O=r.createContext(null);function D(e){let{children:t}=e;const n=function(){const e=(0,P.e)(),t=(0,I.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(O.Provider,{value:n},t)}function N(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new L.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,I.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:N(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(92949),U=n(72389);function j(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function z(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const V={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const s=(0,U.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(V.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",V.toggleButton,!s&&V.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(j,{className:(0,a.Z)(V.toggleIcon,V.lightToggleIcon)}),r.createElement(z,{className:(0,a.Z)(V.toggleIcon,V.darkToggleIcon)})))}const G=r.memo(H),q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function $(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(G,{className:t,buttonClassName:"dark"===n?q.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var W=n(21327);function J(){return r.createElement(W.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Z(){const e=(0,P.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function Q(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(J,null),r.createElement($,{className:"margin-right--md"}),r.createElement(Z,null))}var K=n(39960),Y=n(44996),X=n(13919),ee=n(98022),te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:c,prependBaseUrlToHref:d,...u}=e;const p=(0,Y.Z)(a),f=(0,Y.Z)(t),m=(0,Y.Z)(o,{forcePrependBaseUrl:!0}),g=i&&o&&!(0,X.Z)(o),h=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,g&&r.createElement(te.Z,c&&{width:12,height:12}))};return o?r.createElement(K.Z,(0,s.Z)({href:d?m:o},u,h)):r.createElement(K.Z,(0,s.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(f)},u,h))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,s.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,s.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,s.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(86043),se=n(48596),le=n(52263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const c=(0,r.useRef)(null),[d,u]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&u(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":d})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":d,role:"button",href:l.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),u(!d))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ge,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function ue(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const d=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),u=ce(t,d),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!u});return(0,r.useEffect)((()=>{u&&m(!u)}),[d,u,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),f()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(Ge,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const a=t?ue:de;return r.createElement(a,n)}var fe=n(94711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ge="iconLanguage_nlXk";var he=n(57052);function be(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ve=n(20830),ye=["translations"];function we(){return we=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var xe="Ctrl";var Te=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ee(e,ye),i=a.buttonText,s=void 0===i?"Search":i,l=a.buttonAriaLabel,c=void 0===l?"Search":l,d=Se((0,r.useState)(null),2),u=d[0],p=d[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(xe))}),[]),r.createElement("button",we({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ve.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==u&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},u===xe?r.createElement(be,null):u),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Ce=n(35742),_e=n(66177),Ae=n(239),Pe=n(37006),Re=n(73935),Le=n(28364);let Ie=null;function Oe(e){let{hit:t,children:n}=e;return r.createElement(K.Z,{to:t.url},n)}function De(e){let{state:t,onClose:n}=e;const a=(0,_e.M)();return r.createElement(K.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ne(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,le.Z)(),c=(0,Ae.l)(),d=(0,Pe.r)(),u=o.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(d,u):u,f={...o.searchParameters,facetFilters:p},m=(0,l.k6)(),g=(0,r.useRef)(null),h=(0,r.useRef)(null),[b,v]=(0,r.useState)(!1),[y,w]=(0,r.useState)(void 0),S=(0,r.useCallback)((()=>Ie?Promise.resolve():Promise.all([Promise.all([n.e(8382),n.e(4483)]).then(n.bind(n,84483)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,46945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,18894))]).then((e=>{let[{DocSearchModal:t}]=e;Ie=t}))),[]),k=(0,r.useCallback)((()=>{S().then((()=>{g.current=document.createElement("div"),document.body.insertBefore(g.current,document.body.firstChild),v(!0)}))}),[S,v]),E=(0,r.useCallback)((()=>{v(!1),g.current?.remove()}),[v]),x=(0,r.useCallback)((e=>{S().then((()=>{v(!0),w(e.key)}))}),[S,v,w]),T=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(a,t)?window.location.href=t:m.push(t)}}).current,C=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:c(e.url)}))))).current,_=(0,r.useMemo)((()=>e=>r.createElement(De,(0,s.Z)({},e,{onClose:E}))),[E]),A=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return(0,he.D)({isOpen:b,onOpen:k,onClose:E,onInput:x,searchButtonRef:h}),r.createElement(r.Fragment,null,r.createElement(Ce.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(Te,{onTouchStart:S,onFocus:S,onMouseOver:S,onClick:k,ref:h,translations:Le.Z.button}),b&&Ie&&g.current&&(0,Re.createPortal)(r.createElement(Ie,(0,s.Z)({onClose:E,initialScrollY:window.scrollY,initialQuery:y,navigator:T,transformItems:C,hitComponent:Oe,transformSearchClient:A},o.searchPagePath&&{resultsFooterComponent:_},o,{searchParameters:f,placeholder:Le.Z.placeholder,translations:Le.Z.modal})),g.current))}function Me(){const{siteConfig:e}=(0,le.Z)();return r.createElement(Ne,e.themeConfig.algolia)}const Fe={searchBox:"searchBox_ZlJk"};function Be(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Fe.searchBox)},t)}var Ue=n(80143),je=n(52802);var ze=n(60373);const Ve=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:d,localeConfigs:u}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,l.TH)(),g=[...n,...d.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}`;return{label:u[e].label,lang:u[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],h=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):u[i].label;return r.createElement(pe,(0,s.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Be,{className:n},r.createElement(Me,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return r.createElement(s,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ue.Iw)(a),l=(0,je.vY)(t,a);return null===l?null:r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ue.Iw)(a),l=(0,je.oz)(t,a).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,je.lO)(a)[0],l=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,s.Z)({},o,{label:l,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...d}=e;const{search:u,hash:p}=(0,l.TH)(),f=(0,Ue.Iw)(n),m=(0,Ue.gB)(n),{savePreferredVersionName:g}=(0,ze.J)(n),h=[...o,...m.map((e=>{const t=f.alternateDocVersions[e.name]??Ve(e);return{label:e.label,to:`${t.path}${u}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>g(e.name)}})),...i],b=(0,je.lO)(n)[0],v=t&&h.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:Ve(b).path;return h.length<=1?r.createElement(oe,(0,s.Z)({},d,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(pe,(0,s.Z)({},d,{mobile:t,label:v,to:y,items:h,isActive:a?()=>!1:void 0}))}};function Ge(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function qe(){const e=(0,P.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ge,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function $e(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function We(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement($e,{onClick:()=>t.hide()}),t.content)}function Je(){const e=(0,P.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(Q,null),primaryMenu:r.createElement(qe,null),secondaryMenu:r.createElement(We,null)}):null}const Ze={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Qe(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ke(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,P.e)(),{navbarRef:s,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,R.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:s,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ze.navbarHideable,!l&&Ze.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Qe,{onClick:i.toggle}),r.createElement(Je,null))}var Ye=n(18780);const Xe={errorBoundaryError:"errorBoundaryError_a6uf"};function et(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function tt(e){let{error:t}=e;const n=(0,Ye.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Xe.errorBoundaryError},n)}class nt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const rt="right";function at(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,s.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function ot(){const{toggle:e,shown:t}=(0,P.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(at,null))}const it={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(nt,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Ge,e)))))}function lt(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ct(){const e=(0,P.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(lt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(ot,null),r.createElement(J,null),r.createElement(st,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(st,{items:a}),r.createElement($,{className:it.colorModeToggle}),!o&&r.createElement(Be,null,r.createElement(Me,null)))})}function dt(){return r.createElement(Ke,null,r.createElement(ct,null))}function ut(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,c=(0,Y.Z)(n),d=(0,Y.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(K.Z,(0,s.Z)({className:"footer__link-item"},a?{href:i?d:a}:{to:c},l),o,a&&!(0,X.Z)(a)&&r.createElement(te.Z,null))}function pt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(ut,{item:t}))}function ft(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(pt,{key:t,item:e})))))}function mt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(ft,{key:t,column:e}))))}function gt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function ht(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(ut,{item:t})}function bt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(ht,{item:e}),t.length!==n+1&&r.createElement(gt,null))))))}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(mt,{columns:t}):r.createElement(bt,{links:t})}var yt=n(50941);const wt={footerLogoLink:"footerLogoLink_BH7S"};function St(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Y.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(yt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?r.createElement(K.Z,{href:t.href,className:wt.footerLogoLink,target:t.target},r.createElement(St,{logo:t})):r.createElement(St,{logo:t})}function Et(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function xt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function Tt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(xt,{style:o,links:n&&n.length>0&&r.createElement(vt,{links:n}),logo:a&&r.createElement(kt,{logo:a}),copyright:t&&r.createElement(Et,{copyright:t})})}const Ct=r.memo(Tt),_t=(0,L.Qc)([B.S,S.pl,R.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(I.n2,null,r.createElement(P.M,null,r.createElement(D,null,t)))}]);function At(e){let{children:t}=e;return r.createElement(_t,null,t)}function Pt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(et,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(tt,{error:t})))))}const Rt={mainWrapper:"mainWrapper_z2l0"};function Lt(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:c}=e;return(0,b.t)(),r.createElement(At,null,r.createElement(i.d,{title:l,description:c}),r.createElement(y,null),r.createElement(A,null),r.createElement(dt,null),r.createElement("div",{id:u,className:(0,a.Z)(h.k.wrapper.main,Rt.mainWrapper,s)},r.createElement(o.Z,{fallback:e=>r.createElement(Pt,e)},t)),!n&&r.createElement(Ct,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(87462),a=n(67294),o=n(39960),i=n(44996),s=n(52263),l=n(86668),c=n(50941);function d(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},s=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},s):s}function u(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:c}}=(0,l.L)(),{imageClassName:u,titleClassName:p,...f}=e,m=(0,i.Z)(c?.href||"/"),g=n?"":t,h=c?.alt??g;return a.createElement(o.Z,(0,r.Z)({to:m},f,c?.target&&{target:c.target}),c&&a.createElement(d,{logo:c,alt:h,imageClassName:u}),null!=n&&a.createElement("b",{className:p},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(35742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(87462),a=n(67294),o=n(86010),i=n(72389),s=n(92949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:c,className:d,alt:u,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:u,className:(0,o.Z)(l.themedImage,l[`themedImage--${e}`],d)},p)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>h});var r=n(87462),a=n(67294),o=n(10412);const i="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?l:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)return 0;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}function p(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=function(){const t=e.scrollHeight;return{transition:`height ${r?.duration??u(t)}ms ${r?.easing??i}`,height:`${t}px`}}();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(a(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{a()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.Z.canUseDOM)return e?l:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:l}=e;const c=(0,a.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),a.createElement(t,{ref:c,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:s},r)}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[s,l]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&l(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:s})):null}function h(e){let{lazy:t,...n}=e;const r=t?g:m;return a.createElement(r,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(67294),a=n(72389),o=n(50012),i=n(902),s=n(86668);const l=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===l.get(),u=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{u(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&u(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(67294),a=n(10412),o=n(902),i=n(50012),s=n(86668);const l=r.createContext(void 0),c="theme",d=(0,i.WA)(c),u={light:"light",dark:"dark"},p=e=>e===u.dark?u.dark:u.light,f=e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{d.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?u.dark:u.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===u.dark},setLightTheme(){i(u.light)},setDarkTheme(){i(u.dark)}})),[a,i])}();return r.createElement(l.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(l);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h,Oh:()=>y});var r=n(67294),a=n(80143),o=n(29935),i=n(86668),s=n(52802),l=n(902),c=n(50012);const d=e=>`docs-preferred-version-${e}`,u={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=u.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(u.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){u.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return r.createElement(f.Provider,{value:n},t)}function h(e){let{children:t}=e;return s.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function y(){const e=(0,a._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(67294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function s(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function l(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>i});var r=n(67294),a=n(902);const o=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(o.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>u,e:()=>p});var r=n(67294),a=n(13102),o=n(87524),i=n(91980),s=n(86668),l=n(902);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const d=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:d,shown:l})),[e,n,d,l])}function u(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,n2:()=>i});var r=n(67294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},66177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>l});var r=n(67294),a=n(52263),o=n(91980);const i="q";function s(){return(0,o.Nc)(i)}function l(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(67294),a=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const l=!1;function c(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},52802:(e,t,n)=>{"use strict";n.d(t,{MN:()=>T,Wl:()=>m,_F:()=>v,cE:()=>p,jA:()=>g,xz:()=>f,hI:()=>x,lO:()=>S,vY:()=>E,oz:()=>k,s1:()=>w});var r=n(67294),a=n(16550),o=n(18790),i=n(80143),s=n(60373),l=n(74477),c=n(1116);function d(e){return Array.from(new Set(e))}var u=n(48596);const p=!!i._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function m(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=m(t);if(e)return e}}}function g(){const{pathname:e}=(0,a.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),b=(e,t)=>e.some((e=>v(e,t)));function v(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||b(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>d([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=S(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${d(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,s=i.find((e=>(0,a.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?n.docsSidebars[l]:void 0;return{docElement:(0,o.H)(i),sidebarName:l,sidebarItems:c}}function T(e){return e.filter((e=>"category"!==e.type||!!m(e)))}},82128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(52263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},91980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>c,Rb:()=>s});var r=n(67294),a=n(16550),o=n(61688),i=n(902);function s(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=l(e)??"",n=function(){const e=(0,a.k6)();return(0,r.useCallback)(((t,n,r)=>{const a=new URLSearchParams(e.location.search);n?a.set(t,n):a.delete(t),(r?.push?e.push:e.replace)({search:a.toString()})}),[e])}();return[t,(0,r.useCallback)(((t,r)=>{n(e,t,r)}),[n,e])]}},10833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>d,VC:()=>f});var r=n(67294),a=n(86010),o=n(35742),i=n(30226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(44996),c=n(82128);function d(e){let{title:t,description:n,keywords:a,image:i,children:s}=e;const d=(0,c.p)(t),{withBaseUrl:u}=(0,l.C)(),p=i?u(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,d),t&&r.createElement("meta",{property:"og:title",content:d}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),s)}const u=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(u),s=(0,a.Z)(i,t);return r.createElement(u.Provider,{value:s},r.createElement(o.Z,null,r.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>l,i6:()=>s,zX:()=>o});var r=n(67294);const a=n(10412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},98022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),a=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>l,RF:()=>u});var r=n(67294),a=n(10412),o=n(72389),i=n(902);const s=r.createContext(void 0);function l(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(s.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const d=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function u(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(d()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>l,os:()=>s});var r=n(80143),a=n(52263),o=n(60373);const i="default";function s(e,t){return`docs-${e}-${t}`}function l(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),l=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=l[e],o=t[e].versions.find((e=>e.isLast));return s(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},50012:(e,t,n)=>{"use strict";n.d(t,{WA:()=>l});n(67294),n(61688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(52263),a=n(16550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),s=o===n?e:e.replace(`/${o}/`,"/"),l=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${s}`:`${s}${e}/`}(r)}${l}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},37006:(e,t,n)=>{"use strict";n.d(t,{r:()=>a});var r=n(43320);function a(){const{locale:e,tags:t}=(0,r._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(67294),a=n(98022),o=n(44996),i=n(6278);function s(){const{withBaseUrl:e}=(0,o.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.F)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},28364:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(95999);const a={button:{buttonText:(0,r.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,r.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,r.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,r.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,r.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,r.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,r.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,r.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,r.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,r.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,r.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,r.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,r.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,r.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,r.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,r.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,r.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,r.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,r.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,r.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,r.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,r.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,r.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,r.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,r.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,r.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,r.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},18780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},86010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>A,Ep:()=>p});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),u++):u&&(o(i,p),u--)}if(!c)for(;u--;u)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(38776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function d(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function u(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),u({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,g(),w.location);d.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,u({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,d=Object.getOwnPropertyNames,u=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=d(n);u&&(i=i.concat(u(n)));for(var s=l(t),g=l(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],d=0;(l=new Error(t.replace(/%s/g,(function(){return c[d++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},61212:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),d=r.speed,u=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,d,u)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+d+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),d)}),d)):setTimeout(t,d)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");d(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&d(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function d(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function u(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{var r=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,s="",d=t&&t.delimiter||"/";null!=(n=a.exec(e));){var u=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+u.length,p)s+=p[1];else{var m=e[i],g=n[2],h=n[3],b=n[4],v=n[5],y=n[6],w=n[7];s&&(r.push(s),s="");var S=null!=g&&null!=m&&m!==g,k="+"===y||"*"===y,E="?"===y||"*"===y,x=n[2]||d,T=b||v;r.push({name:h||o++,prefix:g||"",delimiter:x,optional:E,repeat:k,partial:S,asterisk:!!w,pattern:T?c(T):w?".*":"[^"+l(x)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=u.reach);E+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var T,C=1;if(v){if(!(T=o(S,E,e,b))||T.index>=e.length)break;var _=T.index,A=T.index+T[0].length,P=E;for(P+=k.value.length;_>=P;)P+=(k=k.next).value.length;if(E=P-=k.value.length,k.value instanceof a)continue;for(var R=k;R!==t.tail&&(Pu.reach&&(u.reach=D);var N=k.prev;if(I&&(N=l(t,N,I),E+=I.length),c(t,N,C),k=l(t,N,new a(p,h?r.tokenize(L,h):L,y,L)),O&&l(t,k,O),C>1){var M={cause:p+","+m,reach:D};i(e,t,n,k.prev,E,M),u&&M.reach>u.reach&&(u.reach=M.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=p(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l=0&&f(c,"variable-input")}}}}function d(e){return t[n+e]}function u(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,l(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function d(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,d={},u=l(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(i++,r)););return d[n]=a,n})).join(""),n,r),p=Object.keys(d);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,s=o.indexOf(a);if(-1!==s){++i;var l=o.substring(0,s),u=c(d[a]),f=o.substring(s+a.length),m=[];if(l&&m.push(l),m.push(u),f){var g=[f];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(u),new e.Token(r,u,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var u={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in u&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var l=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=i(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}a.content&&"string"!=typeof a.content&&s(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var d=o[a],u=n.tokenStack[d],p="string"==typeof c?c:c.content,f=t(r,d),m=p.indexOf(f);if(m>-1){++a;var g=p.substring(0,m),h=new e.Token(r,e.tokenize(u,n.grammar),"language-"+r,u),b=p.substring(m+f.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},29901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(29901),a=n(39642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},16500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=16500},39642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,o),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var d=n(i),u=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in u||(d[t]=!0,e(t))}))}));for(var p,f=r(l),m=d;a(m);){for(var g in p={},m){var h=l[g];t(h&&h.modify,(function(e){e in u&&(p[e]=!0)}))}for(var b in u)if(!(b in d))for(var v in f(b))if(v in d){p[b]=!0;break}for(var y in m=p)d[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var a,d=[];for(var u in t(e))u in n&&d.push(u);if(0===d.length)a=r(e);else{var p=i(d.map((function(e){var t=c(e);return delete l[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return s[e]=a}for(var d in n)c(d);var u=[];for(var p in l)u.push(s[p]);return i(u)}(f,d,t,n)}};return w}}();e.exports=t},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(27418),o=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n
+ + \ No newline at end of file diff --git a/case-studies/IncreasingTestAutomationStabilityAndVisibility/index.html b/case-studies/IncreasingTestAutomationStabilityAndVisibility/index.html index d2e5f0544..321ae9f61 100644 --- a/case-studies/IncreasingTestAutomationStabilityAndVisibility/index.html +++ b/case-studies/IncreasingTestAutomationStabilityAndVisibility/index.html @@ -12,15 +12,15 @@ - - + +
-

Increasing test automation stability and visibility

Challenges

  • 2,000 unique tests had low stability (25% passing rate)
  • Complex and inconvenient test results reporting
  • QA team didn’t have capacity for test failure analysis
  • Automation results were ignored by decision makers: no analysis of the causes of failed tests, no trust in the automation testing process
  • Lack of visibility into failed tests and failure causes
  • Absence of clear reporting of QA engineers’ workload and performance

Highlights

Integration with ReportPortal.io allowed the client to:

  • Collect history for previous test runs
  • Identify passing, failing, and unstable tests
  • Select stable tests in a separate run
  • Assign unstable test for refactoring and add them to a separate run for implementation
  • Configure ReportPortal.io charts to track a refactoring progress
  • Accelerate test failure analysis through access to related logs, screenshots, and attachments in one place

Results

  • Automation stability improved from 25% to 95%
  • Analysis efforts of QA engineers decreased by 10 times
  • Client stakeholders use ReportPortal.io data to make release decisions
  • ReportPortal.io became the main tool for tracking test automation progress and health
- - +

Increasing test automation stability and visibility

Challenges

  • 2,000 unique tests had low stability (25% passing rate)
  • Complex and inconvenient test results reporting
  • QA team didn’t have capacity for test failure analysis
  • Automation results were ignored by decision makers: no analysis of the causes of failed tests, no trust in the automation testing process
  • Lack of visibility into failed tests and failure causes
  • Absence of clear reporting of QA engineers’ workload and performance

Highlights

Integration with ReportPortal.io allowed the client to:

  • Collect history for previous test runs
  • Identify passing, failing, and unstable tests
  • Select stable tests in a separate run
  • Assign unstable test for refactoring and add them to a separate run for implementation
  • Configure ReportPortal.io charts to track a refactoring progress
  • Accelerate test failure analysis through access to related logs, screenshots, and attachments in one place

Results

  • Automation stability improved from 25% to 95%
  • Analysis efforts of QA engineers decreased by 10 times
  • Client stakeholders use ReportPortal.io data to make release decisions
  • ReportPortal.io became the main tool for tracking test automation progress and health
+ + \ No newline at end of file diff --git a/case-studies/ReducingRegressionAnalysisEfforts/index.html b/case-studies/ReducingRegressionAnalysisEfforts/index.html index b1d911d37..ee6f6c9a1 100644 --- a/case-studies/ReducingRegressionAnalysisEfforts/index.html +++ b/case-studies/ReducingRegressionAnalysisEfforts/index.html @@ -12,15 +12,15 @@ - - + +
-

Reducing regression analysis efforts

Challenges

  • Test analysis could only start after full execution was completed (4 hours wasted daily)
  • All test failures had to be analyzed manually
  • No visibility into causes for tests failures
  • Absence of history and trends of test failures
  • No tools to manage team workload
  • Test execution reports were done manually (1 hour of daily efforts)

Highlights

  • Real-time analysis during test runs: results available after the first job execution, saving team capacity and providing an early reaction
  • Automatic re-run of failed tests provided additional value and saved up to 5.5 of team’s hours per day
  • About 20% of defects previously analyzed manually are being updated automatically through ML capabilities
  • Clear visibility into the number of new /existing production defects, auto test related issues, and environment related issues
  • Full understanding of application quality, correct planning of maintenance time, and transparent communication of environment instability based on real-time statistics
  • History of tests execution helps to analyze causes of test failures more efficiently
  • Improved task management due to possibility to plan work allocation and track tests assigned to each team member
  • Real-time dashboards were tailored to client’s KPIs, giving full transparency of test execution results
- - +

Reducing regression analysis efforts

Challenges

  • Test analysis could only start after full execution was completed (4 hours wasted daily)
  • All test failures had to be analyzed manually
  • No visibility into causes for tests failures
  • Absence of history and trends of test failures
  • No tools to manage team workload
  • Test execution reports were done manually (1 hour of daily efforts)

Highlights

  • Real-time analysis during test runs: results available after the first job execution, saving team capacity and providing an early reaction
  • Automatic re-run of failed tests provided additional value and saved up to 5.5 of team’s hours per day
  • About 20% of defects previously analyzed manually are being updated automatically through ML capabilities
  • Clear visibility into the number of new /existing production defects, auto test related issues, and environment related issues
  • Full understanding of application quality, correct planning of maintenance time, and transparent communication of environment instability based on real-time statistics
  • History of tests execution helps to analyze causes of test failures more efficiently
  • Improved task management due to possibility to plan work allocation and track tests assigned to each team member
  • Real-time dashboards were tailored to client’s KPIs, giving full transparency of test execution results
+ + \ No newline at end of file diff --git a/case-studies/ReducingRegressionTimeBy50/index.html b/case-studies/ReducingRegressionTimeBy50/index.html index a584783cc..d7418c470 100644 --- a/case-studies/ReducingRegressionTimeBy50/index.html +++ b/case-studies/ReducingRegressionTimeBy50/index.html @@ -12,15 +12,15 @@ - - + +
-

Reducing regression time by 50%

EPAM helps a Canadian retail company to reverse-engineer their legacy IBM-based store management system to a modern tech stack. As part of this project, ReportPortal was deployed as a centralized test reporting tool.

Challenges

  • Unavailble environments (15VMs) blocked by aggregation scripts
  • High risk of aggregation fail: 1 in 10 aggregations fails. In case of a fail, the whole regression should be re-run.
  • Constant regression fails move weekly releases for 1 day
  • Lack of information for investigation: no screenshots/no history/no structure/no all info
  • Duplicated analysis efforts: missing history of test cases and known issues

Highlights

  • Simplified test run reporting by integrating the test framework with ReportPortal.io
  • Distributed test execution data for root cause analysis: logs/screenshots/ attachments
  • Provided a possibility for AI-based defects triage and manual triage
  • Provided clear reporting for non-technical stakeholders
  • Real-time reporting
  • Save on early reaction: team result analysis right after execution started in real time
  • Collaborative results analysis
  • Test Case History helped to identify flaky test cases
  • Extended ML Analyzer
- - +

Reducing regression time by 50%

EPAM helps a Canadian retail company to reverse-engineer their legacy IBM-based store management system to a modern tech stack. As part of this project, ReportPortal was deployed as a centralized test reporting tool.

Challenges

  • Unavailble environments (15VMs) blocked by aggregation scripts
  • High risk of aggregation fail: 1 in 10 aggregations fails. In case of a fail, the whole regression should be re-run.
  • Constant regression fails move weekly releases for 1 day
  • Lack of information for investigation: no screenshots/no history/no structure/no all info
  • Duplicated analysis efforts: missing history of test cases and known issues

Highlights

  • Simplified test run reporting by integrating the test framework with ReportPortal.io
  • Distributed test execution data for root cause analysis: logs/screenshots/ attachments
  • Provided a possibility for AI-based defects triage and manual triage
  • Provided clear reporting for non-technical stakeholders
  • Real-time reporting
  • Save on early reaction: team result analysis right after execution started in real time
  • Collaborative results analysis
  • Test Case History helped to identify flaky test cases
  • Extended ML Analyzer
+ + \ No newline at end of file diff --git a/category/admin-panel/index.html b/category/admin-panel/index.html index ee90ab4e1..ddf83226c 100644 --- a/category/admin-panel/index.html +++ b/category/admin-panel/index.html @@ -12,15 +12,15 @@ - - + + - - +
+ + \ No newline at end of file diff --git a/category/analysis/index.html b/category/analysis/index.html index 9e9244a66..1f2640d8f 100644 --- a/category/analysis/index.html +++ b/category/analysis/index.html @@ -12,15 +12,15 @@ - - + +
-
- - +
+ + \ No newline at end of file diff --git a/category/case-studies/index.html b/category/case-studies/index.html index aebd24677..3815c0820 100644 --- a/category/case-studies/index.html +++ b/category/case-studies/index.html @@ -12,15 +12,15 @@ - - + + - - +
+ + \ No newline at end of file diff --git a/category/dashboards-and-widgets/index.html b/category/dashboards-and-widgets/index.html index 24145d7a8..98a32f9b9 100644 --- a/category/dashboards-and-widgets/index.html +++ b/category/dashboards-and-widgets/index.html @@ -12,15 +12,15 @@ - - + +
-

Dashboards and widgets

- - +

Dashboards and widgets

+ + \ No newline at end of file diff --git a/category/developers-guides/index.html b/category/developers-guides/index.html index 9ef3b6937..463638de5 100644 --- a/category/developers-guides/index.html +++ b/category/developers-guides/index.html @@ -12,15 +12,15 @@ - - + +
-
- - +
+ + \ No newline at end of file diff --git a/category/features/index.html b/category/features/index.html index bb2cb4253..ca6ca4851 100644 --- a/category/features/index.html +++ b/category/features/index.html @@ -12,15 +12,15 @@ - - + +
-

Features

- - +

Features

+ + \ No newline at end of file diff --git a/category/installation-steps/index.html b/category/installation-steps/index.html index fdaa242b4..8145f1e1f 100644 --- a/category/installation-steps/index.html +++ b/category/installation-steps/index.html @@ -12,15 +12,15 @@ - - + +
-

Installation Steps

- - +

Installation Steps

+ + \ No newline at end of file diff --git a/category/issues-troubleshooting/index.html b/category/issues-troubleshooting/index.html index 31874b30c..70507aa5e 100644 --- a/category/issues-troubleshooting/index.html +++ b/category/issues-troubleshooting/index.html @@ -12,15 +12,15 @@ - - + +
-
- - +
+ + \ No newline at end of file diff --git a/category/log-data-in-reportportal/index.html b/category/log-data-in-reportportal/index.html deleted file mode 100644 index 024ff3eec..000000000 --- a/category/log-data-in-reportportal/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Log data in ReportPortal | ReportPortal Documentation - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/category/loggers-1/index.html b/category/loggers-1/index.html index b43d5078e..bd2382ab0 100644 --- a/category/loggers-1/index.html +++ b/category/loggers-1/index.html @@ -12,15 +12,15 @@ - - + +
-
- - +
+ + \ No newline at end of file diff --git a/category/loggers/index.html b/category/loggers/index.html index 0fef57112..3a2c63beb 100644 --- a/category/loggers/index.html +++ b/category/loggers/index.html @@ -12,15 +12,15 @@ - - + +
-

Loggers

- - +

Loggers

+ + \ No newline at end of file diff --git a/category/plugins/index.html b/category/plugins/index.html index 416106929..757e32b3b 100644 --- a/category/plugins/index.html +++ b/category/plugins/index.html @@ -12,15 +12,15 @@ - - + +
-
- - +
Skip to main content
+ + \ No newline at end of file diff --git a/category/quality-gates/index.html b/category/quality-gates/index.html index 0694592af..f809d524f 100644 --- a/category/quality-gates/index.html +++ b/category/quality-gates/index.html @@ -12,15 +12,15 @@ - - + +
-
Skip to main content
- - +
Skip to main content
+ + \ No newline at end of file diff --git a/category/releases/index.html b/category/releases/index.html index 99db62619..f195a0e3c 100644 --- a/category/releases/index.html +++ b/category/releases/index.html @@ -12,15 +12,15 @@ - - + +
-
Skip to main content

Releases

- - +
Skip to main content

Releases

+ + \ No newline at end of file diff --git a/category/reportportal-configuration/index.html b/category/reportportal-configuration/index.html index 89e8f8352..25e7db559 100644 --- a/category/reportportal-configuration/index.html +++ b/category/reportportal-configuration/index.html @@ -12,15 +12,15 @@ - - + +
-
Skip to main content
- - +
Skip to main content
+ + \ No newline at end of file diff --git a/category/saved-searches-filters/index.html b/category/saved-searches-filters/index.html index 7faba2ef0..4b6407d99 100644 --- a/category/saved-searches-filters/index.html +++ b/category/saved-searches-filters/index.html @@ -12,15 +12,15 @@ - - + + - - +
Skip to main content
+ + \ No newline at end of file diff --git a/category/terms--conditions/index.html b/category/terms--conditions/index.html index 3f012e1ab..f1762daeb 100644 --- a/category/terms--conditions/index.html +++ b/category/terms--conditions/index.html @@ -12,15 +12,15 @@ - - + +
-
Skip to main content
- - +
Skip to main content
+ + \ No newline at end of file diff --git a/category/user-account/index.html b/category/user-account/index.html index bab73a027..eb8c2cd5c 100644 --- a/category/user-account/index.html +++ b/category/user-account/index.html @@ -12,15 +12,15 @@ - - + +
-
Skip to main content
- - +
Skip to main content
+ + \ No newline at end of file diff --git a/category/work-with-reports/index.html b/category/work-with-reports/index.html index ddf4608c4..0a59de3bb 100644 --- a/category/work-with-reports/index.html +++ b/category/work-with-reports/index.html @@ -12,15 +12,15 @@ - - + + - - +
Skip to main content
+ + \ No newline at end of file diff --git a/dashboards-and-widgets/ComponentHealthCheck/index.html b/dashboards-and-widgets/ComponentHealthCheck/index.html index f235876be..bb762759f 100644 --- a/dashboards-and-widgets/ComponentHealthCheck/index.html +++ b/dashboards-and-widgets/ComponentHealthCheck/index.html @@ -12,14 +12,14 @@ - - + +
-
Skip to main content

Component health check

Shows the passing rate of the application components which are indicated by the specified attributes.

note

For using this widget you need to report (or add manually) attributes to test items.

Widget's parameters:

  • Filter
  • Parameters: All launches/ Latest launches
  • The min allowable passing rate for the component: Possible value from 50 - 100%. Default value 100%.
  • Attribute key for the first level (mandatory)
  • Attribute key for the 2-10 levels (optional)

Widget view

Use case:

Situation: As a Project Manager or Test Lead, I want to see the most unstable place in my product ( application).

Solution: All test cases in my project in ReportPortal have attributes. For example function: (order, team, configure, administrative), type: (backend, API, Unit, UI), ...., market state: (open, close), role: (ProjectManager, Member, Admin) and other. The attributes can be different and dependent on your project needs.

A user can create a Component Health Check Widget and set attribute key = function for the 1st level, for the 2nd -type and the 3rd - market state

So that a user will see on the first level several groups: order, team, configure, administrative. All groups will contain only +

Component health check

Shows the passing rate of the application components which are indicated by the specified attributes.

note

For using this widget you need to report (or add manually) attributes to test items.

Widget's parameters:

  • Filter
  • Parameters: All launches/ Latest launches
  • The min allowable passing rate for the component: Possible value from 50 - 100%. Default value 100%.
  • Attribute key for the first level (mandatory)
  • Attribute key for the 2-10 levels (optional)

Widget view

Use case:

Situation: As a Project Manager or Test Lead, I want to see the most unstable place in my product ( application).

Solution: All test cases in my project in ReportPortal have attributes. For example function: (order, team, configure, administrative), type: (backend, API, Unit, UI), ...., market state: (open, close), role: (ProjectManager, Member, Admin) and other. The attributes can be different and dependent on your project needs.

A user can create a Component Health Check Widget and set attribute key = function for the 1st level, for the 2nd -type and the 3rd - market state

So that a user will see on the first level several groups: order, team, configure, administrative. All groups will contain only test cases with an attribute that contains attribute key function. Each group has been grouped by attribute value: order, team, configure, administrative. If a user clicks on the group function: order, the system will show the second level of the widget. All test items on the second @@ -34,7 +34,7 @@ link to the widget list view: Filter list view + test method: Test + status: Passed, Failed, Skipped, Interrupted, InProgress; the number of items is equal to the number of Test cases in the widget a color line which depends on passing rate (see section Widget legend) Widget legend

Widget legend has two lines: Passed and Failed

Failed

The failed line has four colors:

  • light red
  • regular red
  • strong red
  • dark red

And have values - less than specified on widget wizard -1

Passed

The passing line has only two colors:

  • slightly green
  • green = Passed

And have values - from specified on widget wizard to 100%. Depends on this color scheme each group on the widget has its own color.

Let's say we set 'The min allowable passing rate for the component' to be 90%.

  • passed green: groups which have passing rate 100%.
  • slightly green: groups which passing rate from 99 - specified on widget wizard.
  • light red: from 3* (90% - 1)/4 to (90% - 1)
  • strong red: from (90% - 1)/2 to 3* (90% - 1)/4
  • regular red: from (90% - 1)/4 to 2*(90% - 1)/4
  • dark red: 0 - ((90% - 1)/4 -1)
note

The widget doesn't contain 'IN PROGRESS" launches.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/CumulativeTrendChart/index.html b/dashboards-and-widgets/CumulativeTrendChart/index.html index 4bc92b620..9705e6fb5 100644 --- a/dashboards-and-widgets/CumulativeTrendChart/index.html +++ b/dashboards-and-widgets/CumulativeTrendChart/index.html @@ -12,14 +12,14 @@ - - + +
-

Cumulative trend chart

Shows the growth trend of summary statistics of launches with the same attribute key. +

Cumulative trend chart

Shows the growth trend of summary statistics of launches with the same attribute key. You can see a growth of statistics from the build to the build, or from version to version. A widget does not require an edit or new filter creation. If a new version (build, release or other) is added to ReportPortal, new information will be added to the graph.

Widget's parameters:

  • Filter
  • Parameters: only Latest launches
  • Number of shown attributes on the widget: 1 - 15
  • Attribute key for the first level (mandatory)
  • Attribute key for the second level (optional)

Widget view A widget has two levels.

For the first level the system uses the last 600 launches from the chosen filter. @@ -38,7 +38,7 @@ Separate bars - is shown a separate bar for each status, and each defect type group.

Tests / Per cent Test mode - OY axis is calculated in test cases. Percent mode - OY axis is calculated in percent. OY = 100%.

A user can combine different options. Options are saved per user.

note

The widget doesn't contain 'IN PROGRESS" launches. The widget statistics calculated only in items with method type TEST.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/DifferentLaunchesComparisonChart/index.html b/dashboards-and-widgets/DifferentLaunchesComparisonChart/index.html index b7c6f26af..dff4ab422 100644 --- a/dashboards-and-widgets/DifferentLaunchesComparisonChart/index.html +++ b/dashboards-and-widgets/DifferentLaunchesComparisonChart/index.html @@ -12,15 +12,15 @@ - - + +
-

Different launches comparison chart

The widget allows you to compare statistics for the 2 last launches side by side.

Widget's parameters:

  • Filter.

Widget view

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the percentage of test-cases by statuses.

The widget contains agenda with statuses, the user can click on a status to remove/add it to the chart.

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start times and percentage of test cases of a particular type.

The widget has clickable sections when you click on specific sections in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain 'IN PROGRESS" launches.

- - +

Different launches comparison chart

The widget allows you to compare statistics for the 2 last launches side by side.

Widget's parameters:

  • Filter.

Widget view

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the percentage of test-cases by statuses.

The widget contains agenda with statuses, the user can click on a status to remove/add it to the chart.

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start times and percentage of test cases of a particular type.

The widget has clickable sections when you click on specific sections in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain 'IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/FailedCasesTrendChart/index.html b/dashboards-and-widgets/FailedCasesTrendChart/index.html index de84de2b3..25c3247ae 100644 --- a/dashboards-and-widgets/FailedCasesTrendChart/index.html +++ b/dashboards-and-widgets/FailedCasesTrendChart/index.html @@ -12,15 +12,15 @@ - - + +
-

Failed cases trend chart

The widget shows the trend of growth in the number of failed test cases (Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates) from run to run.

Widget's parameters:

  • Filter.
  • Items: 1-150. The default meaning is 50.

Widget view

The widget contains the agenda: "Failed".

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows several Failed issues (sum of Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates).

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start time and several failed test cases.

note

The widget doesn't contain "IN PROGRESS" launches.

- - +

Failed cases trend chart

The widget shows the trend of growth in the number of failed test cases (Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates) from run to run.

Widget's parameters:

  • Filter.
  • Items: 1-150. The default meaning is 50.

Widget view

The widget contains the agenda: "Failed".

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows several Failed issues (sum of Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates).

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start time and several failed test cases.

note

The widget doesn't contain "IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/FlakyTestCasesTableTop20/index.html b/dashboards-and-widgets/FlakyTestCasesTableTop20/index.html index 9a061f75b..90d1ff002 100644 --- a/dashboards-and-widgets/FlakyTestCasesTableTop20/index.html +++ b/dashboards-and-widgets/FlakyTestCasesTableTop20/index.html @@ -12,15 +12,15 @@ - - + +
-

Flaky test cases table (TOP-20)

Shows the TOP-20 the flakiest test cases within the specified previous launches. The widget defines test cases with the highest percentage of switching their status in the execution. So that you can click on the test cases and be redirected to the last test item in execution to check the reasons.

Widget's parameters:

  • Launches count: 2-150. The default meaning is 30.

  • Launch name. Is required

  • Include /Exclude Before and After methods

Widget view

The widget has a table view with the following data displayed:

  • Test Item name - link to the Step level of the last launch

  • Switches - count of found results with often switches;

  • % of Switches - the percent of the fact switches and the possible;

  • Last switch - date and time of the last run, when the test item switches the status, displayed in 'time ago' format (i.e. "10 minutes ago").

On mouse hover, the system will display accurate start times.

- - +

Flaky test cases table (TOP-20)

Shows the TOP-20 the flakiest test cases within the specified previous launches. The widget defines test cases with the highest percentage of switching their status in the execution. So that you can click on the test cases and be redirected to the last test item in execution to check the reasons.

Widget's parameters:

  • Launches count: 2-150. The default meaning is 30.

  • Launch name. Is required

  • Include /Exclude Before and After methods

Widget view

The widget has a table view with the following data displayed:

  • Test Item name - link to the Step level of the last launch

  • Switches - count of found results with often switches;

  • % of Switches - the percent of the fact switches and the possible;

  • Last switch - date and time of the last run, when the test item switches the status, displayed in 'time ago' format (i.e. "10 minutes ago").

On mouse hover, the system will display accurate start times.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/InvestigatedPercentageOfLaunches/index.html b/dashboards-and-widgets/InvestigatedPercentageOfLaunches/index.html index 1dad1fc3a..73d982f76 100644 --- a/dashboards-and-widgets/InvestigatedPercentageOfLaunches/index.html +++ b/dashboards-and-widgets/InvestigatedPercentageOfLaunches/index.html @@ -12,15 +12,15 @@ - - + +
-

Investigated percentage of launches

The widget can be used in two modes - Launch mode and Timeline mode:

  • The widget in the Launch mode shows the percentage of "Investigated" and "To Investigate" items by launch to sum (Product Bugs + Auto Bugs + System Issues + To Investigates).
  • The widget in the Timeline mode shows the percentage of "Investigated" and "To Investigate" items to sum (Product Bugs + Auto Bugs + System Issues + To Investigates) in all runs per day, distributed by dates.

Widget's parameters:

  • Filter: At least one filter is required.
  • Items: 1-150. The default meaning is 50.
  • Mode: Launch or Timeline. The default meaning is Launch mode.

Widget view

The widget contains an agenda with "To Investigate" and "Investigated" labels.

The widget view in Launch mode:

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the percent of "Investigated" and "To Investigate" items to sum. (Product Bugs + Auto Bugs + System Issues + To Investigates)

The tooltip on mouse hover over the chart area shows launch details: launch name, number, launch start time and "percentage of "Investigated" or "To Investigate" items.

The widget view in Timeline mode:

  • The X-axis shows dates and weekdays.
  • Y-axis shows a percent of "Investigated" and "To Investigate" items to sum (Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates) distributed by dates.

The tooltip on mouse hover over the chart area shows launch details: date and percentage of "Investigated" or "To Investigate" items.

The widget has clickable sections when you click on a specific section in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain "IN PROGRESS" launches.

- - +

Investigated percentage of launches

The widget can be used in two modes - Launch mode and Timeline mode:

  • The widget in the Launch mode shows the percentage of "Investigated" and "To Investigate" items by launch to sum (Product Bugs + Auto Bugs + System Issues + To Investigates).
  • The widget in the Timeline mode shows the percentage of "Investigated" and "To Investigate" items to sum (Product Bugs + Auto Bugs + System Issues + To Investigates) in all runs per day, distributed by dates.

Widget's parameters:

  • Filter: At least one filter is required.
  • Items: 1-150. The default meaning is 50.
  • Mode: Launch or Timeline. The default meaning is Launch mode.

Widget view

The widget contains an agenda with "To Investigate" and "Investigated" labels.

The widget view in Launch mode:

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the percent of "Investigated" and "To Investigate" items to sum. (Product Bugs + Auto Bugs + System Issues + To Investigates)

The tooltip on mouse hover over the chart area shows launch details: launch name, number, launch start time and "percentage of "Investigated" or "To Investigate" items.

The widget view in Timeline mode:

  • The X-axis shows dates and weekdays.
  • Y-axis shows a percent of "Investigated" and "To Investigate" items to sum (Product Bugs + Auto Bugs + System Issues + No Defects + To Investigates) distributed by dates.

The tooltip on mouse hover over the chart area shows launch details: date and percentage of "Investigated" or "To Investigate" items.

The widget has clickable sections when you click on a specific section in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain "IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/LaunchExecutionAndIssueStatistic/index.html b/dashboards-and-widgets/LaunchExecutionAndIssueStatistic/index.html index c57f1a029..57853c35b 100644 --- a/dashboards-and-widgets/LaunchExecutionAndIssueStatistic/index.html +++ b/dashboards-and-widgets/LaunchExecutionAndIssueStatistic/index.html @@ -12,15 +12,15 @@ - - + +
-

Launch execution and issue statistic

The Launch Execution and Issue Statistic chart shows the status and issues statistics for the last launch of a specified range.

Widget's parameters:

  • Filter: required

Widget view

The widget shows statistics of the last finished launch for the chosen filter. The statistics are divided into the following sections:

  • Skipped, Passed, Failed
  • Product Bug, System Issue, Automation Bug, No Defect (default and custom) and To Investigate.

The widget contains agenda with statuses, the user can click on a status to remove/add it to the chart.

Tooltip on mouse hover over chart area shows launch details: launch name, number, and duration.

The statistics for every type is shown in percentage. On hover, the exact number is shown for each type.

The widget has clickable sections when you click on a specified section in the widget, the system forwards you to the launch view for the appropriate selection.

- - +

Launch execution and issue statistic

The Launch Execution and Issue Statistic chart shows the status and issues statistics for the last launch of a specified range.

Widget's parameters:

  • Filter: required

Widget view

The widget shows statistics of the last finished launch for the chosen filter. The statistics are divided into the following sections:

  • Skipped, Passed, Failed
  • Product Bug, System Issue, Automation Bug, No Defect (default and custom) and To Investigate.

The widget contains agenda with statuses, the user can click on a status to remove/add it to the chart.

Tooltip on mouse hover over chart area shows launch details: launch name, number, and duration.

The statistics for every type is shown in percentage. On hover, the exact number is shown for each type.

The widget has clickable sections when you click on a specified section in the widget, the system forwards you to the launch view for the appropriate selection.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/LaunchStatisticsChart/index.html b/dashboards-and-widgets/LaunchStatisticsChart/index.html index 27c13b18c..b42c8ea03 100644 --- a/dashboards-and-widgets/LaunchStatisticsChart/index.html +++ b/dashboards-and-widgets/LaunchStatisticsChart/index.html @@ -12,14 +12,14 @@ - - + +
-

Launch statistics chart

The widget can be used in two modes - Launch mode and Timeline mode:

  • The widget in Launch mode shows the growth trend in the number of test cases with each selected status from run to run,
  • The widget in Timeline mode shows the sum of test cases with each selected status distributed by dates.

Also, you can choose a different view of this widget: Area view or Bar view. +

Launch statistics chart

The widget can be used in two modes - Launch mode and Timeline mode:

  • The widget in Launch mode shows the growth trend in the number of test cases with each selected status from run to run,
  • The widget in Timeline mode shows the sum of test cases with each selected status distributed by dates.

Also, you can choose a different view of this widget: Area view or Bar view. For a deeper investigation, you can use the Zoom widget area functionality.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 50.
  • Widget Criteria: All criteria are selected by default.
  • Mode: Launch or Timeline.
  • View: Area/ Bar
  • Widget Criteria: All criteria are selected by default.
tip

If you choose “Total Defect type”, the system will show the grouped statistics of a chosen standard defect type (the summary of all custom types).
If you check a single custom defect type, the system will show just the defect type that you have chosen.
If you choose “Total Defect type” and custom defect types, the system will show and grouped statistics and statistics of each custom defect types.

Widget view

The widget contains agenda with selected statuses; you can click on a status to remove/add it to the chart.

The widget view in Launch mode:

  • The X-axis shows launches numbers and launches names (on hover).
  • Y-axis shows the sum of test cases with each selected statuses.

The tooltip on mouse hover over chart area shows launch details: launch name and number, launch start time and launch statistics.

Area view @@ -27,7 +27,7 @@

The widget view in Timeline mode:

  • The X-axis shows dates and weekdays.
  • Y-axis shows the sum of launches statistics with each selected statuses, distributed by weekdays.

The tooltip on mouse hover over the chart area shows details: date and total launches statistics.

The widget has clickable sections; when you click on a specified section in the widget, the system forwards you to launch view for appropriate selection.

Area view

Bar view

note

The widget doesn't contain "IN PROGRESS" launches.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/LaunchesDurationChart/index.html b/dashboards-and-widgets/LaunchesDurationChart/index.html index 3dadd433c..4dd70e193 100644 --- a/dashboards-and-widgets/LaunchesDurationChart/index.html +++ b/dashboards-and-widgets/LaunchesDurationChart/index.html @@ -12,15 +12,15 @@ - - + +
-

Launches duration chart

The Launch Duration Chart shows the duration of the selected launches.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. Default meaning is 50
  • Mode All launches/ Latest launches

Widget view

The widget shows the duration of the filtered launches.

  • The X-axis shows launches duration.
  • Y-axis shows launches numbers and launches names on hover.

Tooltip on mouse hover over chart area shows launch details: launch name, number, and duration.

The Widget has clickable sections when you click on a specified section in a widget, the system forwards you to launch view for appropriate selection.

The Widget has two states: All launches and Latest lunches. If you chose All launches mode, the widget will show statistics about all launches in the filter. To view only the latest executions of each launch, you should choose Latest launches.

note

The widget doesn't contain "IN PROGRESS" launches.

- - +

Launches duration chart

The Launch Duration Chart shows the duration of the selected launches.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. Default meaning is 50
  • Mode All launches/ Latest launches

Widget view

The widget shows the duration of the filtered launches.

  • The X-axis shows launches duration.
  • Y-axis shows launches numbers and launches names on hover.

Tooltip on mouse hover over chart area shows launch details: launch name, number, and duration.

The Widget has clickable sections when you click on a specified section in a widget, the system forwards you to launch view for appropriate selection.

The Widget has two states: All launches and Latest lunches. If you chose All launches mode, the widget will show statistics about all launches in the filter. To view only the latest executions of each launch, you should choose Latest launches.

note

The widget doesn't contain "IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/LaunchesTable/index.html b/dashboards-and-widgets/LaunchesTable/index.html index c0d677cc7..6f7cf7205 100644 --- a/dashboards-and-widgets/LaunchesTable/index.html +++ b/dashboards-and-widgets/LaunchesTable/index.html @@ -12,15 +12,15 @@ - - + +
-

Launches table

The widget shows a configurable table of launches.

Widget's parameters:

  • The widget criteria are as follows: Total, Passed, Failed, Skipped, Product Bug, Automation Bug, System Issue, To Investigate, Attributes, User, Description, Start time, Finish time. All criteria are selected by default. To specify them, uncheck unnecessary items in "Criteria for Widget".
  • Items: 1-150. The default meaning is 50.

Widget view

The widget has a table view.

The widget has clickable elements "launch name", "owner", "attributes", and "number of items"; when you click on specific elements in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain "IN PROGRESS" launches.

- - +

Launches table

The widget shows a configurable table of launches.

Widget's parameters:

  • The widget criteria are as follows: Total, Passed, Failed, Skipped, Product Bug, Automation Bug, System Issue, To Investigate, Attributes, User, Description, Start time, Finish time. All criteria are selected by default. To specify them, uncheck unnecessary items in "Criteria for Widget".
  • Items: 1-150. The default meaning is 50.

Widget view

The widget has a table view.

The widget has clickable elements "launch name", "owner", "attributes", and "number of items"; when you click on specific elements in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain "IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/ManageWidgets/index.html b/dashboards-and-widgets/ManageWidgets/index.html index bf22aeef9..51768dad4 100644 --- a/dashboards-and-widgets/ManageWidgets/index.html +++ b/dashboards-and-widgets/ManageWidgets/index.html @@ -12,16 +12,16 @@ - - + +
-

Manage Widgets

Customize widget

When you create a widget in our test automation dashboard, it has a basic size. Afterward, you may change the widget size.

To resize widget the user can hover the mouse cursor over the widget. The system will show resizing arrows.

Grab the arrow with the cursor and drag it to the desired width and height.

You can maintain the existing aspect ratio or set a new one when resizing the widget.

note

Widgets have a minimum and maximum mean of width and height defined within the application.

Another way you can customize your dashboard is by changing the widgets' placement within the dashboard canvas area.

To change a widget placement on the dashboard, perform the following: grab a widget with the cursor by clicking and dragging it to the selected position, holding down the mouse button.

When you move the widget to the area with sufficient space, the system highlights this place. +

Manage Widgets

Customize widget

When you create a widget in our test automation dashboard, it has a basic size. Afterward, you may change the widget size.

To resize widget the user can hover the mouse cursor over the widget. The system will show resizing arrows.

Grab the arrow with the cursor and drag it to the desired width and height.

You can maintain the existing aspect ratio or set a new one when resizing the widget.

note

Widgets have a minimum and maximum mean of width and height defined within the application.

Another way you can customize your dashboard is by changing the widgets' placement within the dashboard canvas area.

To change a widget placement on the dashboard, perform the following: grab a widget with the cursor by clicking and dragging it to the selected position, holding down the mouse button.

When you move the widget to the area with sufficient space, the system highlights this place. The widgets located in this space, are moved to the relocatable widget place. Using this option the user can configure the desired location of the widgets on a dashboard.

Edit widget

To create a new widget for data visualization, perform the following steps:

  1. Click the "Edit" icon in the right corner of the widget header.

  2. After the "Edit Widget" window is opened, you can edit any widget settings except the template itself.

  3. Make the necessary changes and click the "Save" button. The widget will be updated.

View widgets in full-screen mode

To view widgets on the whole screen, click the 'Full Screen' button in the right top corner of the dashboard.

Widgets are shown in the same order as for standard view.

note

Clickable areas or elements are disabled for the full-screen mode selected, therefore it will not be possible to create a new widget, update, or delete available widgets in this mode.

The auto-refresh timeout for widgets in full-screen mode is 30 sec.

Delete widget

To delete the widget:

  1. Click the "Delete" icon (X) in the right corner of the widget header.

  2. Click the "Delete" button on the confirmation popup.

  3. The widget will be deleted from the system.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/MostFailedTestCasesTableTop50/index.html b/dashboards-and-widgets/MostFailedTestCasesTableTop50/index.html index 2b833f230..01b419a55 100644 --- a/dashboards-and-widgets/MostFailedTestCasesTableTop50/index.html +++ b/dashboards-and-widgets/MostFailedTestCasesTableTop50/index.html @@ -12,16 +12,16 @@ - - + +
-

Most failed test-cases table (TOP-50)

The widget contains a table with statistical information about the TOP-50 most problematic test cases.

Widget's parameters:

  • The widget criteria are as follows: Failed, Skipped, Product Bug, Automation Bug, System Issue, No Defect. Failed is selected by default.

  • Launches count: 2-150. By default, "Launches count" is 30.

  • Launch name: Is required.

  • Include /Exclude Before and After methods

Widget view

The widget has a table view with the following data displayed:

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/MostPopularPatternTableTop20/index.html b/dashboards-and-widgets/MostPopularPatternTableTop20/index.html index 3a61f3ae6..8f4a5865d 100644 --- a/dashboards-and-widgets/MostPopularPatternTableTop20/index.html +++ b/dashboards-and-widgets/MostPopularPatternTableTop20/index.html @@ -12,19 +12,19 @@ - - + +
-

Most popular pattern table (TOP-20)

Widget's parameters:

  • Filter
  • Parameters: All launches/ Latest launches
  • Number of shown patterns on the widget: 20
  • Attribute key for the first level (mandatory)

For this widget, the system chooses 600 last launches by start time from the filter. +

Most popular pattern table (TOP-20)

Widget's parameters:

  • Filter
  • Parameters: All launches/ Latest launches
  • Number of shown patterns on the widget: 20
  • Attribute key for the first level (mandatory)

For this widget, the system chooses 600 last launches by start time from the filter. Then it leaves only launches that have an attribute with mentioned key and group launches by attribute value. The system leaves only the latest launches in each group (if the user has chosen option Latest launches in the widget wizard). For each group of launches, a list with pattern aggregated.

Widget view

On the widget a user can view a table which shows:

  • 20 patterns with the biggest number of test cases in each defined group.

Via drop-down user can transit from group to group. A pattern name is clickable. By clicking on pattern name a user is redirected to a list with all test cases which have clicked pattern. A list of test cases includes test cases from different launches.

note

The widget doesn't contain 'IN PROGRESS" launches.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20/index.html b/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20/index.html index 5382b0822..2b360efe5 100644 --- a/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20/index.html +++ b/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20/index.html @@ -12,16 +12,16 @@ - - + +
-

Most time-consuming test cases widget (TOP-20)

Show the TOP 20 test cases with the highest duration in the last execution of the specified launch.

Widget's parameters:

  • Test Status. Default value - Passed, Failed

  • Launch name. Is required

  • Include /Exclude Before and After methods

  • View options: Bar view, Table view

Widget view

Table View

The widget has a table view with the following data displayed:

  • Test Item name - link to the log of the last launch

  • Test Status

  • Test Duration

  • Test Start Time - date and time of the last run, displayed in 'time ago' format (i.e. "10 minutes ago").

On mouse hover, the system will display accurate start times.

Bar View

Bar chart where:

  • axis OY - Tests
  • axsic OX - Duration

Bar color specifies a color of execution. +

Most time-consuming test cases widget (TOP-20)

Show the TOP 20 test cases with the highest duration in the last execution of the specified launch.

Widget's parameters:

  • Test Status. Default value - Passed, Failed

  • Launch name. Is required

  • Include /Exclude Before and After methods

  • View options: Bar view, Table view

Widget view

Table View

The widget has a table view with the following data displayed:

  • Test Item name - link to the log of the last launch

  • Test Status

  • Test Duration

  • Test Start Time - date and time of the last run, displayed in 'time ago' format (i.e. "10 minutes ago").

On mouse hover, the system will display accurate start times.

Bar View

Bar chart where:

  • axis OY - Tests
  • axsic OX - Duration

Bar color specifies a color of execution. On mouse hover, the system will display accurate start times.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/NonPassedTestCasesTrendChart/index.html b/dashboards-and-widgets/NonPassedTestCasesTrendChart/index.html index 44186dbd4..0f403c273 100644 --- a/dashboards-and-widgets/NonPassedTestCasesTrendChart/index.html +++ b/dashboards-and-widgets/NonPassedTestCasesTrendChart/index.html @@ -12,15 +12,15 @@ - - + +
-

Non-passed test-cases trend chart

The widget shows the percent ratio of non-passed test cases "Failed + Skipped" and "Total" cases from run to run.

Widget's parameters:

To configure the widget, click the "Add New Widget" button on the dashboard header, then select a template and specify the following settings on the second step:

  • Filter.
  • Items: 1-150. Default meaning is 50

Widget view

The widget contains agenda: % (Failed + Skipped) / Total.

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the percent of sum Failed + Skipped test cases to Total.

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start time and percentage of non-passed cases.

note

The widget doesn't contain "IN PROGRESS" launches.

- - +

Non-passed test-cases trend chart

The widget shows the percent ratio of non-passed test cases "Failed + Skipped" and "Total" cases from run to run.

Widget's parameters:

To configure the widget, click the "Add New Widget" button on the dashboard header, then select a template and specify the following settings on the second step:

  • Filter.
  • Items: 1-150. Default meaning is 50

Widget view

The widget contains agenda: % (Failed + Skipped) / Total.

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the percent of sum Failed + Skipped test cases to Total.

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start time and percentage of non-passed cases.

note

The widget doesn't contain "IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/OverallStatistics/index.html b/dashboards-and-widgets/OverallStatistics/index.html index a0a0206ca..d74d36f12 100644 --- a/dashboards-and-widgets/OverallStatistics/index.html +++ b/dashboards-and-widgets/OverallStatistics/index.html @@ -12,16 +12,16 @@ - - + +
-

Overall statistics

The panel shows a summary of test cases with each status for each selected launch.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 50.
  • Widget Criteria: All criteria are selected by default.
  • Type of view: Panel view/ Donut view
  • Mode All launches/ Latest launches

Widget view

The widget shows statistics of the All launches/or Latest launches for the chosen filter. Statistics are divided into the following sections:

  • Skipped, Passed, Failed
  • Product Bug, System Issue, Automation Bug, No Defect and To Investigate.

The statistics for every type are shown in percentages. On hover, the exact number is shown for each type. +

Overall statistics

The panel shows a summary of test cases with each status for each selected launch.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 50.
  • Widget Criteria: All criteria are selected by default.
  • Type of view: Panel view/ Donut view
  • Mode All launches/ Latest launches

Widget view

The widget shows statistics of the All launches/or Latest launches for the chosen filter. Statistics are divided into the following sections:

  • Skipped, Passed, Failed
  • Product Bug, System Issue, Automation Bug, No Defect and To Investigate.

The statistics for every type are shown in percentages. On hover, the exact number is shown for each type. The Widget has clickable sections when you click on a specified section in the widget, the system forwards you to launch view for appropriate selection.

If you chose All launches mode, the widget will show the statistics about all launches in the filter. To view only the latest executions of each launch, you should choose Latest launches.

The widget can be viewed in two options as shown on pictures: Panel view

or Donut view.

note

The widget doesn't contain "IN PROGRESS" launches.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/PassingRatePerLaunch/index.html b/dashboards-and-widgets/PassingRatePerLaunch/index.html index a602837f5..ba585822d 100644 --- a/dashboards-and-widgets/PassingRatePerLaunch/index.html +++ b/dashboards-and-widgets/PassingRatePerLaunch/index.html @@ -12,15 +12,15 @@ - - + +
-

Passing rate per launch

Shows the percentage ratio of Passed test cases to Total test cases for the last run of selected launch.

note

Total test cases = Passed + Not Passed, while Not Passed = Failed + Skipped + Interrupted

Thus, Passing rate = Passed / (Passed + Failed + Skipped + Interrupted)

Widget's parameters:

  • Launch Name: the name of any finished launch

  • Mode: Bar View/Pie View

  • Widget name: any text

  • Description: any text

Please find below an example of configuration:

As you can see, this widget was built based on the test results of the last run of the Daily Smoke Suite:

Widget view

The widget can be displayed in two options as shown on the pictures below:

Bar View

Pie View

The tooltip on mouse hover over chart area shows the quantity of Passed/Failed test cases and percentage ratio of Passed/Failed test cases to Total cases for the last run.

The widget has clickable sections. When you click on a specific section in the widget, the system forwards you to the launch view for appropriate selection.

note

The widget doesn't contain 'IN PROGRESS" launches.

- - +

Passing rate per launch

Shows the percentage ratio of Passed test cases to Total test cases for the last run of selected launch.

note

Total test cases = Passed + Not Passed, while Not Passed = Failed + Skipped + Interrupted

Thus, Passing rate = Passed / (Passed + Failed + Skipped + Interrupted)

Widget's parameters:

  • Launch Name: the name of any finished launch

  • Mode: Bar View/Pie View

  • Widget name: any text

  • Description: any text

Please find below an example of configuration:

As you can see, this widget was built based on the test results of the last run of the Daily Smoke Suite:

Widget view

The widget can be displayed in two options as shown on the pictures below:

Bar View

Pie View

The tooltip on mouse hover over chart area shows the quantity of Passed/Failed test cases and percentage ratio of Passed/Failed test cases to Total cases for the last run.

The widget has clickable sections. When you click on a specific section in the widget, the system forwards you to the launch view for appropriate selection.

note

The widget doesn't contain 'IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/PassingRateSummary/index.html b/dashboards-and-widgets/PassingRateSummary/index.html index d90982a3c..a08499233 100644 --- a/dashboards-and-widgets/PassingRateSummary/index.html +++ b/dashboards-and-widgets/PassingRateSummary/index.html @@ -12,15 +12,15 @@ - - + +
-

Passing rate summary

Shows the percentage ratio of Passed test cases to Total test cases for set of launches.

note

Total test cases = Passed + Not Passed, while Not Passed = Failed + Skipped + Interrupted

Thus, Passing rate = Passed / (Passed + Failed + Skipped + Interrupted)

Widget's parameters:

  • Filter: At least one filter is required

  • Items: 1-600. The default meaning is 50.

  • Mode: Bar View/Pie View

  • Widget name: any text

  • Description: any text

Please find below an example of configuration:

Widget view

The widget can be displayed in two options as shown on the pictures below:

Bar View

Pie view

As you can see, this widget was built based on the “regression” filter.

The tooltip on mouse hover over chart area shows the quantity of Passed/Not passed test cases and percentage ratio of Passed/Not passed test cases to Total test cases for the specified set of launches.

The widget has clickable sections. When you click on a specific section in the widget, the system forwards you to the launches view for the appropriate selection.

Thanks to “Passing rate summary” widget, it is no longer needed to spend time on calculating Passing rate of the specified set of launches. ReportPortal provides these statistics as a visualization – it is a quick and convenient decision. You can take the screenshot of widget and use it in the Test results report.

note

The widget doesn't contain 'IN PROGRESS" launches.

- - +

Passing rate summary

Shows the percentage ratio of Passed test cases to Total test cases for set of launches.

note

Total test cases = Passed + Not Passed, while Not Passed = Failed + Skipped + Interrupted

Thus, Passing rate = Passed / (Passed + Failed + Skipped + Interrupted)

Widget's parameters:

  • Filter: At least one filter is required

  • Items: 1-600. The default meaning is 50.

  • Mode: Bar View/Pie View

  • Widget name: any text

  • Description: any text

Please find below an example of configuration:

Widget view

The widget can be displayed in two options as shown on the pictures below:

Bar View

Pie view

As you can see, this widget was built based on the “regression” filter.

The tooltip on mouse hover over chart area shows the quantity of Passed/Not passed test cases and percentage ratio of Passed/Not passed test cases to Total test cases for the specified set of launches.

The widget has clickable sections. When you click on a specific section in the widget, the system forwards you to the launches view for the appropriate selection.

Thanks to “Passing rate summary” widget, it is no longer needed to spend time on calculating Passing rate of the specified set of launches. ReportPortal provides these statistics as a visualization – it is a quick and convenient decision. You can take the screenshot of widget and use it in the Test results report.

note

The widget doesn't contain 'IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/PossibleDashboardsInReportPortal/index.html b/dashboards-and-widgets/PossibleDashboardsInReportPortal/index.html index 8bed24ef7..44b1c2eb4 100644 --- a/dashboards-and-widgets/PossibleDashboardsInReportPortal/index.html +++ b/dashboards-and-widgets/PossibleDashboardsInReportPortal/index.html @@ -12,18 +12,18 @@ - - + +
-

Possible Dashboards in ReportPortal

ReportPortal.io is a powerful test automation reporting dashboard that acquires a lot of analytics. With this manual, we are wanting to help you to configure simple and understandable reports for your teams.

Let's look on 2 examples of dashboards which you can generate:

  • Report for one Launch
  • Report for Build (Version, Release, Sprint)

Precondition +

Possible Dashboards in ReportPortal

ReportPortal.io is a powerful test automation reporting dashboard that acquires a lot of analytics. With this manual, we are wanting to help you to configure simple and understandable reports for your teams.

Let's look on 2 examples of dashboards which you can generate:

  • Report for one Launch
  • Report for Build (Version, Release, Sprint)

Precondition Let's assume that we have a Regression suite which contains:

  • a suite with API test cases
  • a suite with UI test cases
  • a suite with integration test cases

The whole Regression is running against nightly build every day. Different teams are responsible for different suites.

Which dashboard I can create in such conditions?

Report for one tests run (A dashboard for an engineer)

The goal for this test results dashboard to show the status of the latest test run. For instance to see the latest results for launch with an API suite.

You can configure: Passing rate widget that shows a passing rate for a latest launch "API suite'

Most popular pattern tracks TOP-20 problems in the last and previous runs of this suite.

note

For Most popular pattern table, you should you create a set of rules and run Pattern Analysis

With Investigated percentage of launches you can find out the status of failure investigations. You will be able to evaluate team performance and consistency of results.

Failed cases trend chart shows the history of failures in previous runs.

Duration chart will be very helpful for those who track duration KPI and want to increase the speed of tests run.

Test growth trend chart shows you the speed of new test cases creation.

Also, you can create "Most flaky test cases" and "Most failed test case" and find the most unstable items which should be taken into account.

Let's assume that you have a lot of test results and a lot of teams.

You can create Overall statistics and Launches table, and now a team who is responsible for API suite has no need to go to the test results. It can use only this dashboard which gives enough information for test failure management.

Build / Release/ Sprint Report (A dashboard for a Team leads, PM, DM)

The goal of this report to show status for the whole version. It means for this report we want to see the latest results of aggregated statistics for several lanches.

In our example, I want to see the latest results for the whole Regression (latest results for API suite + latest results for UI + latest results for Integration tests).

Also, it is very useful to compare the results of the Regression on the current version with the Regression on previous versions and to see details about business metrics.

On this dashboard you can see different metrics:

  • on different env
  • on a different dimension
  • by business metrics / by features/ by user roles / by etc

Also with a help of Component Health Check Widget you can create a Test Pyramid.

note

You need to report test executions with attributes which specified needed metrics or envs

note

Component Health Check Widget and Cumulative trend chart are very configurable and you can create your own widget based on project needs.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/ProjectActivityPanel/index.html b/dashboards-and-widgets/ProjectActivityPanel/index.html index 5ff8de8ed..184f9d174 100644 --- a/dashboards-and-widgets/ProjectActivityPanel/index.html +++ b/dashboards-and-widgets/ProjectActivityPanel/index.html @@ -12,16 +12,16 @@ - - + +
-

Project activity panel

The widget shows all activities occurring on the project.

Widget's parameters:

  • The actions for the widget: Start launch, Finish launch, Delete launch, Actions with issues, Assign/Invite users, Unassign user, Change role, Update Dashboard, Update widget, Update Filter, Update integration, Update project settings, Update Auto-Analysis settings, Update defect types, Import, Update Pattern-Analysis settings, Create pattern, Update pattern, Delete pattern, Pattern matched, Create project.

  • Items: 1-150. The default value is 50.

  • Criteria for widget: By default, all user's activities.

Widget view

The actions on the widget are present in a table, separated by days. Action messages have the following format:

Member (name) did action.
+

Project activity panel

The widget shows all activities occurring on the project.

Widget's parameters:

  • The actions for the widget: Start launch, Finish launch, Delete launch, Actions with issues, Assign/Invite users, Unassign user, Change role, Update Dashboard, Update widget, Update Filter, Update integration, Update project settings, Update Auto-Analysis settings, Update defect types, Import, Update Pattern-Analysis settings, Create pattern, Update pattern, Delete pattern, Pattern matched, Create project.

  • Items: 1-150. The default value is 50.

  • Criteria for widget: By default, all user's activities.

Widget view

The actions on the widget are present in a table, separated by days. Action messages have the following format:

Member (name) did action.
Time - displayed in 'time ago' format (i.e. "10 minutes ago"). On mouse hover, the system should display accurate action time.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/TableComponentHealthCheck/index.html b/dashboards-and-widgets/TableComponentHealthCheck/index.html index 11ab565e1..089163557 100644 --- a/dashboards-and-widgets/TableComponentHealthCheck/index.html +++ b/dashboards-and-widgets/TableComponentHealthCheck/index.html @@ -12,21 +12,21 @@ - - + +
-

Table Component health check

Shows the detailed statistics of the application components which are indicated by the specified attributes.

note

For using this widget you need to report (or add manually) attributes to test items.

Why can this widget can be useful for your project

Let's look at several use cases on how you can utilize Component Health Check Widget.

Use case #1

Use Case: To track information regarding the latest version in version without filter update

Problem: You are a test lead, and you want to track information regarding the latest results without any additional movements. Your version contains several launches: a launch with API test cases, a launch with UI test cases, and a launch with Integration test cases. +

Table Component health check

Shows the detailed statistics of the application components which are indicated by the specified attributes.

note

For using this widget you need to report (or add manually) attributes to test items.

Why can this widget can be useful for your project

Let's look at several use cases on how you can utilize Component Health Check Widget.

Use case #1

Use Case: To track information regarding the latest version in version without filter update

Problem: You are a test lead, and you want to track information regarding the latest results without any additional movements. Your version contains several launches: a launch with API test cases, a launch with UI test cases, and a launch with Integration test cases. You need to track summary statistics for the latest results for API launch, UI launch, and Integration launch. For that reason, you have added an attribute 'version: XXX" to all needed launches, where specify the number of versions. And you have created a filter that includes all launches with the mentioned attribute. Now you can create a widget Overall statistics for instance. And this widget will show you a summary of the latest results for version: xxx. But if you run a new version (for instance version: xxx+1), you should repeat previous actions one more time: create the filter, update the widget.

Solution: How you can skip these steps. Create filter which includes 3 launches: API launch, UI launch, and Integration launch. Create a Component Health Check widget (table view) with this filter and add attribute key 'version' for grouping. Now you will see a summary for the latest version every day. If a new version appears in the system, a widget automatically removes info about the previous one and adds the latest version.

Use case #2

Use Case: To track information regarding components such features/browsers/ platforms/ or others

Problem: You are running different launches API launch, UI launch, and Integration launch. In these 3 launches, there are test cases which belong to different features. One feature can have test cases with different types: API, UI, Integration. You need to track overall statistics for features, not for launch.

Solution: Create filter which includes 3 launches: API launch, UI launch, and Integration launch. Create a Component Health Check widget (table view) with this filter and add attribute key 'feature' for grouping. Now you will see a summary for all features from different launches.

Widget logic is the same as for Component health check.

Widget's parameters:

  • Filter
  • Parameters: All launches/ Latest launches
  • The min allowable passing rate for the component: Possible value from 50 - 100%. Default value 100%.
  • Attribute key for the first level (mandatory)
  • Attribute key for the 2-10 levels (optional)
  • Custom column

Widget view

The widget has a table view. Each line contains information regarding one component (one unique attribute value):

  • component name
  • component passing rate
  • statistics: Total/Passed/Failed/Skipped/ Product bugs/ Automation bugs/ System issues/ To investigate
  • information about attribute value in the custom column

The total line shows a summary of all components.

Custom column

Why you may need a custom column? Let's see it in the example.

Use case #3

Use Case: You need to understand the impact of failed test cases

Problem: You created a Component Health Check widget and can see a list with features and their passing rate. But you can not understand the importance of failed features.

Solution: Add for all test executions attributes with an attribute key 'priority: XXX'. For instance:

  • priority: low
  • priority: major
  • priority: critical

Then add to widget wizard attribute key 'priority' in the custom column field. So that system adds to the widget view information regarding priority to each feature.

*Custom sorting

You can choose how components should be sorted in the table. Possible criteria:

  • Total
  • Passing rate
  • Custom column
  • Failed items
note

Component Health Check widget (table view) is the first widget that uses a materialized view of PostgreSQL. It takes time to create it. So that is why information about new launches in the filter adds dynamically. For that reason, a user should update a widget manually by сlicking on the update button. On the widget, a user can see the time for the last update.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/TestCasesGrowthTrendChart/index.html b/dashboards-and-widgets/TestCasesGrowthTrendChart/index.html index bed778978..16b3d358f 100644 --- a/dashboards-and-widgets/TestCasesGrowthTrendChart/index.html +++ b/dashboards-and-widgets/TestCasesGrowthTrendChart/index.html @@ -12,15 +12,15 @@ - - + +
-

Test-cases growth trend chart

The widget can be used in two modes - Launch mode and Timeline mode:

  • The widget in the Launch mode shows the increment of test-cases from run to run,
  • The widget in the Timeline mode shows the increment of test-cases distributed by dates (in launches with the largest number of test-cases per day).

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 50.
  • Mode: Launch or Timeline.

Widget view

The widget view in Launch mode:

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the increment of test-cases.

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start time and launch statistics - total number of test cases and test cases growth.

The widget view in Timeline mode:

  • The X-axis shows dates and weekdays.
  • Y-axis shows the increment of test-cases in launches with the largest number of test-cases per day.

The tooltip on mouse hover over the chart area shows launch details: date and launch statistics - total number of test cases and test cases growth.

The widget has clickable sections when you click on a specific section in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain "IN PROGRESS" launches.

- - +

Test-cases growth trend chart

The widget can be used in two modes - Launch mode and Timeline mode:

  • The widget in the Launch mode shows the increment of test-cases from run to run,
  • The widget in the Timeline mode shows the increment of test-cases distributed by dates (in launches with the largest number of test-cases per day).

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 50.
  • Mode: Launch or Timeline.

Widget view

The widget view in Launch mode:

  • The X-axis shows launches numbers and launches names on hover.
  • Y-axis shows the increment of test-cases.

The tooltip on mouse hover over the chart area shows launch details: launch name and number, launch start time and launch statistics - total number of test cases and test cases growth.

The widget view in Timeline mode:

  • The X-axis shows dates and weekdays.
  • Y-axis shows the increment of test-cases in launches with the largest number of test-cases per day.

The tooltip on mouse hover over the chart area shows launch details: date and launch statistics - total number of test cases and test cases growth.

The widget has clickable sections when you click on a specific section in the widget, the system forwards you to the launch view for the appropriate selection.

note

The widget doesn't contain "IN PROGRESS" launches.

+ + \ No newline at end of file diff --git a/dashboards-and-widgets/UniqueBugsTable/index.html b/dashboards-and-widgets/UniqueBugsTable/index.html index 859815632..c3af722a8 100644 --- a/dashboards-and-widgets/UniqueBugsTable/index.html +++ b/dashboards-and-widgets/UniqueBugsTable/index.html @@ -12,16 +12,16 @@ - - + +
-

Unique bugs table

The widget shows real identified bugs, posted to the Bug Tracking System from ReportPortal, and existing bugs, that were added to the items on ReportPortal.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 10.

Widget view

The widget has a table view and bugs that are found are then sorted by the date they were posted or added.

The widget has the following data displayed:

  • Bug ID - links to the issue in Bug Tracking System.
  • Found in - links to the test item, to which the bug was posted/added.
  • Submit date - the date the bug was submitted/added. Time is displayed in 'time ago' format (i.e. "10 minutes ago"). On mouse hover, the system should display accurate action time.
  • Submitter - user, who submitted/added the bug.
note

The bugs from launches "IN PROGRESS" are not shown on the widget. +

Unique bugs table

The widget shows real identified bugs, posted to the Bug Tracking System from ReportPortal, and existing bugs, that were added to the items on ReportPortal.

Widget's parameters:

  • Filter: At least one filter is required
  • Items: 1-150. The default meaning is 10.

Widget view

The widget has a table view and bugs that are found are then sorted by the date they were posted or added.

The widget has the following data displayed:

  • Bug ID - links to the issue in Bug Tracking System.
  • Found in - links to the test item, to which the bug was posted/added.
  • Submit date - the date the bug was submitted/added. Time is displayed in 'time ago' format (i.e. "10 minutes ago"). On mouse hover, the system should display accurate action time.
  • Submitter - user, who submitted/added the bug.
note

The bugs from launches "IN PROGRESS" are not shown on the widget. In case a bug is found in multiple items, all of the items will be listed in the "Found in" column.

- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/WidgetCreation/index.html b/dashboards-and-widgets/WidgetCreation/index.html index 147265230..6256addf4 100644 --- a/dashboards-and-widgets/WidgetCreation/index.html +++ b/dashboards-and-widgets/WidgetCreation/index.html @@ -12,17 +12,17 @@ - - + +
-

Widget Creation

In our test automation dashboard widgets contain special graphical control elements that were designed to provide a simple and +

Widget Creation

In our test automation dashboard widgets contain special graphical control elements that were designed to provide a simple and easy-to-use way of displaying and analyzing your automation trends and data.

The widgets can be added to dashboards on the "Dashboards" tab. Widgets will be visible within the project, they are created.

Create widget

To create a new widget, perform the following steps:

  1. Navigate to the "All Dashboards" page and create a new dashboard or choose the existing one.

  2. Click the "Add New Widget" button.

  3. The Widget Wizard will be opened. To add a new widget, you need to pass all the required steps.

    • Step 1. Select the template of the widget (detailed description is below).

    • Step 2. Select a filter from the list below or create a new filter. Search functionality helps to find the filter quicker. Select other widget options: Criteria, Items, Launch or Timeline mode (if applicable for selected widget template)

    • Step 3. Enter a widget name and description. A widget name should be unique for a user on the project.

  4. After you have completed all steps, click the "Save" button. The new widget will be added to the dashboard on the top.

Widgets are automatically refreshed every minute.

Predefined widgets types

There are 15 widget templates in ReportPortal for tracking different KPI:

KPIWidget template
Track the reasons of failuresLaunch statistics chart
Passing rate for filter summary, and structure of problemsOverall statistics
Track the longest launch in the filterLaunches duration chart
Track the passing rate and structure of problems of the latest run in the systemLaunch execution and issue statistic
Track the activity of your QA teamProject activity panel
Track the growth of new test cases in your buildTest-cases growth trend chart
Track the speed of test failure analysisInvestigated percentage of launches
Follow up information about only important launches for your teamLaunches table
Track new BTS issues in your runUnique bugs table
Track the most unstable test cases in the buildMost failed test-cases table
See the trend of the number of failed test cases from build to buildFailed cases trend chart
See the trend of the number of failed and skipped test cases from build to buildNon-passed test-cases trend chart
Compare two launches togetherDifferent launches comparison chart
Track passing rate for one launchPassing rate per launch
Track passing rate for the buildPassing rate summary
Find the most flakiest test in the buildFlaky test cases table (TOP-20)
Compare statistics for different builds on one graphCumulative trend chart
Track the most popular failure reasons in the buildMost popular pattern table (TOP-20)
Track the passing rate of different components of your applicationComponent health check
Track the statistics of different components of your applicationComponent health check (table)
Track the top-20 tests with longest execution timeMost time-consuming test cases widget (TOP-20)
- - + + \ No newline at end of file diff --git a/dashboards-and-widgets/WorkWithDashboards/index.html b/dashboards-and-widgets/WorkWithDashboards/index.html index 2d2ca9388..1e38a5b19 100644 --- a/dashboards-and-widgets/WorkWithDashboards/index.html +++ b/dashboards-and-widgets/WorkWithDashboards/index.html @@ -12,20 +12,20 @@ - - + +
-

Work with dashboards

Dashboards on our continuous testing platform are special containers, where users can create widgets.

To create and use dashboards, navigate to the "Dashboards" tab.

You can create a dashboard that will be visible on the current project.

Create dashboard

To create a new dashboard, perform the following steps:

  1. Navigate to the "Dashboards" page and click "Add New +

    Work with dashboards

    Dashboards on our continuous testing platform are special containers, where users can create widgets.

    To create and use dashboards, navigate to the "Dashboards" tab.

    You can create a dashboard that will be visible on the current project.

    Create dashboard

    To create a new dashboard, perform the following steps:

    1. Navigate to the "Dashboards" page and click "Add New Dashboard" button in the top right corner of the page.

    2. The "Add New Dashboard" popup will be opened.

    3. Enter a name for a new dashboard. The name should be between 3 to 55 characters long and unique for the user per the project. You can add the description for your dashboard as well.

    4. Click "Add" button. The new dashboard will be created.

    Now you can add widgets to the dashboard.

    Edit dashboard

    To edit a dashboard, perform the following steps:

    1. Navigate to "All Dashboards" page.

    2. Click the "Edit" icon in the top corner of the dashboard or click the name of the dashboard and click 'Edit' button in the header of the dashboard.

    3. The "Edit Dashboard" popup will be opened.

    4. Make the necessary changes and click "Update" button. The dashboard will be displayed with updates.

    Delete dashboard

    To remove a dashboard from the project, perform the following steps:

    1. Click the "Delete" button in the top right corner of the dashboard.

    2. Click the "Delete" button on confirmation pop-up.

    The dashboard and related widgets will be deleted from the system.

- - + + \ No newline at end of file diff --git a/dev-guides/APIDifferencesBetweenV4AndV5/index.html b/dev-guides/APIDifferencesBetweenV4AndV5/index.html index a5a6194c4..09067dcd2 100644 --- a/dev-guides/APIDifferencesBetweenV4AndV5/index.html +++ b/dev-guides/APIDifferencesBetweenV4AndV5/index.html @@ -12,14 +12,14 @@ - - + +
-

API differences between v4 and v5

New endpoints

Activity controller

GET /v1/{projectName}/activity/{activityId} - Get activity by id.


Dashboard controller

PUT /v1/{projectName}/dashboard/{dashboardId}/{widgetId}} - Add specified widget to dashboard.

DELETE /v1/{projectName}/dashboard/{dashboardId}/{widgetId} - Delete specified widget from dashboard.


Launch controller

note

Tags from v4 was replaced by attributes in v5. +

API differences between v4 and v5

New endpoints

Activity controller

GET /v1/{projectName}/activity/{activityId} - Get activity by id.


Dashboard controller

PUT /v1/{projectName}/dashboard/{dashboardId}/{widgetId}} - Add specified widget to dashboard.

DELETE /v1/{projectName}/dashboard/{dashboardId}/{widgetId} - Delete specified widget from dashboard.


Launch controller

note

Tags from v4 was replaced by attributes in v5. Attribute contains key and value. It may have null key, but non-null value. Attribute with null value is analog for v4 tag.

GET /v1/{projectName}/launch/attribute/keys - Retrieve all unique attribute keys of project launches.

GET /v1/{projectName}/launch/attribute/values - Retrieve all unique attribute values of project launches.

GET /v1/{projectName}/launch/status - Get launches statuses.

GET /v1/{projectName}/launch/uuid/{launchUuid} - Get launch by uuid.

note

Response from start(create) launch request contains object with key id and string value (example: id="33fa80b9-8ec9-4d52-8cb7-68b7bb4070f1"). It is not physical id in database. It is UUID (virtual id of launch, part of asynchronous reporting implementation). @@ -30,7 +30,7 @@ Using request above you can retrieve physical id from database of just reported test item and use it in next queries for items, logs etc.

PUT /v1/{projectName}/item/info - Bulk update items attributes and descriptions.

PUT /v1/{projectName}/item/issue/link - Link external issue for specified test items.

PUT /v1/{projectName}/item/issue/unlink - Unlink external issue for specified test items.


User controller

GET /v1/user/export - Export information about all users.

GET /v1/user/registration - Get user bid info.

GET /v1/user/registration/info - Validate user login and/or email.

GET /v1/user/search - Search users by term.

GET /v1/user/{userName}/projects - Retrieve all user projects.

DELETE /v1/user - Delete specified users by ids.


Widget controller

New group of widgets that may have few levels

GET /v1/{projectName}/widget/multilevel/{widgetId} - Get multilevel widget by id.


New controllers

Bug tracking system controller - replacement of external system controller.

GET /v1/bts/{integrationId}/fields-set - Get list of fields required for posting ticket.

GET /v1/bts/{integrationId}/issue_types - Get list of allowable issue types for bug tracking system.

GET /v1/bts/{projectName}/ticket/{ticketId} - Get ticket from the bts integration.

GET /v1/bts/{projectName}/{integrationId}/fields-set - Get list of fields required for posting ticket (project integration).

GET /v1/bts/{projectName}/{integrationId}/issue_types - Get list of allowable issue types for bug tracking system (project integration).

POST - /v1/bts/{projectName}/{integrationId}/ticket - Post ticket to the bts integration.


Integration controller

GET /v1/integration/global/all - Get available global integrations.

GET /v1/integration/global/all/{pluginName} - Get available global integrations for plugin.

GET /v1/integration/project/{projectName}/all - Get available project integrations.

GET /v1/integration/project/{projectName}/all/{pluginName} - Get available project integrations for plugin.

GET /v1/integration/{integrationId} - Get specified global integration by id.

GET /v1/integration/{integrationId}/connection/test - Test connection to the global integration.

GET /v1/integration/{projectName}/{integrationId}/connection/test - Test connection to the integration through the project config.

GET /v1/integration/{projectName}/{integrationId} - Get specified project integration by id.

PUT /v1/integration/{projectName}/{integrationId} - Update specified project integration by id.

PUT /v1/integration/{integrationId} - Update specified global integration by id.

PUT /v1/integration/{projectName}/{integrationId}/{command} - Execute command to the integration instance.

POST /v1/integration/{pluginName} - Create global integration.

POST /v1/integration/{projectName}/{pluginName} - Create project integration instance.

DELETE /v1/integration/all/{type} - Delete all global integrations by type.

DELETE /v1/integration/{projectName}/all/{type} - Delete all project integrations by type.

DELETE /v1/integration/{integrationId} - Delete specified global integration by id.

DELETE /v1/integration/{projectName}/{integrationId} - Delete specified project integration by id.


Launch asynchronous controller

POST /v2/{projectName}/launch - Start launch for specified project.

POST /v2/{projectName}/launch/merge - Merge set of specified launches in common one.

PUT /v2/{projectName}/launch/{launchId}/finish - Finish launch for specified project.


Test item asynchronous controller

POST /v2/{projectName}/item - Start root test item.

POST /v2/{projectName}/item/{parentItem} - Start child test item.

PUT /v2/{projectName}/item/{testItemId} - Finish test item.


Log asynchronous controller

POST /v2/{projectName}/log - Create log.


Differences in reporting

Launch rerun

Rerun developers guide

Nested steps

Nested steps wiki

Launch logs

Create log request contains fields launchUuid and itemUuid. At least one of them should not be null.

{
"itemUuid": "7f32fb6a-fcc2-4ecb-a4f7-780c559a37ca",
"launchUuid": "6fd4638d-90e2-4f52-a9bd-bf433ebfb0f3"
}

If they both are present - log will be saved as test item log. If only itemUuid is present - log will be saved as test item log. If only launchUuid is present - log will be saved as launch log.

Java client has static methods for launch log reporting:

//TODO fix links after java client final version release

- - + + \ No newline at end of file diff --git a/dev-guides/AsynchronousReporting/index.html b/dev-guides/AsynchronousReporting/index.html index cabb12904..ba08d22f8 100644 --- a/dev-guides/AsynchronousReporting/index.html +++ b/dev-guides/AsynchronousReporting/index.html @@ -12,14 +12,14 @@ - - + +
-

Asynchronous reporting

Overview

Asynchronous reporting implemented using AMQP 0-9-1 protocol based on +

Asynchronous reporting

Overview

Asynchronous reporting implemented using AMQP 0-9-1 protocol based on RabbitMq message broker. The main idea of the async reporting is to give a response back immediately after a server that is receiving a request from a client. So, using this approach, a client is not blocked and doesn't wait until a server processes the request.

Simple scheme of interactions between RabbitMq and API

Difference between ID and UUID

ID is a physical identificator of an entity generated automatically by a database at the moment of saving.
@@ -57,7 +57,7 @@ In case the launch finish request is not last in the queue it will be finished anyway. But all the next requests under the launch will be handled as soon as they get to the consumer and the launch statistics will be updated. So it is possible to report items under already finished launch.

- - + + \ No newline at end of file diff --git a/dev-guides/AttachmentsGuide/index.html b/dev-guides/AttachmentsGuide/index.html index 1bc5dab47..a483ef51d 100644 --- a/dev-guides/AttachmentsGuide/index.html +++ b/dev-guides/AttachmentsGuide/index.html @@ -12,14 +12,14 @@ - - + +
-

Attachments (Screenshots) Guide

The Attachments feature allows you to add any file or screenshot to the test case logs. It can be useful for further test failure analysis.

An example of image attachment:

An example of file attachment:

How to log attachments (Screenshots) on Java agents?

Java agents have numerous methods to log attachments, the easiest one is calling ReportPortal#emitLog static method:

import com.epam.reportportal.listeners.LogLevel;
import com.epam.reportportal.service.ReportPortal;

import java.util.Date;
import java.io.File;

class Test {
public static void log(String message, File file) {
ReportPortal.emitLog(message, LogLevel.INFO.name(), new Date(), file);
}
}

If you don't want to put ReportPortal dependencies in your code, there is a way to pass attachments through your logger.

Check out our loggers' documentation:

How to log attachments (Screenshots) on Python agents?

To log attachments in Python you first need to configure a logger, depending on your current test framework. These are the instructions:

Then you can use common method to attach any files to logs which is described here.

How to log attachments (Screenshots) on JavaScript agents?

Attachment reports are supported by our client-javascript. The attachment file can be added as a part of a log request, see the link for details.

The implementation of attachments reporting varies from agent to agent.

agent-js-playwright: +

Attachments (Screenshots) Guide

The Attachments feature allows you to add any file or screenshot to the test case logs. It can be useful for further test failure analysis.

An example of image attachment:

An example of file attachment:

How to log attachments (Screenshots) on Java agents?

Java agents have numerous methods to log attachments, the easiest one is calling ReportPortal#emitLog static method:

import com.epam.reportportal.listeners.LogLevel;
import com.epam.reportportal.service.ReportPortal;

import java.util.Date;
import java.io.File;

class Test {
public static void log(String message, File file) {
ReportPortal.emitLog(message, LogLevel.INFO.name(), new Date(), file);
}
}

If you don't want to put ReportPortal dependencies in your code, there is a way to pass attachments through your logger.

Check out our loggers' documentation:

How to log attachments (Screenshots) on Python agents?

To log attachments in Python you first need to configure a logger, depending on your current test framework. These are the instructions:

Then you can use common method to attach any files to logs which is described here.

How to log attachments (Screenshots) on JavaScript agents?

Attachment reports are supported by our client-javascript. The attachment file can be added as a part of a log request, see the link for details.

The implementation of attachments reporting varies from agent to agent.

agent-js-playwright: The attachment can be added via built-in playwright testInfo attachments or ReportingAPI.

agent-js-webdriverio: The attachment can be added via ReportingAPI, follow docs for details.

agent-js-testcafe: The attachment can be added via ReportingAPI, follow docs for details.

agent-js-codecept: @@ -31,7 +31,7 @@ There is no built-in capability to send attachments during test execution as the Jest Reporter works post-factum and does not allow to provide specific data to the report.

agent-js-postman: There is no built-in capability at the moment to send attachments during test execution due to the specifics of postman nature.

agent-js-nightwatch: The attachment can be added via ReportingAPI, follow docs for details.

An example for each agent can be found here.

How to log attachments (Screenshots) on .Net agents?

General documentation on this in .net-commons: https://github.com/reportportal/commons-net/blob/develop/docs/Logging.md

You can attach any binary content:

Context.Current.Log.Info("my binary", "image/png", bytes);
// where bytes is byte[] and image/png is mime type of content

Or use file instead:

Context.Current.Log.Info("my file", new FileInfo(filePath));
// where filePath is relative/absolute path to your file
// mime type is determined automatically
- - + + \ No newline at end of file diff --git a/dev-guides/BackEndJavaContributionGuide/index.html b/dev-guides/BackEndJavaContributionGuide/index.html index 2114af442..8878b66d1 100644 --- a/dev-guides/BackEndJavaContributionGuide/index.html +++ b/dev-guides/BackEndJavaContributionGuide/index.html @@ -12,14 +12,14 @@ - - + +
-

Back-end Java contribution guide

Landing page

Official documentation

Contribution notes on GitHub

Deployment components description

There are three Java repositories that are part of the whole RP deployment:

Code conventions

IDE Formatter

Settings file can be found at: https://github.com/reportportal/reportportal/blob/master/idea_formatting_profile.xml +

Back-end Java contribution guide

Landing page

Official documentation

Contribution notes on GitHub

Deployment components description

There are three Java repositories that are part of the whole RP deployment:

Code conventions

IDE Formatter

Settings file can be found at: https://github.com/reportportal/reportportal/blob/master/idea_formatting_profile.xml Steps to import:

  • Click on IDEA "Preferences"
  • Choose "Editor" section
  • Click on "Code style"
  • In "Scheme" section click on settings wheel → Import Scheme → IntelliJ IDEA code style XML

Code style

This document is aimed to improve some points in existing code base and implementation/design approaches synchronization inside team. It's a blueprint for now, but will be improved.

  • Code should be simple and readable as possible.
  • Avoid using useless interfaces. For our case, if we aren't planning to extend functionality, and can simply refactor (For example it isn't some separated library build with some magic), and if we don't need another implementation for example for some tests(mock, anonymous classes etc.), @@ -43,7 +43,7 @@ How to apply a fix and check if everything works fine? To do this you should follow these steps:

    • clone/update Commons DAO repository
    • checkout develop branch
    • make changes
    • create branch according to the name policy
    • push to the remote
    • create PR to the develop branch Now you have your branch on the GitHub page and can see the commit hash:
    • go to the service where your changes should be applied (Service API in our example)
    • copy commit hash and replace already existing in the build.gradle of the required service (Service API in our example):
    • after re-building project using gradle dependency will be resolved and downloaded using Jitpack tool
    • create branch according to the name policy
    • push to the remote
    • create a PR to the develop branch

    Summary notes

    This documentation should help you save your time by configuring ReportPortal local dev environment and give you understanding of some standards/conventions that we try stick to.

    Simplified development workflow should look like this:

    • always have the latest schema and data in your local DB instance using this instructions
    • checkout develop branch in the required repository
    • make changes
    • if changes in dependencies are required:
      • go to the dependency repository, make changes, create a branch and PR according to conventions
      • using commit hash update dependency in the build.gradle
    • create branch according to the name policy
    • push to the remote
    • create a PR according to the name policy
- - + + \ No newline at end of file diff --git a/dev-guides/InteractionsBetweenAPIAndAnalyzer/index.html b/dev-guides/InteractionsBetweenAPIAndAnalyzer/index.html index 522495c0b..9a6c1f768 100644 --- a/dev-guides/InteractionsBetweenAPIAndAnalyzer/index.html +++ b/dev-guides/InteractionsBetweenAPIAndAnalyzer/index.html @@ -12,15 +12,15 @@ - - + +
-

Interactions between API and Analyzer

Overview

Communication between API service and analyzer service is carried out using AMQP 0-9-1 and RabbitMQ as message broker. API service creates virtual host inside RabbitMQ with name analyzer on start. Analyzers in theirs turn connect to the virtual host and declare exchange with name and arguments. Any type of request from API and response from analyzer stores in the same queue. Request and response messages is presented as JSON.

Declaring exchange

Each analyzer has to declare direct exchange with the following arguments:

  • analyzer - Name of analyzer (string)
  • version - Analyzer version (string)
  • analyzer_index - Is indexing supported (boolean, false by default)
  • analyzer_log_search - Is log searching supported (boolean, false by default)
  • analyzer_priority - Priority of analyzer (number). The lower the number, the higher the priority.

Declaring queues

Each analyzer has to declare 5 queues with names: analyze, search, index, clean, delete.

Indexing

Index request can be used to store info about logs and then analysis will be proceed based on the info. Requests and responses use index queue.

Index request structure from API:

IndexLaunch:

AttributeDescriptionExample
launchIdId of launch101
launchNameName of launchSmoke Test
projectId of project12
analyzerConfigAnalyzer configuration
testItemsArray of test items

AnalyzerConfig:

AttributeDescriptionExample
minDocFreqThe minimum frequency of the saved logs1
minTermFreqThe minimum frequency of the word in the analyzed log1
minShouldMatchPercent of words equality between analyzed log and particular log from index95
numberOfLogLinesThe number of first lines of log message that should be considered in indeT-1
isAutoAnalyzerEnabledIs auto analysis enabledtrue
analyzerModeAnalysis mode. Allowable values: "all", "launch_name", "current_launch"all
indexingRunningIs indexing runningfalse

IndexTestItem:

AttributeDescriptionExample
testItemIdId of test item123
issueTypeIssue type locatorpb001
uniqueIdUnique id of test itemauto:c6edafc24a03c6f69b6ec070d1fd0089
isAutoAnalyzedIs test item auto analyzedfalse
logsArray of test item logs

IndexLog:

AttributeDescrioptionExample
logIdId of log125
logLevelLog level40000
messageLog messagejava.lang.AssertionError: 1 expectation failed. Expected status code <200> but was <400>. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

API send array of IndexLaunch entities that have to be indexed.

Example in json :

[
{
"launchId":110,
"launchName":"Smoke Test",
"project":11,
"analyzerConfig":{
"minDocFreq":1,
"minTermFreq":1,
"minShouldMatch":95,
"numberOfLogLines":-1,
"isAutoAnalyzerEnabled":true,
"analyzerMode":"all",
"indexingRunning":false
},
"testItems":[
{
"testItemId":101,
"issueType":"pb001",
"uniqueId":"auto:c6edafc24a03c6f69b6ec070d1fd0089",
"isAutoAnalyzed":false,
"logs":[
{
"logId":111,
"logLevel":40000,
"message":"java.lang.AssertionError: 1 expectation failed. Expected status code <200> but was <400>."
},
{
"logId":112,
"logLevel":40000,
"message":"java.lang.AssertionError: 1 expectation failed. Expected status code <200> but was <500>."
}
]
}
]
}
]

Analyzer should return response with number of indexed logs.

Analyze

Analyze request can be used to find matches from request in indexed data. Requests and responses use analyze queue.

Analyze request is the same as IndexLaunch entity used for indexing. It contains info about test items and logs thad have to be analyzed.

Response from analyzer should contain array of the following entities (info about analyzed test items):

AnalyzedItemRs:

AttributeDescriptionExample
itemIdId of analyzed test item111
relevantItemIdId of relevant test item123
issueTypeIssue type locatorpb001

Search logs

Search request can be used to find similar logs from test items with to_investigate type. Requests and responses use search queue.

Search logs request from API:

SearchRq:

AttributeDescriptionExample
launchIdId of launch111
launchNameName of launchSmoke Test
itemIdId of test item112
projectIdId of project10
filteredLaunchIdsArray of launch ids, among with search would be applied[1,2,3]
logMessagesArray of log messages looking for["first message", "second message"]
logLinesNumber of logs lines that will be used in comparison5

Analyzer should return array of log ids that matches as a response.

Clean

Clean request can be used to remove stored log from index. Requests use clean queue.

Clean logs request from API:

CleanIndexRq:

AttributeDescriptionExample
projectId of project10
idsArray of log ids to be removed[111, 122, 123]

Analyzer do not send response on the request.

Delete

Delete request can be used to delete entire index. Requests use delete queue.

Request message from API contains only id of index.

Analyzer do not send response on the request.

Examples

Custom analyzer written in java using Spring AMQP.

- - +

Interactions between API and Analyzer

Overview

Communication between API service and analyzer service is carried out using AMQP 0-9-1 and RabbitMQ as message broker. API service creates virtual host inside RabbitMQ with name analyzer on start. Analyzers in theirs turn connect to the virtual host and declare exchange with name and arguments. Any type of request from API and response from analyzer stores in the same queue. Request and response messages is presented as JSON.

Declaring exchange

Each analyzer has to declare direct exchange with the following arguments:

  • analyzer - Name of analyzer (string)
  • version - Analyzer version (string)
  • analyzer_index - Is indexing supported (boolean, false by default)
  • analyzer_log_search - Is log searching supported (boolean, false by default)
  • analyzer_priority - Priority of analyzer (number). The lower the number, the higher the priority.

Declaring queues

Each analyzer has to declare 5 queues with names: analyze, search, index, clean, delete.

Indexing

Index request can be used to store info about logs and then analysis will be proceed based on the info. Requests and responses use index queue.

Index request structure from API:

IndexLaunch:

AttributeDescriptionExample
launchIdId of launch101
launchNameName of launchSmoke Test
projectId of project12
analyzerConfigAnalyzer configuration
testItemsArray of test items

AnalyzerConfig:

AttributeDescriptionExample
minDocFreqThe minimum frequency of the saved logs1
minTermFreqThe minimum frequency of the word in the analyzed log1
minShouldMatchPercent of words equality between analyzed log and particular log from index95
numberOfLogLinesThe number of first lines of log message that should be considered in indeT-1
isAutoAnalyzerEnabledIs auto analysis enabledtrue
analyzerModeAnalysis mode. Allowable values: "all", "launch_name", "current_launch"all
indexingRunningIs indexing runningfalse

IndexTestItem:

AttributeDescriptionExample
testItemIdId of test item123
issueTypeIssue type locatorpb001
uniqueIdUnique id of test itemauto:c6edafc24a03c6f69b6ec070d1fd0089
isAutoAnalyzedIs test item auto analyzedfalse
logsArray of test item logs

IndexLog:

AttributeDescrioptionExample
logIdId of log125
logLevelLog level40000
messageLog messagejava.lang.AssertionError: 1 expectation failed. Expected status code <200> but was <400>. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

API send array of IndexLaunch entities that have to be indexed.

Example in json :

[
{
"launchId":110,
"launchName":"Smoke Test",
"project":11,
"analyzerConfig":{
"minDocFreq":1,
"minTermFreq":1,
"minShouldMatch":95,
"numberOfLogLines":-1,
"isAutoAnalyzerEnabled":true,
"analyzerMode":"all",
"indexingRunning":false
},
"testItems":[
{
"testItemId":101,
"issueType":"pb001",
"uniqueId":"auto:c6edafc24a03c6f69b6ec070d1fd0089",
"isAutoAnalyzed":false,
"logs":[
{
"logId":111,
"logLevel":40000,
"message":"java.lang.AssertionError: 1 expectation failed. Expected status code <200> but was <400>."
},
{
"logId":112,
"logLevel":40000,
"message":"java.lang.AssertionError: 1 expectation failed. Expected status code <200> but was <500>."
}
]
}
]
}
]

Analyzer should return response with number of indexed logs.

Analyze

Analyze request can be used to find matches from request in indexed data. Requests and responses use analyze queue.

Analyze request is the same as IndexLaunch entity used for indexing. It contains info about test items and logs thad have to be analyzed.

Response from analyzer should contain array of the following entities (info about analyzed test items):

AnalyzedItemRs:

AttributeDescriptionExample
itemIdId of analyzed test item111
relevantItemIdId of relevant test item123
issueTypeIssue type locatorpb001

Search logs

Search request can be used to find similar logs from test items with to_investigate type. Requests and responses use search queue.

Search logs request from API:

SearchRq:

AttributeDescriptionExample
launchIdId of launch111
launchNameName of launchSmoke Test
itemIdId of test item112
projectIdId of project10
filteredLaunchIdsArray of launch ids, among with search would be applied[1,2,3]
logMessagesArray of log messages looking for["first message", "second message"]
logLinesNumber of logs lines that will be used in comparison5

Analyzer should return array of log ids that matches as a response.

Clean

Clean request can be used to remove stored log from index. Requests use clean queue.

Clean logs request from API:

CleanIndexRq:

AttributeDescriptionExample
projectId of project10
idsArray of log ids to be removed[111, 122, 123]

Analyzer do not send response on the request.

Delete

Delete request can be used to delete entire index. Requests use delete queue.

Request message from API contains only id of index.

Analyzer do not send response on the request.

Examples

Custom analyzer written in java using Spring AMQP.

+ + \ No newline at end of file diff --git a/dev-guides/PluginDevelopersGuide/index.html b/dev-guides/PluginDevelopersGuide/index.html index 3a267e50b..776595e86 100644 --- a/dev-guides/PluginDevelopersGuide/index.html +++ b/dev-guides/PluginDevelopersGuide/index.html @@ -12,14 +12,14 @@ - - + +
-

Plugin developers guide

Introduction

ReportPortal as a microservice application had services that integrate with external systems like JIRA or RALLY. These are problems of this +

Plugin developers guide

Introduction

ReportPortal as a microservice application had services that integrate with external systems like JIRA or RALLY. These are problems of this approach:

  • every service will run as a separate application consuming additional amount of resources for environment;
  • user may not need all the integrations at the moment but need some (or a new one) later, so he should modify deployment configuration every time;
  • every service modification requires re-deployment.

To solve these problems and support dynamic integrations ReportPortal implements plugin system on top of PF4J.

note

Documentation for the UI plugins can be found here

How does it work

Creating your first plugin

Result of the following steps can be found here - Plugin example. @@ -35,7 +35,7 @@ allows us to load it using GetFileCommand.

That's how our build.gradle looks now:

import com.github.spotbugs.SpotBugsTask

plugins {
id "io.spring.dependency-management" version "1.0.9.RELEASE"
id 'java'
id 'com.github.johnrengelman.shadow' version '5.2.0'
id "com.moowork.node" version "1.3.1"
}

apply from: 'ui.gradle'

repositories {
mavenCentral()
}

dependencies {
implementation 'com.epam.reportportal:plugin-api:5.4.0'
annotationProcessor 'com.epam.reportportal:plugin-api:5.4.0'
}

artifacts {
archives shadowJar
}

sourceSets {
main {
resources
{
exclude '**'
}
}
}

jar {
from("src/main/resources") {
into("/resources")
}
from("ui/build") {
into("/resources")
}
manifest {
attributes(
"Class-Path": configurations.compile.collect { it.getName() }.join(' '),
"Plugin-Id": "${pluginId}",
"Plugin-Version": "${project.version}",
"Plugin-Provider": "Report Portal",
"Plugin-Class": "com.epam.reportportal.extension.example.ExamplePlugin",
"Plugin-Service": "api"
)
}
}

shadowJar {
from("src/main/resources") {
into("/resources")
}
from("ui/build") {
into("/resources")
}
configurations = [project.configurations.compile]
zip64 true
dependencies {
}
}

task plugin(type: Jar) {
getArchiveBaseName().set("plugin-${pluginId}")
into('classes') {
with jar
}
into('lib') {
from configurations.compile
}
extension('zip')
}

task assemblePlugin(type: Copy) {
from plugin
into pluginsDir
}

task assemblePlugins(type: Copy) {
dependsOn subprojects.assemblePlugin
}

compileJava.dependsOn npm_run_build

Now we can just execute ./gradlew build and get plugin binaries (as jar and as shadowJar) that can be loaded to the application.

Event listeners

All plugin commands are executed through the core application end-point with mapping:

https://host:port/v1/integration/{projectName}/{integrationId}/{command}

As we can see integrationId is a mandatory parameter that specifies integration to be used in the command execution.

We can affect logic executed in core application from the plugin by handling predefined set of events. As for now we will use mandatory PluginLoadedEventHandler as an example.

This handler creates the very first integration and uses PluginInfoProvider to update plugin data in the database.

To add a new listener we should use ApplicationContext after plugin was loaded - so we do it in the method marked by @PostConstruct.

Also, we should remove listeners when we unload plugin - so we implement DisposableBean interface and provide this logic in the preDestroy() method.

That's how our extension looks now:


@Extension
public class ExampleExtension implements ReportPortalExtensionPoint, DisposableBean {

public static final String BINARY_DATA_PROPERTIES_FILE_ID = "example-binary-data.properties";
private static final String PLUGIN_ID = "example";
private final String resourcesDir;

private final Supplier<Map<String, PluginCommand<?>>> pluginCommandMapping = new MemoizingSupplier<>(this::getCommands);
private final Supplier<ApplicationListener<PluginEvent>> pluginLoadedListenerSupplier;

@Autowired
private ApplicationContext applicationContext;

@Autowired
private IntegrationTypeRepository integrationTypeRepository;

@Autowired
private IntegrationRepository integrationRepository;

public ExampleExtension(Map<String, Object> initParams) {
resourcesDir = IntegrationTypeProperties.RESOURCES_DIRECTORY.getValue(initParams).map(String::valueOf).orElse("");

pluginLoadedListenerSupplier = new MemoizingSupplier<>(() -> new ExamplePluginEventListener(PLUGIN_ID,
new PluginEventHandlerFactory(integrationTypeRepository,
integrationRepository,
new PluginInfoProviderImpl(resourcesDir, BINARY_DATA_PROPERTIES_FILE_ID)
)
));
}

@Override
public Map<String, ?> getPluginParams() {
Map<String, Object> params = new HashMap<>();
params.put(ALLOWED_COMMANDS, new ArrayList<>(pluginCommandMapping.get().keySet()));
return params;
}

@Override
public PluginCommand<?> getCommandToExecute(String commandName) {
return pluginCommandMapping.get().get(commandName);
}

@PostConstruct
public void createIntegration() throws IOException {
initListeners();
}

private void initListeners() {
ApplicationEventMulticaster applicationEventMulticaster = applicationContext.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME,
ApplicationEventMulticaster.class
);
applicationEventMulticaster.addApplicationListener(pluginLoadedListenerSupplier.get());
}

@Override
public void destroy() {
removeListeners();
}

private void removeListeners() {
ApplicationEventMulticaster applicationEventMulticaster = applicationContext.getBean(AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME,
ApplicationEventMulticaster.class
);
applicationEventMulticaster.removeApplicationListener(pluginLoadedListenerSupplier.get());
}

private Map<String, PluginCommand<?>> getCommands() {
Map<String, PluginCommand<?>> pluginCommandMapping = new HashMap<>();
pluginCommandMapping.put("getFile", new GetFileCommand(resourcesDir, BINARY_DATA_PROPERTIES_FILE_ID));
pluginCommandMapping.put("testConnection", (integration, params) -> true);
return pluginCommandMapping;
}
}

Lazy initialization

All plugin components that relies on @Autowired dependencies should be loaded lazily using MemoizingSupplier or another lazy-load mechanism. This is the restriction of plugin installation flow:

note

We create extension object using constructor and only then we autowire dependencies. If we don't use lazy initialization - all objects created in the constructor will be created with NULL objects that were marked as @Autowired

- - + + \ No newline at end of file diff --git a/dev-guides/ReportPortalAPI/index.html b/dev-guides/ReportPortalAPI/index.html index 98daf8bf9..6bb8ba236 100644 --- a/dev-guides/ReportPortalAPI/index.html +++ b/dev-guides/ReportPortalAPI/index.html @@ -12,15 +12,15 @@ - - + + - - +
+ + \ No newline at end of file diff --git a/dev-guides/ReportingDevelopersGuide/index.html b/dev-guides/ReportingDevelopersGuide/index.html index ac5153910..ed29709bc 100644 --- a/dev-guides/ReportingDevelopersGuide/index.html +++ b/dev-guides/ReportingDevelopersGuide/index.html @@ -12,14 +12,14 @@ - - + +
-

Reporting developers guide

Preconditions

Let's imagine we have the following tests structure:

(Suite) Services
(Test) PluginServiceTest
(Step) uploadPlugin
(Step) updatePlugin
(Step) removePlugin
(Test) UserServiceTest
(Step) createUser
(Step) updateUser
(Step) deleteUser

So our goal is run the tests and send results to ReportPortal. +

Reporting developers guide

Preconditions

Let's imagine we have the following tests structure:

(Suite) Services
(Test) PluginServiceTest
(Step) uploadPlugin
(Step) updatePlugin
(Step) removePlugin
(Test) UserServiceTest
(Step) createUser
(Step) updateUser
(Step) deleteUser

So our goal is run the tests and send results to ReportPortal. We can interact with ReportPortal API instance trough HTTP requests.

The main flow is set of HTTP requests:

  1. Start launch
  2. Start test item
  3. Save log with attachment if necessary
  4. Finish test item
  5. Finish launch

Steps 2-4 should execute for each test item in structure.

Let's assume that our ReportPortal instance deployed at http://rp.com. And our project name is rp_project.

Also we need token to get access to API. There are two ways to retrieve it.

Retrieving api token

Using UI

You can find it in profile (http://rp.com/ui/#user-profile).

Using UAT service

First of all you need UI-token. You can get it sending POST request to http://rp.com/uat/sso/oauth/token with user credentials.

curl --header "Content-Type: application/x-www-form-urlencoded" \
--request POST \
--data "grant_type=password&username=default&password=1q2w3e" \
--user "ui:uiman" \
http://rp.com/uat/sso/oauth/token

Response will contain access_token field which is UI-token

{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzU5MDA0NDgsInVzZXJfbmFtZSI6ImRlZmF1bHQiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiOGQxZmUxOGUtNWY4NC00YTcwLWEwMTctNDBmZTU4ZmY3MjU3IiwiY2xpZW50X2lkIjoidWkiLCJzY29wZSI6WyJ1aSJdfQ.-5INLZnYJhNLwU5BTBuEDd0SBPoRGLBX6uX03kaEwLs",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJkZWZhdWx0Iiwic2NvcGUiOlsidWkiXSwiYXRpIjoiOGQxZmUxOGUtNWY4NC00YTcwLWEwMTctNDBmZTU4ZmY3MjU3IiwiZXhwIjoxNTc4NDg4ODQ4LCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiMGQyZDdiNTEtNGE3Mi00NjEwLTgxYmUtY2JmYjZhODhjNTgxIiwiY2xpZW50X2lkIjoidWkifQ.YOcpWlQSgF3LuskIqXgasjKvawbM_XP_I2oNJcgt9mM",
"expires_in": 3600,
"scope": "ui",
"jti": "8d1fe18e-5f84-4a70-a017-40fe58ff7257"
}

Next step is retrieve API-token that lives longer that UI-token.

curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzU5MDA0NDgsInVzZXJfbmFtZSI6ImRlZmF1bHQiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiOGQxZmUxOGUtNWY4NC00YTcwLWEwMTctNDBmZTU4ZmY3MjU3IiwiY2xpZW50X2lkIjoidWkiLCJzY29wZSI6WyJ1aSJdfQ.-5INLZnYJhNLwU5BTBuEDd0SBPoRGLBX6uX03kaEwLs" \
--request GET \
http://rp.com/uat/sso/me/apitoken

And in response you can see access_token which is API-token

{
"access_token": "039eda00-b397-4a6b-bab1-b1a9a90376d1",
"token_type": "bearer",
"scope": "api"
}

In case you have response with 404 error code, you should send POST request to the same endpoint. It means API-token haven't been generated for user and this request will create one.

curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzU5MDA0NDgsInVzZXJfbmFtZSI6ImRlZmF1bHQiLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiOGQxZmUxOGUtNWY4NC00YTcwLWEwMTctNDBmZTU4ZmY3MjU3IiwiY2xpZW50X2lkIjoidWkiLCJzY29wZSI6WyJ1aSJdfQ.-5INLZnYJhNLwU5BTBuEDd0SBPoRGLBX6uX03kaEwLs" \
--request POST \
http://rp.com/uat/sso/me/apitoken

So our API-token is 039eda00-b397-4a6b-bab1-b1a9a90376d1

Start launch

To start launch you should send request to the following endpoint: POST /api/{version}/{projectName}/launch

Start launch request model contains the following attributes:

AttributeRequiredDescriptionDefault valueExamples
nameYesName of launch-AutomationRun
startTimeYesLaunch start time-2019-11-22T11:47:01+00:00 (ISO 8601); Fri, 22 Nov 2019 11:47:01 +0000 (RFC 822, 1036, 1123, 2822); 2019-11-22T11:47:01+00:00 (RFC 3339); 1574423221000 (Unix Timestamp)
descriptionNoDescription of launchemptyServices tests
uuidNoLaunch uuid (string identificator)auto generated(if not present in request)69dc75cd-4522-44b9-9015-7685ec0e1abb
attributesNoLaunch attributes. Pairs of key and valueemptybuild:3.0.1, os:bionic
modeNoLaunch mode. Allowable values 'default' or 'debug'defaultDEFAULT
rerunNoRerun mode. Allowable values 'true' of 'false'falsefalse
rerunOfNoRerun mode. Specifies launch to be reruned. Uses with 'rerun' attribute.empty694e1549-b8ab-4f20-b7d8-8550c92431b0

Start launch response contains the following attributes:

AttributeRequiredDescriptionExamples
idYesUUID of created launch1d1fb22e-01f7-4ac9-9ebc-f020d8fe93ff
number (*)NoNumber of created launch1

(*) Field is not present in case using async endpoints

So full request to start our launch looks like

curl --header "Content-Type: application/json" \
--header "Authorization: Bearer 039eda00-b397-4a6b-bab1-b1a9a90376d1" \
--request POST \
--data '{"name":"rp_launch","description":"My first launch on RP","startTime":"1574423221000","mode":"DEFAULT","attributes":[{"key":"build","value":"0.1"},{"value":"test"}]}' \
http://rp.com/api/v1/rp_project/launch

Where body is the following json:

{
"name": "rp_launch",
"description": "My first launch on RP",
"startTime": "1574423221000",
"mode": "DEFAULT",
"attributes": [
{
"key": "build",
"value": "0.1"
},
{
"value": "test"
}
]
}

In the response we can see id and number if launch started successfully or an error if something went wrong.

{
"id": "96d1bc02-6a3f-451e-b706-719149d51ce4",
"number": 1
}

Value of id field should save somewhere. It is obligatory for report test items under this launch and will be used later.

Start root(suite) item

Now we have created launch and can report items under it. To start root item you should send request to the following endpoint: @@ -42,7 +42,7 @@ To do that use the same log endpoint, but in body do not send itemUuid

{
"launchUuid": "96d1bc02-6a3f-451e-b706-719149d51ce4",
"time": "2019-11-06T15:50:53.187Z",
"message": "java.lang.NullPointerException",
"level": 40000,
"file": {
"name": "file2.txt"
}
}

The same way we can report all the rest test items.

Finish root(suite) item

Finishing root item can be done the same way as finish parent item and finish child item. But we should specify its uuid in request parameter.

curl --header "Content-Type: application/json" \
--header "Authorization: Bearer 039eda00-b397-4a6b-bab1-b1a9a90376d1" \
--request PUT \
--data '{"endTime":"1574423247000","launchUuid":"96d1bc02-6a3f-451e-b706-719149d51ce4"}' \
http://rp.com/api/v1/rp_project/item/1e183148-c79f-493a-a615-2c9a888cb441
{
"endTime": "1574423247000",
"launchUuid": "96d1bc02-6a3f-451e-b706-719149d51ce4"
}

Finish launch

When we finished all test items, it's time to finish launch. Endpoint:

PUT /api/{version}/{projectName}/launch/{launchUuid}/finish

Finish request model:

AttributeRequiredDescriptionDefault valueExamples
endTimeYesLaunch end time-2019-11-22T11:47:01+00:00 (ISO 8601); Fri, 22 Nov 2019 11:47:01 +0000 (RFC 822, 1036, 1123, 2822); 2019-11-22T11:47:01+00:00 (RFC 3339); 1574423221000 (Unix Timestamp)
statusNoLaunch status. Allowable values: "passed", "failed", "stopped", "skipped", "interrupted", "cancelled"calculated from children test itemsfailed
descriptionNoLaunch description. Overrides description on startemptyservice test
attributesNoLaunch attributes. Pairs of key and value. Overrides attributes on startempty

Finish response model

AttributeRequiredDescriptionExample
idYesLaunch UUID6f084c4d-edb5-4691-90ba-d9e819ba61ba
number (*)NoLaunch number1
link (*)NoUI link to launchhttp://rp.com/ui/#rp_project/launches/all/73336

(*) - In case async endpoint field is missing or empty

Full request:

curl --header "Content-Type: application/json" \
--header "Authorization: Bearer 039eda00-b397-4a6b-bab1-b1a9a90376d1" \
--request PUT \
--data '{"endTime":"1574423255000"}' \
http://rp.com/api/v1/rp_project/launch/96d1bc02-6a3f-451e-b706-719149d51ce4/finish

Where body is:

{
"endTime": "1574423255000"
}

Example

Example using bash yo can find here

- - + + \ No newline at end of file diff --git a/dev-guides/RerunDevelopersGuide/index.html b/dev-guides/RerunDevelopersGuide/index.html index 5ca2588a5..e882472c6 100644 --- a/dev-guides/RerunDevelopersGuide/index.html +++ b/dev-guides/RerunDevelopersGuide/index.html @@ -12,15 +12,15 @@ - - + +
-

Rerun developers guide

What is rerun

Let's imagine we have some set of tests:

After run we can see few failed items:

We are fixing issues and want to launch tests again. But running all the tests can take a lot of time. So it would be better to run only failed tests from previous launch.

Now we have the following:

So what do we have here? Two launches with the same tests that was just be started again, but they are have difference in passed and failed items. And it is hard to find which test was fixed and which was not.

The main idea of reruns is to restart the same launch and trace changes between them not creating new launch every time.

Let's try to report the same launches using rerun.

We have only one launch with last run data

On the step view we can see that items with names getActivitiesForProject, getActivityPositive and getTestITemActivitiesPositive have retries. Items getActivityPositive and getTestITemActivitiesPositive was fixed and getActivitiesForProject is still failing.

How to start rerun

Latest launch

Using API

To start launch rerun you should call default start launch endpoint adding "rerun"=true parameter in the request body.

{
"name": "launch_name",
"description": "some description",
"mode": "DEFAULT",
"rerun": true
}

And response will contain found launch id for asynchronous endpoint or id and number for synchronous.

{
"id": "89f6d409-bee0-428e-baca-4848f86c06e7",
"number": 4
}

Using agent

To start launch rerun add rp.rerun=true to reportportal.properties file. No need to change anything else(name, project, etc.).

rp.endpoint=https://rp.com
rp.apiKey=caccb4bd-f6e7-48f2-af3a-eca0f566b3bd
rp.launch=rerun_test_example
rp.project=reporting-test
rp.reporting.async=true
rp.rerun=true

Handling

System tries to find the latest launch on the project with same name as in request.

If launch found - system updates the following attributes (if they are present in request and they are different from stored):

  • Mode
  • Description
  • Attributes
  • UUID
  • Status = IN_PROGRESS

If system cannot find launch with the same name - system throws error with 404 code.

Specified launch

Using API

To start launch rerun you should call default start launch endpoint adding "rerun"=true and "rerunOf"=launch_uuid parameters in the request body. Where launch_uuid is UUID of launch that have to be reruned.

{
"name": "launch_name",
"description": "some description",
"mode": "DEFAULT",
"rerun": true,
"rerunOf": "79446272-a439-45f9-8073-5ca7869f140b"
}

And response will contain found launch id for asynchronous endpoint or id and number for synchronous.

{
"id": "79446272-a439-45f9-8073-5ca7869f140b",
"number": 4
}

Using agent

To start launch rerun set rp.rerun=true and rp.rerun.of=launch_uuid in reportportal.properties file. Where launch_uuid is UUID of launch that have to be reruned.

rp.endpoint=https://rp.com
rp.apiKey=caccb4bd-f6e7-48f2-af3a-eca0f566b3bd
rp.launch=rerun_test_example
rp.project=reporting-test
rp.reporting.async=true
rp.rerun=true
rp.rerun.of=79446272-a439-45f9-8073-5ca7869f140b

Where 79446272-a439-45f9-8073-5ca7869f140b is UUID of desired launch.

Handling

The same as for specified launch.

Test Items behavior

There are no differences in API calls for starting and finishing items inside rerun launch. But such items handling is different.

Container types (has children)

System tries to find item with the same name, set of parameters and under the same path.

If such item found - the following attributes will be updated:

  • Description
  • UUID
  • Status = IN_PROGRESS

If not - new item will be created.

Step types (without children)

System tries to find item with the same name, set of parameters and under the same path.

If such item found - retry of the item will be created.

If not - new item will be created.

Example

You can try to rerun launch here

- - +

Rerun developers guide

What is rerun

Let's imagine we have some set of tests:

After run we can see few failed items:

We are fixing issues and want to launch tests again. But running all the tests can take a lot of time. So it would be better to run only failed tests from previous launch.

Now we have the following:

So what do we have here? Two launches with the same tests that was just be started again, but they are have difference in passed and failed items. And it is hard to find which test was fixed and which was not.

The main idea of reruns is to restart the same launch and trace changes between them not creating new launch every time.

Let's try to report the same launches using rerun.

We have only one launch with last run data

On the step view we can see that items with names getActivitiesForProject, getActivityPositive and getTestITemActivitiesPositive have retries. Items getActivityPositive and getTestITemActivitiesPositive was fixed and getActivitiesForProject is still failing.

How to start rerun

Latest launch

Using API

To start launch rerun you should call default start launch endpoint adding "rerun"=true parameter in the request body.

{
"name": "launch_name",
"description": "some description",
"mode": "DEFAULT",
"rerun": true
}

And response will contain found launch id for asynchronous endpoint or id and number for synchronous.

{
"id": "89f6d409-bee0-428e-baca-4848f86c06e7",
"number": 4
}

Using agent

To start launch rerun add rp.rerun=true to reportportal.properties file. No need to change anything else(name, project, etc.).

rp.endpoint=https://rp.com
rp.apiKey=caccb4bd-f6e7-48f2-af3a-eca0f566b3bd
rp.launch=rerun_test_example
rp.project=reporting-test
rp.reporting.async=true
rp.rerun=true

Handling

System tries to find the latest launch on the project with same name as in request.

If launch found - system updates the following attributes (if they are present in request and they are different from stored):

  • Mode
  • Description
  • Attributes
  • UUID
  • Status = IN_PROGRESS

If system cannot find launch with the same name - system throws error with 404 code.

Specified launch

Using API

To start launch rerun you should call default start launch endpoint adding "rerun"=true and "rerunOf"=launch_uuid parameters in the request body. Where launch_uuid is UUID of launch that have to be reruned.

{
"name": "launch_name",
"description": "some description",
"mode": "DEFAULT",
"rerun": true,
"rerunOf": "79446272-a439-45f9-8073-5ca7869f140b"
}

And response will contain found launch id for asynchronous endpoint or id and number for synchronous.

{
"id": "79446272-a439-45f9-8073-5ca7869f140b",
"number": 4
}

Using agent

To start launch rerun set rp.rerun=true and rp.rerun.of=launch_uuid in reportportal.properties file. Where launch_uuid is UUID of launch that have to be reruned.

rp.endpoint=https://rp.com
rp.apiKey=caccb4bd-f6e7-48f2-af3a-eca0f566b3bd
rp.launch=rerun_test_example
rp.project=reporting-test
rp.reporting.async=true
rp.rerun=true
rp.rerun.of=79446272-a439-45f9-8073-5ca7869f140b

Where 79446272-a439-45f9-8073-5ca7869f140b is UUID of desired launch.

Handling

The same as for specified launch.

Test Items behavior

There are no differences in API calls for starting and finishing items inside rerun launch. But such items handling is different.

Container types (has children)

System tries to find item with the same name, set of parameters and under the same path.

If such item found - the following attributes will be updated:

  • Description
  • UUID
  • Status = IN_PROGRESS

If not - new item will be created.

Step types (without children)

System tries to find item with the same name, set of parameters and under the same path.

If such item found - retry of the item will be created.

If not - new item will be created.

Example

You can try to rerun launch here

+ + \ No newline at end of file diff --git a/dev-guides/RetriesReporting/index.html b/dev-guides/RetriesReporting/index.html index 2a488fdda..6d4cc2e29 100644 --- a/dev-guides/RetriesReporting/index.html +++ b/dev-guides/RetriesReporting/index.html @@ -12,21 +12,21 @@ - - + +
-

Retries reporting

Some frameworks allow to retry Test execution according to provided conditions (TestNG) or just retry it predefined number of times. +

Retries reporting

Some frameworks allow to retry Test execution according to provided conditions (TestNG) or just retry it predefined number of times. First execution is a simple TestItem and next ones are called Retries. In ReportPortal these items are grouped and displayed as a sequence of executions for the same Test:

When you click on the retries link you can switch between Retries and see their logs:

On the Log view you can also switch between Retries:

Retries reporting

Common child Test item request (check reporting dev guide) looks like:

curl --header "Content-Type: application/json" \
--header "Authorization: Bearer 039eda00-b397-4a6b-bab1-b1a9a90376d1" \
--request POST \
--data '{"name":"example step","startTime":"1574423237000","type":"step","launchUuid":"<launch uuid>","description":"Item that should be retried"}' \
http://rp.com/api/v1/rp_project/item/<parent uuid>

With body:

{
"name": "example step",
"startTime": "1574423237000",
"type": "step",
"launchUuid": "<launch uuid>",
"description": "Item that should be retried"
}

And response:

{
"id": "uuid-of-the-first-step"
}

Request for a retry looks the same, but has field retry=true:

{
"name": "example step",
"startTime": "1574423237100",
"type": "step",
"launchUuid": "<launch uuid>",
"description": "Item that should be retried",
"retry": true
}

To be displayed as a retry reported Test item should have the same name, parentUuid, launchUuid and uniqueId (if you provided it explicitly). If one of mentioned fields is not matched (for example Test item with the same name but different uniqueId and vise versa) Test items won't be grouped as retries. Also Test item with type Suite cannot be reported as a retry.

Retries handling triggered only if Test item has retry=true flag in the request. For example:

First request will trigger retries handling, but if it's the first reported Test item it won't be a retry:

{
"name": "example step",
"startTime": "1574423237100",
"type": "step",
"launchUuid": "<launch uuid>",
"description": "Item that should be retried",
"retry": true
}

Second request won't trigger retries handling, because retry=false is specified (or this field isn't provided) in the request:

{
"name": "example step",
"startTime": "1574423237100",
"type": "step",
"launchUuid": "<launch uuid>",
"description": "Item that should be retried",
"retry": false
}

As a result 2 separate Test items will be displayed, so ORDER of sent requests matters (if send this items in reversed order they will be grouped as retries).

In ReportPortal the only Test item from the Retries group that has statistics and can have an issue attached is the one with max startTime. In previous requests startTime was 1574423237000 for the first one and 1574423237100 for the second one, so the second one is a 'main' Test Item with statistics and issue (if attached).

- - + + \ No newline at end of file diff --git a/features/AIFailureReasonDetection/index.html b/features/AIFailureReasonDetection/index.html index 38fc43e37..fc97101d1 100644 --- a/features/AIFailureReasonDetection/index.html +++ b/features/AIFailureReasonDetection/index.html @@ -12,15 +12,15 @@ - - + +
-

AI-based failure reason detection

In the realm of test automation, failure analysis often becomes a bottleneck, consuming valuable time and resources. ReportPortal introduces a game-changing solution with its AI-powered failure reason detection feature. Employing advanced Machine Learning (ML) algorithms, this feature streamlines your test processes, enabling quicker, more accurate results.

Unlocking Efficiency through Automation

Running daily regression tests can be a double-edged sword: they're essential for maintaining a robust application, but they also generate an avalanche of test results that need analysis. The good news? ReportPortal's AI algorithms take over this repetitive task, automatically categorizing test failures according to their root cause. As a result, your team can shift their focus to newly emerged issues, substantially cutting down the time spent on manual triage.

Speed and Precision in Defect Identification

The power of AI doesn't stop at handling daily jobs; it extends to making your defect identification process lightning-fast and razor-sharp. ReportPortal's Auto-Analysis feature scans through test results, logs, and other associated data to quickly pinpoint failures and automatically tag them with defect types. This efficiency enables your team to discover a maximum number of bugs in minimal time, supercharging your QA process.

Elevated Accuracy in Failure Classification

Human error is an inevitable part of any process, particularly one as monotonous as going through lines of test logs. ReportPortal's AI-driven approach minimizes this risk. By automating the classification of test failures, it not only eliminates manual errors but also adds an extra layer of precision that even the most experienced testers might miss.

ReportPortal's AI functionality comes in three distinct forms to accommodate various testing needs:

  • Analyzer: This feature automatically classifies test failures, sparing your team the manual labor of sifting through results. Utilizing advanced algorithms, the Analyzer categorizes different types of test failures, so you can prioritize issues that need immediate attention.
  • Unique Error: This tool groups identical test failures together for accelerated bulk analysis. By clustering similar failures, Unique Error allows for more efficient troubleshooting and quicker resolution of recurring issues.
  • ML-Based Suggestions: Leveraging machine learning algorithms, this feature provides suggestions for failures that are most similar to ones you've encountered before while do manual analysis. The suggestions guide your team in identifying the root causes of test failures more accurately and swiftly.

Conclusion: A Smarter Way to Test

AI-based failure reason detection is more than just a flashy feature. First deployed in production in 2016, long before the hype cycle surrounding GenAI technology. It's a strategic asset that enhances team productivity and the reliability of your applications. By automating the most cumbersome aspects of test analysis, ReportPortal frees up your team to focus on what truly matters: delivering high-quality software.

Embrace the future of test automation with ReportPortal's AI capabilities and give your team the edge they've been waiting for.

- - +

AI-based failure reason detection

In the realm of test automation, failure analysis often becomes a bottleneck, consuming valuable time and resources. ReportPortal introduces a game-changing solution with its AI-powered failure reason detection feature. Employing advanced Machine Learning (ML) algorithms, this feature streamlines your test processes, enabling quicker, more accurate results.

Unlocking Efficiency through Automation

Running daily regression tests can be a double-edged sword: they're essential for maintaining a robust application, but they also generate an avalanche of test results that need analysis. The good news? ReportPortal's AI algorithms take over this repetitive task, automatically categorizing test failures according to their root cause. As a result, your team can shift their focus to newly emerged issues, substantially cutting down the time spent on manual triage.

Speed and Precision in Defect Identification

The power of AI doesn't stop at handling daily jobs; it extends to making your defect identification process lightning-fast and razor-sharp. ReportPortal's Auto-Analysis feature scans through test results, logs, and other associated data to quickly pinpoint failures and automatically tag them with defect types. This efficiency enables your team to discover a maximum number of bugs in minimal time, supercharging your QA process.

Elevated Accuracy in Failure Classification

Human error is an inevitable part of any process, particularly one as monotonous as going through lines of test logs. ReportPortal's AI-driven approach minimizes this risk. By automating the classification of test failures, it not only eliminates manual errors but also adds an extra layer of precision that even the most experienced testers might miss.

ReportPortal's AI functionality comes in three distinct forms to accommodate various testing needs:

  • Analyzer: This feature automatically classifies test failures, sparing your team the manual labor of sifting through results. Utilizing advanced algorithms, the Analyzer categorizes different types of test failures, so you can prioritize issues that need immediate attention.
  • Unique Error: This tool groups identical test failures together for accelerated bulk analysis. By clustering similar failures, Unique Error allows for more efficient troubleshooting and quicker resolution of recurring issues.
  • ML-Based Suggestions: Leveraging machine learning algorithms, this feature provides suggestions for failures that are most similar to ones you've encountered before while do manual analysis. The suggestions guide your team in identifying the root causes of test failures more accurately and swiftly.

Conclusion: A Smarter Way to Test

AI-based failure reason detection is more than just a flashy feature. First deployed in production in 2016, long before the hype cycle surrounding GenAI technology. It's a strategic asset that enhances team productivity and the reliability of your applications. By automating the most cumbersome aspects of test analysis, ReportPortal frees up your team to focus on what truly matters: delivering high-quality software.

Embrace the future of test automation with ReportPortal's AI capabilities and give your team the edge they've been waiting for.

+ + \ No newline at end of file diff --git a/features/CategorisationOfFailures/index.html b/features/CategorisationOfFailures/index.html index 0c11c49f6..fd4db3133 100644 --- a/features/CategorisationOfFailures/index.html +++ b/features/CategorisationOfFailures/index.html @@ -12,15 +12,15 @@ - - + +
-

Categorization of failures based on issue roots

In the realm of software development and QA, test failure analysis isn't just a task—it's a critical practice. The way we categorize test failures informs not only the testing process but also how quickly and efficiently developers can resolve issues. ReportPortal provides an advanced, feature-rich environment for streamlined failure categorization, which is an integral part of any agile development cycle.

Navigate to the 'Launches' tab in ReportPortal and you'll find an intuitive breakdown of your test executions, displaying Total, Passed, Failed, and Skipped test cases. What sets ReportPortal apart is its pre-categorized issues like Product Bug, Automation Bug, and System Issue. This leaves your team with a focused subset of items marked “To Investigate.”

The Process of Intelligent Triage

When you open one of these “To Investigate” items, a QA engineer engages in defect triage by reviewing logs, screenshots, and video recordings, all of which are seamlessly integrated into each failed test item. Based on this comprehensive analysis, the engineer categorizes the failures through the “Make Decision” modal, as follows:

  • Product Bug: These issues stem from flaws in the application code and should be the developers' first priority for resolution.
  • Automation Bug: This category addresses issues related to test data, such as outdated tests or incorrect data, and timeouts.
  • System Issue: Failures in this category usually result from an unstable testing environment or issues with third-party software.
  • Not a Defect: Use this classification for tests that have been resolved or manually validated.

The Takeaways

Intelligent categorization with ReportPortal serves several essential functions:

1. Root Cause Analysis: The key question remains: Was the failure caused by an issue within the software, or was it an external factor? With access to detailed logs, screenshots, and video, pinpointing the root cause becomes a far more efficient process.

2. Functional Area Identification: Categorizing failures often reveals which area of the application is prone to issues, allowing for targeted remediation.

3. Severity Assessment: Understanding the severity of a failure is critical. Is it an application issue that mandates postponing deployment, or is it a lesser issue that can be prioritized accordingly?

In summary, the intelligent test failure categorization offered by ReportPortal is a cornerstone for delivering high-quality products swiftly and effectively.

- - +

Categorization of failures based on issue roots

In the realm of software development and QA, test failure analysis isn't just a task—it's a critical practice. The way we categorize test failures informs not only the testing process but also how quickly and efficiently developers can resolve issues. ReportPortal provides an advanced, feature-rich environment for streamlined failure categorization, which is an integral part of any agile development cycle.

Navigate to the 'Launches' tab in ReportPortal and you'll find an intuitive breakdown of your test executions, displaying Total, Passed, Failed, and Skipped test cases. What sets ReportPortal apart is its pre-categorized issues like Product Bug, Automation Bug, and System Issue. This leaves your team with a focused subset of items marked “To Investigate.”

The Process of Intelligent Triage

When you open one of these “To Investigate” items, a QA engineer engages in defect triage by reviewing logs, screenshots, and video recordings, all of which are seamlessly integrated into each failed test item. Based on this comprehensive analysis, the engineer categorizes the failures through the “Make Decision” modal, as follows:

  • Product Bug: These issues stem from flaws in the application code and should be the developers' first priority for resolution.
  • Automation Bug: This category addresses issues related to test data, such as outdated tests or incorrect data, and timeouts.
  • System Issue: Failures in this category usually result from an unstable testing environment or issues with third-party software.
  • Not a Defect: Use this classification for tests that have been resolved or manually validated.

The Takeaways

Intelligent categorization with ReportPortal serves several essential functions:

1. Root Cause Analysis: The key question remains: Was the failure caused by an issue within the software, or was it an external factor? With access to detailed logs, screenshots, and video, pinpointing the root cause becomes a far more efficient process.

2. Functional Area Identification: Categorizing failures often reveals which area of the application is prone to issues, allowing for targeted remediation.

3. Severity Assessment: Understanding the severity of a failure is critical. Is it an application issue that mandates postponing deployment, or is it a lesser issue that can be prioritized accordingly?

In summary, the intelligent test failure categorization offered by ReportPortal is a cornerstone for delivering high-quality products swiftly and effectively.

+ + \ No newline at end of file diff --git a/features/QualityGates/index.html b/features/QualityGates/index.html index 54b8d06fa..b1199add4 100644 --- a/features/QualityGates/index.html +++ b/features/QualityGates/index.html @@ -12,15 +12,15 @@ - - + +
-

Quality Gates

Quality Gates is a feature thanks to which ReportPortal becomes an integral part of continuous testing platform. It prevents the code from moving forward if it doesn’t meet testing criteria. ReportPortal uses aggregated data and rule engine to verify testing results against required conditions.

Top-3 benefits of Quality Gates:

Increased Speed and Efficiency

Automated GO / NO-GO decisions enable quick decision-making by instantly evaluating whether a particular build or code change meets the predefined quality criteria while tested. This eliminates the need for manual reviews at various stages of the process, allowing teams to release software more quickly and efficiently and avoid delays and human error.

Improved Consistency and Reliability

By setting standardized quality criteria, automated quality gates ensure that each code change adheres to the same high-quality standards. This consistency helps to reduce the likelihood of defects and errors, making the end product more reliable and robust.

Enhanced Collaboration and Accountability

Automated quality gates provide immediate, objective feedback that is accessible to all team members, from developers to QA to management. This shared understanding of what constitutes "quality" improves collaboration and holds everyone accountable for the quality of the software.

In summary, Quality Gates are an essential feature in ReportPortal that helps to understand the quality of your product and make release decisions.

- - +

Quality Gates

Quality Gates is a feature thanks to which ReportPortal becomes an integral part of continuous testing platform. It prevents the code from moving forward if it doesn’t meet testing criteria. ReportPortal uses aggregated data and rule engine to verify testing results against required conditions.

Top-3 benefits of Quality Gates:

Increased Speed and Efficiency

Automated GO / NO-GO decisions enable quick decision-making by instantly evaluating whether a particular build or code change meets the predefined quality criteria while tested. This eliminates the need for manual reviews at various stages of the process, allowing teams to release software more quickly and efficiently and avoid delays and human error.

Improved Consistency and Reliability

By setting standardized quality criteria, automated quality gates ensure that each code change adheres to the same high-quality standards. This consistency helps to reduce the likelihood of defects and errors, making the end product more reliable and robust.

Enhanced Collaboration and Accountability

Automated quality gates provide immediate, objective feedback that is accessible to all team members, from developers to QA to management. This shared understanding of what constitutes "quality" improves collaboration and holds everyone accountable for the quality of the software.

In summary, Quality Gates are an essential feature in ReportPortal that helps to understand the quality of your product and make release decisions.

+ + \ No newline at end of file diff --git a/features/RESTAPI/index.html b/features/RESTAPI/index.html index 761c6886f..6719970fa 100644 --- a/features/RESTAPI/index.html +++ b/features/RESTAPI/index.html @@ -12,15 +12,15 @@ - - + +
-

REST API

ReportPortal offers a robust set of features through its REST API, covering test data, user data, project data, statistics, integrations, and more.

The REST API can be particularly useful for those looking to:

  • Implement own reporter and integrate it with a custom testing framework or runner.
  • Retrieve data from ReportPortal for custom reports or integration with third-party systems.
  • Enhance functionality and develop add-ons.

Here are the examples of how REST API can be helpful, including:

1. Creating/updating test results, test runs, logs, adding attachments, and comments, and other information as attributes. It improves the testing process in general by supplying more context and information about the test results.

2. Integration with test management tools (Jira, TestRail, and others). It allows to collect and manage test results and other data in one place.

3. Integration with bug tracking systems (Jira Server, Jira Cloud, Azure DevOps, Rally, and others). This makes it possible to easily track issues.

4. Integration with CI/CD pipelines (Jenkins, Travis CI, TeamCity, and others) for the real-time test results, faster feedback and quicker release cycles.

5. Integration with other systems like Data Mart (Microsoft Dynamics, Power BI, Vertica). They serve for extensive data analysis.

6. Custom integration. With REST API, you can create your own extensions. For example, if here there is no integration with specific test framework that you need, you can make any integration using API.

Generally, REST API can be used for getting the most out of the test automation reporting tools such as ReportPortal and for the extension of capabilities. REST API allows to track and manage bugs in one central area, to design unique reports and dashboards that might offer insightful data and assist teams in making better decisions regarding the testing process.

- - +

REST API

ReportPortal offers a robust set of features through its REST API, covering test data, user data, project data, statistics, integrations, and more.

The REST API can be particularly useful for those looking to:

  • Implement own reporter and integrate it with a custom testing framework or runner.
  • Retrieve data from ReportPortal for custom reports or integration with third-party systems.
  • Enhance functionality and develop add-ons.

Here are the examples of how REST API can be helpful, including:

1. Creating/updating test results, test runs, logs, adding attachments, and comments, and other information as attributes. It improves the testing process in general by supplying more context and information about the test results.

2. Integration with test management tools (Jira, TestRail, and others). It allows to collect and manage test results and other data in one place.

3. Integration with bug tracking systems (Jira Server, Jira Cloud, Azure DevOps, Rally, and others). This makes it possible to easily track issues.

4. Integration with CI/CD pipelines (Jenkins, Travis CI, TeamCity, and others) for the real-time test results, faster feedback and quicker release cycles.

5. Integration with other systems like Data Mart (Microsoft Dynamics, Power BI, Vertica). They serve for extensive data analysis.

6. Custom integration. With REST API, you can create your own extensions. For example, if here there is no integration with specific test framework that you need, you can make any integration using API.

Generally, REST API can be used for getting the most out of the test automation reporting tools such as ReportPortal and for the extension of capabilities. REST API allows to track and manage bugs in one central area, to design unique reports and dashboards that might offer insightful data and assist teams in making better decisions regarding the testing process.

+ + \ No newline at end of file diff --git a/features/RealTimeReporting/index.html b/features/RealTimeReporting/index.html index 16b5e00bc..919dfba8f 100644 --- a/features/RealTimeReporting/index.html +++ b/features/RealTimeReporting/index.html @@ -12,15 +12,15 @@ - - + +
-

Real-time reporting

Real-time test reporting provides the most current data without delay. Thanks to near real-time capabilities, you can receive the first test results in a matter of seconds after the execution has started and benefit from the advantage of getting the entire execution results before it is completed.

Real-time reporting in ReportPortal comes with three main advantages:

Saving time on early reaction and Early Defect Identification

With test case results and logs appearing in ReportPortal in real-time, teams can begin triaging issues immediately. This not only saves time but also allows for early identification of defects, leading to quicker resolutions and improved code quality.

At the same time, you can save time and effort with manual re-testing of failed test cases, while the entire execution is still on the go.

Maximized Testing Efficiency for Large Regressions

For extensive regression tests that may take several hours to complete, real-time reporting ensures that teams don't have to wait until the end to start analyzing results. They can begin the analysis while the rest of the tests are still running, thereby making optimal use of time and resources.

Streamlined Workflow with Continuous Feedback:

The real-time nature of the reporting enables a continuous feedback loop among testers, developers, and other stakeholders. This makes it easier to implement changes on the fly and ensures that everyone stays informed, reducing the likelihood of surprises at the end of the regression cycle.

Overall, real-time reporting provides easy access to test results as soon as they are generated, allows to quickly identify issues and make decisions, reduces costs by preventing similar issues and ensures effective communication between team and stakeholders.

- - +

Real-time reporting

Real-time test reporting provides the most current data without delay. Thanks to near real-time capabilities, you can receive the first test results in a matter of seconds after the execution has started and benefit from the advantage of getting the entire execution results before it is completed.

Real-time reporting in ReportPortal comes with three main advantages:

Saving time on early reaction and Early Defect Identification

With test case results and logs appearing in ReportPortal in real-time, teams can begin triaging issues immediately. This not only saves time but also allows for early identification of defects, leading to quicker resolutions and improved code quality.

At the same time, you can save time and effort with manual re-testing of failed test cases, while the entire execution is still on the go.

Maximized Testing Efficiency for Large Regressions

For extensive regression tests that may take several hours to complete, real-time reporting ensures that teams don't have to wait until the end to start analyzing results. They can begin the analysis while the rest of the tests are still running, thereby making optimal use of time and resources.

Streamlined Workflow with Continuous Feedback:

The real-time nature of the reporting enables a continuous feedback loop among testers, developers, and other stakeholders. This makes it easier to implement changes on the fly and ensures that everyone stays informed, reducing the likelihood of surprises at the end of the regression cycle.

Overall, real-time reporting provides easy access to test results as soon as they are generated, allows to quickly identify issues and make decisions, reduces costs by preventing similar issues and ensures effective communication between team and stakeholders.

+ + \ No newline at end of file diff --git a/features/RichArtifactsInTestReports/index.html b/features/RichArtifactsInTestReports/index.html index 37ca7cf6f..abc6df5a1 100644 --- a/features/RichArtifactsInTestReports/index.html +++ b/features/RichArtifactsInTestReports/index.html @@ -12,15 +12,15 @@ - - + +
-

Rich artifacts in test reports

Test execution report in ReportPortal may contain extra details in addition to the standard test results (passed/failed status).

These additional artifacts in test reports can consist of:

1. Logs.

Logs can include error messages that are very helpful for test failure analysis. With logs, it is possible to understand the root cause and set the defect type properly.

2. Screenshots.

You can see the image of the data displayed on the screen during the test run. Screenshots make the debugging process easier and may give insights into why this issue occurred.

3. Video recordings.

Logs in ReportPortal can have video recordings attached as well. A video shows the exact screen states. Using this artifact, you will be able to troubleshoot problems more quickly.

Besides, ReportPortal also supports integration with Sauce Labs via corresponding plugin so that it is possible to watch videos of test executions right in the ReportPortal.

4. Network traffic.

These are details about the network calls performed while the test was running (requests and responses).

You can send all the artifacts to ReportPortal as attachments and use them to simplify defect triage, to replicate and debug issues, to find performance and network-related issues, to comprehend the context in which certain problems occurred.

- - +

Rich artifacts in test reports

Test execution report in ReportPortal may contain extra details in addition to the standard test results (passed/failed status).

These additional artifacts in test reports can consist of:

1. Logs.

Logs can include error messages that are very helpful for test failure analysis. With logs, it is possible to understand the root cause and set the defect type properly.

2. Screenshots.

You can see the image of the data displayed on the screen during the test run. Screenshots make the debugging process easier and may give insights into why this issue occurred.

3. Video recordings.

Logs in ReportPortal can have video recordings attached as well. A video shows the exact screen states. Using this artifact, you will be able to troubleshoot problems more quickly.

Besides, ReportPortal also supports integration with Sauce Labs via corresponding plugin so that it is possible to watch videos of test executions right in the ReportPortal.

4. Network traffic.

These are details about the network calls performed while the test was running (requests and responses).

You can send all the artifacts to ReportPortal as attachments and use them to simplify defect triage, to replicate and debug issues, to find performance and network-related issues, to comprehend the context in which certain problems occurred.

+ + \ No newline at end of file diff --git a/features/UnifiedTestReporting/index.html b/features/UnifiedTestReporting/index.html index b94c5065b..9ac1af26d 100644 --- a/features/UnifiedTestReporting/index.html +++ b/features/UnifiedTestReporting/index.html @@ -12,15 +12,15 @@ - - + +
-

Single-entry point and unified test reporting

ReportPortal was created with the idea in mind to be a single tool to acquire and aggregate the results of all automated tests for projects. Our centralized test automation tool is a great focus area for managers and test engineers because all test results can be accessed, reviewed and analyzed in one place.

In the complex landscape of software testing, where multiple test frameworks, languages, and types of tests often coexist, the sheer volume and diversity of test reports can be overwhelming. ReportPortal addresses this problem elegantly by serving as a single-entry point for all test reports, providing unified and consolidated insights across the board. This single point of truth offers a multitude of benefits that can transform the way your team approaches testing.

Unification and Standardization

ReportPortal is designed to unify reports from various test frameworks and languages, whether they are API tests, integration tests, or end-to-end tests. It takes these disparate reports and presents them in a standardized format, making them equally understandable to QA engineers, developers, and even DevOps teams. This eliminates the need for engineers to scour multiple platforms for hidden reports, thereby reducing confusion and promoting efficiency.

Streamlined Collaboration

With a single link, you can direct team members to a central location where test results are not just collected but also analyzed. This facilitates collaboration by creating a universal language and understanding of test results across different team members, irrespective of their roles or technical proficiencies. The centralized reporting also aids in "Shift Left" testing approaches, where test feedback is made available earlier in the development cycle by Developers and not only QA Engineers.

Immediate Feedback and Quality Gate Integration

When combined with automated quality gates, the platform can provide instantaneous verdicts on whether code changes have passed or failed the tests. In the event of a failure, the platform's auto-analysis feature helps to pinpoint the exact cause. This real-time, automated feedback is invaluable in modern DevOps pipelines, accelerating the release process and enhancing code quality.

In summary, ReportPortal’s single-entry point for all test reports offers the unique advantage of consolidating, standardizing, and analyzing test data in one location. This unified approach significantly simplifies the testing process, fosters better collaboration, and enables more agile development cycles. Adopting ReportPortal is a strategic move toward a more efficient and streamlined testing environment.

- - +

Single-entry point and unified test reporting

ReportPortal was created with the idea in mind to be a single tool to acquire and aggregate the results of all automated tests for projects. Our centralized test automation tool is a great focus area for managers and test engineers because all test results can be accessed, reviewed and analyzed in one place.

In the complex landscape of software testing, where multiple test frameworks, languages, and types of tests often coexist, the sheer volume and diversity of test reports can be overwhelming. ReportPortal addresses this problem elegantly by serving as a single-entry point for all test reports, providing unified and consolidated insights across the board. This single point of truth offers a multitude of benefits that can transform the way your team approaches testing.

Unification and Standardization

ReportPortal is designed to unify reports from various test frameworks and languages, whether they are API tests, integration tests, or end-to-end tests. It takes these disparate reports and presents them in a standardized format, making them equally understandable to QA engineers, developers, and even DevOps teams. This eliminates the need for engineers to scour multiple platforms for hidden reports, thereby reducing confusion and promoting efficiency.

Streamlined Collaboration

With a single link, you can direct team members to a central location where test results are not just collected but also analyzed. This facilitates collaboration by creating a universal language and understanding of test results across different team members, irrespective of their roles or technical proficiencies. The centralized reporting also aids in "Shift Left" testing approaches, where test feedback is made available earlier in the development cycle by Developers and not only QA Engineers.

Immediate Feedback and Quality Gate Integration

When combined with automated quality gates, the platform can provide instantaneous verdicts on whether code changes have passed or failed the tests. In the event of a failure, the platform's auto-analysis feature helps to pinpoint the exact cause. This real-time, automated feedback is invaluable in modern DevOps pipelines, accelerating the release process and enhancing code quality.

In summary, ReportPortal’s single-entry point for all test reports offers the unique advantage of consolidating, standardizing, and analyzing test data in one location. This unified approach significantly simplifies the testing process, fosters better collaboration, and enables more agile development cycles. Adopting ReportPortal is a strategic move toward a more efficient and streamlined testing environment.

+ + \ No newline at end of file diff --git a/features/VisualisationOfTestResults/index.html b/features/VisualisationOfTestResults/index.html index 618df9870..e186dcc75 100644 --- a/features/VisualisationOfTestResults/index.html +++ b/features/VisualisationOfTestResults/index.html @@ -12,15 +12,15 @@ - - + +
-

Visualization of test data

ReportPortal's dynamic visualization capabilities provide teams with real-time insights, enabling them to make informed decisions quickly and efficiently.

Real-Time Dashboards and Widgets

One of ReportPortal's most compelling features is its real-time dashboards and widgets. These dashboards can be customized to focus on specific test executions or take a broader view at the build level by consolidating multiple executions. As your tests run, widgets update in real-time, ensuring your data is always current. This eliminates the cumbersome task of having to recreate reports for every testing cycle or regression.

Versatile Tracking

ReportPortal's widgets are designed to track essential metrics and trends in your test results. Whether you are interested in code coverage, performance metrics, or failure trends, there's a widget to help you monitor it. The real-time aspect ensures that any shifts in these metrics are immediately visible, allowing your team to adapt and respond more quickly than ever before.

Eye-Opening Insights

The platform goes beyond just displaying test results; it offers deep insights into the technical debt of your test automation. Widgets can break down test failures by different categories, such as environmental issues, automation errors, or actual product bugs. This classification empowers teams to understand where their efforts are most needed and helps them prioritize tasks effectively.

Demonstrating ROI of test automation

Perhaps the most critical advantage is the ability to highlight the return on investment (ROI) of your test automation. By showing the actual number of failures due to product bugs, ReportPortal makes it easier to quantify the value your testing is bringing to the overall project.

In conclusion, ReportPortal’s visualization capabilities offer real-time, customizable, and insightful views into your test data. These features not only save time but also provide teams with the insights needed to deliver better software, faster.

- - +

Visualization of test data

ReportPortal's dynamic visualization capabilities provide teams with real-time insights, enabling them to make informed decisions quickly and efficiently.

Real-Time Dashboards and Widgets

One of ReportPortal's most compelling features is its real-time dashboards and widgets. These dashboards can be customized to focus on specific test executions or take a broader view at the build level by consolidating multiple executions. As your tests run, widgets update in real-time, ensuring your data is always current. This eliminates the cumbersome task of having to recreate reports for every testing cycle or regression.

Versatile Tracking

ReportPortal's widgets are designed to track essential metrics and trends in your test results. Whether you are interested in code coverage, performance metrics, or failure trends, there's a widget to help you monitor it. The real-time aspect ensures that any shifts in these metrics are immediately visible, allowing your team to adapt and respond more quickly than ever before.

Eye-Opening Insights

The platform goes beyond just displaying test results; it offers deep insights into the technical debt of your test automation. Widgets can break down test failures by different categories, such as environmental issues, automation errors, or actual product bugs. This classification empowers teams to understand where their efforts are most needed and helps them prioritize tasks effectively.

Demonstrating ROI of test automation

Perhaps the most critical advantage is the ability to highlight the return on investment (ROI) of your test automation. By showing the actual number of failures due to product bugs, ReportPortal makes it easier to quantify the value your testing is bringing to the overall project.

In conclusion, ReportPortal’s visualization capabilities offer real-time, customizable, and insightful views into your test data. These features not only save time but also provide teams with the insights needed to deliver better software, faster.

+ + \ No newline at end of file diff --git a/index.html b/index.html index 8b4efabab..65077151d 100644 --- a/index.html +++ b/index.html @@ -12,18 +12,18 @@ - - + +
-

What is ReportPortal?

ReportPortal is a TestOps service, that provides increased capabilities to speed up results analysis and reporting through the use of built-in analytic features.

ReportPortal is a great addition to Continuous Integration and Continuous +

What is ReportPortal?

ReportPortal is a TestOps service, that provides increased capabilities to speed up results analysis and reporting through the use of built-in analytic features.

ReportPortal is a great addition to Continuous Integration and Continuous Testing process.

ReportPortal is distributed under the Apache v2.0 license, and it is free to use and modify, even for commercial purposes. We offer the only paid premium feature – Quality Gates.

If a company is interested in our services, we can provide support hours to deploy, integrate, configure, or customize the tool, as well as SaaS options.

What ReportPortal can do?

  • Mainstream platforms integration

ReportPortal seamlessly integrates with mainstream platforms such as Jenkins, Jira, BDD process, majority of Functional and Unit testing frameworks.

  • Real-time results

Real-time integration provides businesses the ability to manage and track execution status directly from the ReportPortal.

  • Test case execution results structure

Test case execution results are stored following the same structure you have in your reporting suites and test plan. The test cases are shown together with all related data in one place, right where you need it: logs, screenshots, binary data. The execution pipeline of certain test cases are also available for you, so one can see previous test execution report in one click.

  • Collaborative analysis

Our test report dashboard also gives you the ability to collaboratively analyze the test automation results and quickly get automation test report. Particular test cases can be associated with a product bug, an automation issue, a system issue or can be submitted as an issue ticket directly from the execution result.

  • Historical data of test execution

ReportPortal provides enhanced capabilities along with auto-results analysis by leveraging historical data of test execution.

  • Automatic Analysis

With each execution, ReportPortal automatically figures out the root cause of a fail. As a result of AI-based defects triage, ReportPortal is marking a test result with a flag. Engineers will be alerted about this issue to provide further analysis: if it has been resolved already or which test results require actual human analysis.

What technologies are used?

Considering a high load rate and performance requirements, we use cutting edge technologies such as:

  • PostgreSQL - The World's Most Advanced Open Source Relational Database.

  • REST Web Service - lightweight requests, industry standard.

  • Mobile responsive UI - check it at any mobile device with the default browser.

Benefits of report automation with ReportPortal

Report automation is the procedure by which reports are routinely and automatically refreshed.

  • Speedy decision-making

Report automation is an effective technique to provide information that is essential to business operations. Delivering crucial information to the appropriate people at the appropriate time becomes considerably quicker and simpler by automatically generated reports. It allows to get business faster insights and drive better decisions.

  • Accurate data

In ReportPortal, you have fully real-time analytic report automation. Since the reports are automatically generated, you are insured against human error when reports are generated manually.

  • Advanced reporting

ReportPortal offers widgets with a user-friendly visual interface to create interactive reports for all your needs. For example, you can build qa metrics dashboard using Overall statistics, Unique bugs table, Passing rate summary widgets.

  • Easily running CI/CD tests

ReportPortal is CI/CD agnostic tool solution. You can use any CI environment to run automated tests to improve quality of product by catching issues early in development lifecycle.

- - + + \ No newline at end of file diff --git a/installation-steps/AdditionalConfigurationParameters/index.html b/installation-steps/AdditionalConfigurationParameters/index.html index 7dcedb487..f470c425d 100644 --- a/installation-steps/AdditionalConfigurationParameters/index.html +++ b/installation-steps/AdditionalConfigurationParameters/index.html @@ -12,15 +12,15 @@ - - + +
-

Additional configuration parameters

Configuration parameterDefault ValueServiceDescription
RP_PROFILES-API,UATSpecifies application settings profiles. Should be set to 'docker'
RP_SESSION_LIVE3600UATSession token live time in seconds
RP_SERVER_PORT8080UIUI service port
POSTGRES_SERVERpostgresAPI,UAT,MIGRATIONSPostgreSQL host
POSTGRES_PORT5432API,UAT,MIGRATIONSPostgreSQL port
POSTGRES_USERrpuserAPI,UAT,MIGRATIONSPostgreSQL user name
POSTGRES_PASSWORDrppassAPI,UAT,MIGRATIONSPostgreSQL user password
POSTGRES_DBreportportalAPI,UAT,MIGRATIONSPostgreSQL database name
RABBITMQ_DEFAULT_USERrabbitmqAPI,ANALYZERPostgreSQL database name
RABBITMQ_DEFAULT_PASSrabbitmqAPI,ANALYZERPostgreSQL database name

Example of docker compose with filled out configuration parameters can be found here.

- - +

Additional configuration parameters

Configuration parameterDefault ValueServiceDescription
RP_PROFILES-API,UATSpecifies application settings profiles. Should be set to 'docker'
RP_SESSION_LIVE3600UATSession token live time in seconds
RP_SERVER_PORT8080UIUI service port
POSTGRES_SERVERpostgresAPI,UAT,MIGRATIONSPostgreSQL host
POSTGRES_PORT5432API,UAT,MIGRATIONSPostgreSQL port
POSTGRES_USERrpuserAPI,UAT,MIGRATIONSPostgreSQL user name
POSTGRES_PASSWORDrppassAPI,UAT,MIGRATIONSPostgreSQL user password
POSTGRES_DBreportportalAPI,UAT,MIGRATIONSPostgreSQL database name
RABBITMQ_DEFAULT_USERrabbitmqAPI,ANALYZERPostgreSQL database name
RABBITMQ_DEFAULT_PASSrabbitmqAPI,ANALYZERPostgreSQL database name

Example of docker compose with filled out configuration parameters can be found here.

+ + \ No newline at end of file diff --git a/installation-steps/BasicMonitoringConfiguration/index.html b/installation-steps/BasicMonitoringConfiguration/index.html index 2560cd76e..234be75b0 100644 --- a/installation-steps/BasicMonitoringConfiguration/index.html +++ b/installation-steps/BasicMonitoringConfiguration/index.html @@ -12,21 +12,21 @@ - - + +
-

Basic monitoring configuration

The common ReportPortal instance consists of two main parts – the application server and the database server – both of which must be covered by basic system-level and application-level metrics. Basic system-level monitoring should include metrics tracking the main application and database servers' VM and cluster resources, such as:

  • CPU,
  • RAM,
  • Network,
  • Disk Operations,
  • Storage Usage.

Extended system-level monitoring for the application instance should include:

  • CPU and RAM utilization per each service,
  • MinIO storage usage trend,
  • Restarts count per each service,
  • Disk Bytes,
  • CPU usage in cores per each service,
  • Network IO per each service,
  • RabbitMQ runtime metrics.

In the case of rollouts of the ReportPortal PostgreSQL database as an Amazon RDS, the AWS RDS Performance Insights is used for monitoring purposes and CloudWatch metrics are used to measure basic system-level database workload.

Tools

For regular monitoring, we've chosen one of the most popular, lightweight, and easy-to-maintain tools stack - Telegraf+InfluxDB+Grafana. +

Basic monitoring configuration

The common ReportPortal instance consists of two main parts – the application server and the database server – both of which must be covered by basic system-level and application-level metrics. Basic system-level monitoring should include metrics tracking the main application and database servers' VM and cluster resources, such as:

  • CPU,
  • RAM,
  • Network,
  • Disk Operations,
  • Storage Usage.

Extended system-level monitoring for the application instance should include:

  • CPU and RAM utilization per each service,
  • MinIO storage usage trend,
  • Restarts count per each service,
  • Disk Bytes,
  • CPU usage in cores per each service,
  • Network IO per each service,
  • RabbitMQ runtime metrics.

In the case of rollouts of the ReportPortal PostgreSQL database as an Amazon RDS, the AWS RDS Performance Insights is used for monitoring purposes and CloudWatch metrics are used to measure basic system-level database workload.

Tools

For regular monitoring, we've chosen one of the most popular, lightweight, and easy-to-maintain tools stack - Telegraf+InfluxDB+Grafana. Telegraf is an open-source server agent which enables us to use a lot of different monitoring protocols out of the box. InfluxDB is used to collect these metrics from Telegraf agents. Grafana is used for metrics visualization, building charts, and custom dashboards to reach a "single pane of glass" monitoring principle. The PostgreSQL database in all cases is monitored by AWS RDS Performance Insights, which gives high visibility into the Database workload in runtime, meets all monitoring requirements, and covers OS system-level and database-specific metrics. In addition to that, for the basic database monitoring is used PGHero tool - useful monitoring dashboard for PostgreSQL.

Monitoring installation

Not recommended mixing the ReportPortal services and monitoring services on the same machine, especially in docker installation. To avoid competition for resources with the services of the ReportPortal, deploy a separate virtual machine for monitoring (for our instances we using m5.large shape for the monitoring node) and install the following services:

1) InfluxDB database: https://docs.influxdata.com/influxdb/v2.0/install/?t=Docker;

2) Grafana: Dashboard examples(Grafana IDs): 5955, 3056.

3) Telegraf:

  • Kubernetes deployment: telegraf agent needs to be installed at each cluster node.
  • Docker deployment: telegraf agent should be installed at the ReportPortal VM. In case of rollouting the Database server on the separate VM, telegraf agent should be installed also at that VM.

Telegraf installation guide:

Update your system.

    sudo yum -y update

Add Influxdata RPM repository.

    cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL
baseurl = https://repos.influxdata.com/rhel/7/x86_64/stable/
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

Install Telegraf on RHEL 8 / CentOS 8. Once the repository has been added, install Telegraf on RHEL 8 using the command below.

    sudo dnf -y install telegraf

Open "telegraf.conf" file for the monitoring configuration. In the case of Kubernetes deployment need to configure telegraf on each cluster node separately.

    sudo nano /etc/telegraf/telegraf.conf

Change following configs(press Ctrl+W to search for the particular configs):

    hostname = "api_node_1"

Search for the "outputs.influxdb" and update URL and database name for the InfluxDB:

    [[outputs.influxdb]]
urls = ["http://<influxdb_host>:8086"]
database = "telegraf"

Search for the "inputs.docker" and update next configs(should be uncommented each value which you need to add to the monitoring):

    [[inputs.docker]]
endpoint = "unix://var/run/docker.sock"
perdevice_include = ["cpu"]
total_include = ["cpu", "blkio", "network"]

Search for the "inputs.net" for adding the network metrics to the monitoring. Uncomment only the plugin name:

    [[inputs.net]]

Save changes, close "telegraf.conf" and start telegraf service:

    sudo systemctl enable --now telegraf

Check the status(should be green and in active running status):

    sudo systemctl status telegraf

In case of errors "E! [inputs.docker] Error in plugin: Got permission denied while trying to connect to the Docker daemon socket at unix://var/run/docker.sock Permission denied"

Need to add permissions to the /var/run/docker.sock:

    sudo chmod 666 /var/run/docker.sock

PGHero - simple monitoring dashboard for PostgreSQL

Functionality

  • requests statistic: number of calls, average and total execution time (with the ability to store history);
  • currently active queries;
  • information about tables: disk space occupied, dates of the last VACUUM and ANALYSE launches;
  • information about indexes: disk space occupied, presence of duplicated / unused indexes;
  • recommendations regarding adding an index on complex queries with Seq Scan;
  • statistics on open connections to the database;
  • displaying basic database settings that affect performance (shared_buffers, work_mem, maintenance_work_mem, etc.).

Installation

How to enable query stats

In the database settings(for RDS database - in parameter group) add/change the following parameters:

    shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
pg_stat_statements.max = 10000
track_activity_query_size = 2048

Restart the database or reboot the RDS instance. As a superuser from the psql console, run:

    CREATE extension pg_stat_statements;

How to configure historical query stats

To track query stats over time, create a table to store them.

Execute the following query for table creation:

    CREATE TABLE "pghero_query_stats" (
"id" bigserial primary key,
"database" text,
"user" text,
"query" text,
"query_hash" bigint,
"total_time" float,
"calls" bigint,
"captured_at" timestamp
);

Build index on the created table:

    CREATE INDEX ON "pghero_query_stats" ("database", "captured_at");

Include the following to the installation string to schedule the task to run every 5 minutes:

    bin/rake pghero:capture_query_stats

The query stats table can grow large over time. Remove old stats with:

    bin/rake pghero:clean_query_stats
- - + + \ No newline at end of file diff --git a/installation-steps/DeployOnUbuntuOS/index.html b/installation-steps/DeployOnUbuntuOS/index.html index 33b709f72..7be9afd80 100644 --- a/installation-steps/DeployOnUbuntuOS/index.html +++ b/installation-steps/DeployOnUbuntuOS/index.html @@ -12,20 +12,20 @@ - - + +
-

Deploy on Ubuntu OS

Provided by @Tset Noitamotuahe. The article might be outdated. +

Deploy on Ubuntu OS

Provided by @Tset Noitamotuahe. The article might be outdated. Do not hesitate to contribute and send us a pull request with updates. We appreciate your help!

Follow below steps if you like to have ReportPortal running on Ubuntu Zesty (17.04) with the latest Docker-CE version 17.05 and Docker-Compose 1.14

  1. Enable apt transport over HTTPS
   sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
  1. Get apt-key for Docker repo
   curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. Add Docker's repo to sources.list
   sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu zesty edge"

ToDo: 3. check if there is a stable version of Docker-CE for Zesty

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
  1. Install Docker-CE
   sudo apt update
sudo apt install docker-ce

PROXY SETTINGS for Docker (you'll probably need this @work)

   mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

http-proxy.conf content

   [Service]
Environment="HTTP_PROXY=http://proxyhost:port/" "NO_PROXY=localhost,127.0.0.1"
# ALTERNATIV - if you are behind HTTPS proxy instead of just HTTP:
# https-proxy.conf
# Environment="HTTPS_PROXY=http://proxyhost:port/"
  1. Restart Docker
   sudo systemctl daemon-reload
sudo systemctl restart docker
# TEST: systemctl show --property=Environment docker
# >>> Environment=HTTP_PROXY=http://proxyhost:port/
  1. Check that Docker is installed correctly
   sudo docker run hello-world
# hello-world images will be download and run
# your will see output e.g. "Hello from Docker! ... "
  1. DOCKER-COMPOSE installation from PIP v3.x (Python PIP 2.7 is deprecated 01/01/2020)
   sudo apt install python3-pip
sudo pip3 install docker-compose

Also you can use the official installation guide

  1. REPORTPORTAL INSTALLATION
   mkdir reportportal
cd reportportal
# get the docker-compose file
wget https://raw.githubusercontent.com/reportportal/reportportal/master/docker-compose.yml
docker-compose up

This will take some time cause several images will be downloaded ... go grab a coffee :) After download is completed and containers started open another terminal and run docker ps to check that all containers from previous step are up and running.

  1. Check that ReportPortal is running In the VM opten browser to 0.0.0.0:8080 --> ReportPortal login page will open.
note

If you are behind a proxy you need to add 0.0.0.0 to the NO_PROXY (no_proxy) ENV.
After setting the port forwarding like explained in video PART 2 (link below) open browser on your host machine to localhost:8080 or 127.0.0.1:8080 --> ReportPortal loginpage will open

OPTIONAL

If you don't like to write 'sudo' before each docker-command do this but be aware of possible security issue with that!

   sudo groupadd docker
sudo usermod -aG docker $USER

>>> RESTART VM!

Helpful links (video tutorial)

Part 1

Part 2

- - + + \ No newline at end of file diff --git a/installation-steps/DeployWithAWSECSFargate/index.html b/installation-steps/DeployWithAWSECSFargate/index.html index c158d7b94..03cb45f48 100644 --- a/installation-steps/DeployWithAWSECSFargate/index.html +++ b/installation-steps/DeployWithAWSECSFargate/index.html @@ -12,14 +12,14 @@ - - + +
-

Deploy with AWS ECS Fargate

Provided by contributor, not verified by RP team, please use with caution.

ReportPortal can be deployed using AWS ECS Fargate by interpreting the docker-compose.yml

Pre-requisites

Ensure following services are available in the chosen AWS region & you have permissions to create/modify the resources.

  1. Elastic File System
  2. Aurora PostgreSQL Serverless RDS instance
  3. AWS EC2
  4. AWS Secrets Manager
  5. AWS Lambda
  6. AWS ECS
  7. AWS Cloudwatch
  8. AWS IAM
  9. AWS KMS
  10. Route53

Deployment

Elastic File System

Create Elastic FileSystem with 2 access points i.e., for minio & elasticsearch.

PostreSQL database

Create Aurora Serverless RDS PostgreSQL instance (Engine Version: 13.6) with minimum 2 ACUs and maximum 16 ACUs

Load Balancer

Create Elastic Application LoadBalancer - internal OR internet facing (based on your requirement) with following target groups

  1. Traefik with target as IP, port 8080 and health-check path /ping.
  2. Index with target as Lambda & health checks disabled.

Also, create following rules on the listener of load-balancer

  1. Default rule should forward requests to Traefik target group.
  2. Paths matching pattern /composite/info, /composite/health, /ui & / should be forwarded to Index target group.

KMS Key

Create a symmetric encryption KMS key with relevant permissions to manage & access key.

Secrets

Create Secrets to store the credentials & config of the components & refer the values in ECS task definition environment variables section. For the encryption key choose the custom KMS key created above.

Secret Structure:

{   
"app_username": "foo",
"app_password: "bar"
}

During the ECS Task Definition creation choose valueFrom by referring the SecretsManager ARN in the environment variables section as follows +

Deploy with AWS ECS Fargate

Provided by contributor, not verified by RP team, please use with caution.

ReportPortal can be deployed using AWS ECS Fargate by interpreting the docker-compose.yml

Pre-requisites

Ensure following services are available in the chosen AWS region & you have permissions to create/modify the resources.

  1. Elastic File System
  2. Aurora PostgreSQL Serverless RDS instance
  3. AWS EC2
  4. AWS Secrets Manager
  5. AWS Lambda
  6. AWS ECS
  7. AWS Cloudwatch
  8. AWS IAM
  9. AWS KMS
  10. Route53

Deployment

Elastic File System

Create Elastic FileSystem with 2 access points i.e., for minio & elasticsearch.

PostreSQL database

Create Aurora Serverless RDS PostgreSQL instance (Engine Version: 13.6) with minimum 2 ACUs and maximum 16 ACUs

Load Balancer

Create Elastic Application LoadBalancer - internal OR internet facing (based on your requirement) with following target groups

  1. Traefik with target as IP, port 8080 and health-check path /ping.
  2. Index with target as Lambda & health checks disabled.

Also, create following rules on the listener of load-balancer

  1. Default rule should forward requests to Traefik target group.
  2. Paths matching pattern /composite/info, /composite/health, /ui & / should be forwarded to Index target group.

KMS Key

Create a symmetric encryption KMS key with relevant permissions to manage & access key.

Secrets

Create Secrets to store the credentials & config of the components & refer the values in ECS task definition environment variables section. For the encryption key choose the custom KMS key created above.

Secret Structure:

{   
"app_username": "foo",
"app_password: "bar"
}

During the ECS Task Definition creation choose valueFrom by referring the SecretsManager ARN in the environment variables section as follows Eg:

    {
"name": "RABBITMQ_DEFAULT_PASS",
"valueFrom": "arn:aws:secretsmanager:us-east-1:XXXXXXXXX:secret:report-portal-rmq-zBcd:app_password::"
}

IAM Role

Create an IAM role with following permissions

  1. KMS encryption & decryption
  2. SecretsManager Read access
  3. ECS Task creation
  4. EFS access
  5. Write access to CloudWatch log groups

Security Groups

Create Security Groups for

  1. Access to application - attach to Load Balancer
  2. Access to RP components (with the default ports of apps) & EFS mount (inbound rule to port 2049) - attach to all ECS task definitions.

RP Applications

Most of the configuration remains same for the applications as per the docker-compose.yml file except few overrides as per cloud provider. Ensure the components are deployed within VPC scope & disable public IP assignment where ever applicable.

Migrations: Create Task Def for migrations & just run the task to apply the database schema. Since it's a one time task there's no need to create service.

Minio & Elasticsearch: Create Task Def for these components by adding Elastic File System mountpoints & launch the services.

RabbitMQ @@ -28,7 +28,7 @@ c. Now inspect the logs of traefik service to see if all RP components are being picked up in the configuration from ECS provider.

Index: For some obvious reasons the index (with Ruby runtime) service couldn't run on ECS - hence ported to Lambda with Python runtime. Create a lambda function with 128M memory & 120s timeout with following code.

Add environment variable TRAEFIK_SERVICES_URL with the IP address of Traefik endpoint (it can be fetched from the task details. Eg: http://192.168.2.120:8081)

mureq can be obtained from mureq.py - place it beside the lamda_function.py file.

import os
import json
import mureq


def lambda_handler(event, context):
print("-------------------EVENT BEGIN-------------------------------")
print(event)
print("-------------------EVENT END-------------------------------")
traefik_services= mureq.get(os.environ['TRAEFIK_SERVICES_URL'])

if event['path'] == '/composite/info':
rp_status = {}
for service in traefik_services.json():
if "loadBalancer" in service:
app_name = service['name'].replace('@ecs','')
app_info = mureq.get(service['loadBalancer']['servers'][0]['url'] + '/info')
rp_status.update({app_name: app_info.json()})
return{
"statusCode": 200,
"statusDescription": "200 OK",
"isBase64Encoded": False,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps(rp_status)
}
if event['path'] == '/composite/health':
rp_health = {}
for service in traefik_services.json():
if "loadBalancer" in service:
app_name = service['name'].replace('@ecs','')
app_health = list(service['serverStatus'].values())[0]
rp_health.update({app_name: app_health})
return{
"statusCode": 200,
"statusDescription": "200 OK",
"isBase64Encoded": False,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps(rp_health)
}
if event['path'] == '/':
redirect_url= event['headers']['x-forwarded-proto'] + "://" + event['headers']['host'] + '/ui'
print(redirect_url)
return{
"statusCode": 301,
"statusDescription": "301 Found",
"isBase64Encoded": False,
"headers": {
"Location": redirect_url
},
"body": ""
}

if event['path'] == '/ui':
redirect_url= event['headers']['x-forwarded-proto'] + "://" + event['headers']['host'] + '/ui/'
print(redirect_url)
return{
"statusCode": 301,
"statusDescription": "301 Found",
"isBase64Encoded": False,
"headers": {
"Location": redirect_url
},
"body": ""
}

Now add this lambda to the Index TargetGroup created earlier.

DNS

Add relevent DNS records in the Route53 hostedzone.

Validation

Access the application with default credentials once the DNS record addition is propogated & validate if all sections are loading without errors.

- - + + \ No newline at end of file diff --git a/installation-steps/DeployWithDockerOnLinuxMac/index.html b/installation-steps/DeployWithDockerOnLinuxMac/index.html index bc5cdea9f..4f863225d 100644 --- a/installation-steps/DeployWithDockerOnLinuxMac/index.html +++ b/installation-steps/DeployWithDockerOnLinuxMac/index.html @@ -12,15 +12,15 @@ - - + +
-

Deploy with Docker on Linux/Mac

ReportPortal can be easily deployed using Docker Compose.

Install Docker

Docker is supported by all major Linux distributions, MacOS and Windows.

⚠️ Recomended change resources limits at least 2 CPU 5 GB RAM for Docker Desktop: MAC | Windows | Linux

Deploy ReportPortal with Docker

  1. Download the latest ReportPortal Docker Compose file from here. You can make it by run the following command:
curl -LO https://raw.githubusercontent.com/reportportal/reportportal/master/docker-compose.yml

Ensure you override the UAT Service environment variable RP_INITIAL_ADMIN_PASSWORD.

  1. Start the application using the following command:
docker-compose -p reportportal up -d --force-recreate

Where:

  • -p reportportal adds project prefix 'reportportal' to all containers
  • up creates and starts containers
  • -d daemon mode
  • --force-recreate Re-creates containers if there any

Useful commands:

  • docker-compose logs shows logs from all containers
  • docker logs <container_name> shows logs from selected container
  • docker ps -a | grep "reportportal_" | awk '{print $1}' | xargs docker rm -f Deletes all ReportPortal containers
  • docker-compose down
  1. Open your web browser with an IP address of the deployed environment at port 8080

Use the following login\pass to access:

  • Default User: default\1q2w3e
  • Administrator: superadmin\erebus

⚠️ Please change the admin password for better security

Optional Customisation

  1. Expose Docker Volumes to the file system

OPTIONAL: Set {vm.max_map_count} kernel setting before ReportPortal deploying with the following Commands

Give the right permissions to the ElasticSearch data folder using the following commands:

mkdir -p data/elasticsearch
chmod 775 data/elasticsearch
chgrp 1000 data/elasticsearch

For more details about ElasticSearch visit ElasticSearch guide

  1. PostgreSQL Performance Tuning

Depending on your hardware configuration and the parameters of your system, you can additionally optimize your PostgreSQL performance by adding the following parameters to the "command" option in the Docker compose file:

 -c effective_io_concurrency=
-c shared_buffers=
-c max_connections=
-c effective_cache_size=
-c maintenance_work_mem=
-c random_page_cost=
-c seq_page_cost=
-c min_wal_size=
-c max_wal_size=
-c max_worker_processes=
-c max_parallel_workers_per_gather=

Please choose to set the values of these variables that are right for your system. You can also change the PostgreSQL host by passing a new value to the POSTGRES_SERVER environment variable.

More info can be found at the following link

- - +

Deploy with Docker on Linux/Mac

ReportPortal can be easily deployed using Docker Compose.

Install Docker

Docker is supported by all major Linux distributions, MacOS and Windows.

⚠️ Recomended change resources limits at least 2 CPU 5 GB RAM for Docker Desktop: MAC | Windows | Linux

Deploy ReportPortal with Docker

  1. Download the latest ReportPortal Docker Compose file from here. You can make it by run the following command:
curl -LO https://raw.githubusercontent.com/reportportal/reportportal/master/docker-compose.yml

Ensure you override the UAT Service environment variable RP_INITIAL_ADMIN_PASSWORD.

  1. Start the application using the following command:
docker-compose -p reportportal up -d --force-recreate

Where:

  • -p reportportal adds project prefix 'reportportal' to all containers
  • up creates and starts containers
  • -d daemon mode
  • --force-recreate Re-creates containers if there any

Useful commands:

  • docker-compose logs shows logs from all containers
  • docker logs <container_name> shows logs from selected container
  • docker ps -a | grep "reportportal_" | awk '{print $1}' | xargs docker rm -f Deletes all ReportPortal containers
  • docker-compose down
  1. Open your web browser with an IP address of the deployed environment at port 8080

Use the following login\pass to access:

  • Default User: default\1q2w3e
  • Administrator: superadmin\erebus

⚠️ Please change the admin password for better security

Optional Customisation

  1. Expose Docker Volumes to the file system

OPTIONAL: Set {vm.max_map_count} kernel setting before ReportPortal deploying with the following Commands

Give the right permissions to the ElasticSearch data folder using the following commands:

mkdir -p data/elasticsearch
chmod 775 data/elasticsearch
chgrp 1000 data/elasticsearch

For more details about ElasticSearch visit ElasticSearch guide

  1. PostgreSQL Performance Tuning

Depending on your hardware configuration and the parameters of your system, you can additionally optimize your PostgreSQL performance by adding the following parameters to the "command" option in the Docker compose file:

 -c effective_io_concurrency=
-c shared_buffers=
-c max_connections=
-c effective_cache_size=
-c maintenance_work_mem=
-c random_page_cost=
-c seq_page_cost=
-c min_wal_size=
-c max_wal_size=
-c max_worker_processes=
-c max_parallel_workers_per_gather=

Please choose to set the values of these variables that are right for your system. You can also change the PostgreSQL host by passing a new value to the POSTGRES_SERVER environment variable.

More info can be found at the following link

+ + \ No newline at end of file diff --git a/installation-steps/DeployWithDockerOnWindows/index.html b/installation-steps/DeployWithDockerOnWindows/index.html index ba4aa1d90..b79f832bc 100644 --- a/installation-steps/DeployWithDockerOnWindows/index.html +++ b/installation-steps/DeployWithDockerOnWindows/index.html @@ -12,15 +12,15 @@ - - + +
-

Deploy with Docker on Windows

In case you went with Docker on Windows, please make sure you changed the 'volumes' value for postgres container from "For unix host" to the "For windows host":

  volumes:
# For windows host
- postgres:/var/lib/postgresql/data
# For unix host
# - ./data/postgres:/var/lib/postgresql/data

If you haven’t done this, you will get an error

data directory “/var/lib/postgresql/data/pgdata” has wrong ownership

Then uncomment the following:

    volumes:
# For unix host
# - ./data/storage:/data
# For windows host
- minio:/data

And after that uncomment the following:

# Docker volume for Windows host
volumes:
postgres:
minio:

Updating ReportPortal with Docker

Updating ReportPortal with Docker is a two step process.

In the first step, your Docker Compose file should be replaced with a new one (with the latest version services) from here.

The second step is update / redeploy the application using the following command:

docker-compose -p reportportal up -d --force-recreate

There is no strict need for backup / restore the data if you are keep the postgres, elasticsearch & minio volumes. However, it is recommended (see Maintain commands Cheat sheet).

ReportPortal Services

The ReportPortal consists of the following services:

  • Authorization Service. In charge of access tokens distribution.
  • Gateway Service. Main entry point to application. Port used by gateway should be opened and accessible from outside network.
  • API Service. Main application API.
  • UI Service. All statics for user interface.
  • Analyzer Service. Collects and processes the information, then sends it to ElasticSearch
  • Index Service. Responsible for redirections, collection of services information, handling errors
- - +

Deploy with Docker on Windows

In case you went with Docker on Windows, please make sure you changed the 'volumes' value for postgres container from "For unix host" to the "For windows host":

  volumes:
# For windows host
- postgres:/var/lib/postgresql/data
# For unix host
# - ./data/postgres:/var/lib/postgresql/data

If you haven’t done this, you will get an error

data directory “/var/lib/postgresql/data/pgdata” has wrong ownership

Then uncomment the following:

    volumes:
# For unix host
# - ./data/storage:/data
# For windows host
- minio:/data

And after that uncomment the following:

# Docker volume for Windows host
volumes:
postgres:
minio:

Updating ReportPortal with Docker

Updating ReportPortal with Docker is a two step process.

In the first step, your Docker Compose file should be replaced with a new one (with the latest version services) from here.

The second step is update / redeploy the application using the following command:

docker-compose -p reportportal up -d --force-recreate

There is no strict need for backup / restore the data if you are keep the postgres, elasticsearch & minio volumes. However, it is recommended (see Maintain commands Cheat sheet).

ReportPortal Services

The ReportPortal consists of the following services:

  • Authorization Service. In charge of access tokens distribution.
  • Gateway Service. Main entry point to application. Port used by gateway should be opened and accessible from outside network.
  • API Service. Main application API.
  • UI Service. All statics for user interface.
  • Analyzer Service. Collects and processes the information, then sends it to ElasticSearch
  • Index Service. Responsible for redirections, collection of services information, handling errors
+ + \ No newline at end of file diff --git a/installation-steps/DeployWithKubernetes/index.html b/installation-steps/DeployWithKubernetes/index.html index c829b6bde..c8cd4544f 100644 --- a/installation-steps/DeployWithKubernetes/index.html +++ b/installation-steps/DeployWithKubernetes/index.html @@ -12,15 +12,15 @@ - - + + - - +
+ + \ No newline at end of file diff --git a/installation-steps/DeployWithoutDocker/index.html b/installation-steps/DeployWithoutDocker/index.html index ad4bc7953..bb43e6267 100644 --- a/installation-steps/DeployWithoutDocker/index.html +++ b/installation-steps/DeployWithoutDocker/index.html @@ -12,16 +12,16 @@ - - + +
-

Deploy without Docker

The instruction designed for the version 5.3.5 and might be outdated for the latest versions. +

Deploy without Docker

The instruction designed for the version 5.3.5 and might be outdated for the latest versions. Do not hesitate to contribute and send us a pull request with updates. We appreciate your help!

In order to get started with ReportPortal on Red Hat Family and Ubuntu Linux distributions non-Docker/Kubernetes usage, please use the following links

1. [Outdated] ReportPortal 5.3.5

ReportPortal 5.3.5 installation guide

Supported OS

Ubuntu LTS 18.04, 20.04 / Red Hat family 6, 7, 8 (RHEL, CentOS, etc)

Required service

  • PSQL 12.6
  • RabbitMQ 3.8.14
  • ElasticSearch 7.12
  • Traefik 1.7.29

In addition, these services are compatible with earlier versions.

2. [Outdated] ReportPortal 5.0.0

ReportPortal 5.0.0 installation guide

Supported OS

Ubuntu LTS 16.04, 18.04 / Red Hat family 6, 7 (RHEL, CentOS, etc)

Required service

  • PSQL 11
  • RabbitMQ 3.6.10
  • ElasticSearch 6.7.0"
  • Traefik 1.7.19
- - + + \ No newline at end of file diff --git a/installation-steps/MaintainCommandsCheatSheet/index.html b/installation-steps/MaintainCommandsCheatSheet/index.html index e58dddbcd..7d0127f73 100644 --- a/installation-steps/MaintainCommandsCheatSheet/index.html +++ b/installation-steps/MaintainCommandsCheatSheet/index.html @@ -12,15 +12,15 @@ - - + +
-

Maintain commands Cheat sheet

Export as env var: 

export RP_PRJ=$(docker ps --filter="name=api" --format="\{{.Names}}" | sed 's/\(.*\)_api_[0-9]*/\1/')

Install/restart ReportPortal: 

docker-compose -p $RP_PRJ up -d --force-recreate

Show all logs: 

docker-compose -p $RP_PRJ logs

Show specific logs: 

docker-compose -p $RP_PRJ logs <name, e.g. api>

Delete everything except data: 

docker-compose -p $RP_PRJ down --rmi -v --remove-orphans

Backup / Dump the data: 

docker exec <postgres_container_name> pg_dump -U <POSTGRES_USER> <database_name> > backup.sql

Clean up the data: 

docker exec -it <postgres_container_name> psql -U <POSTGRES_USER> -d <database_name>
    DROP TABLE schema_migrations;
DROP SCHEMA quartz CASCADE;
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
\q

Restore the data: 

docker exec -i <postgres_container_name> psql -U <POSTGRES_USER> -d <database_name> < backup.sql

You can download PDF file with commands.

- - +

Maintain commands Cheat sheet

Export as env var: 

export RP_PRJ=$(docker ps --filter="name=api" --format="\{{.Names}}" | sed 's/\(.*\)_api_[0-9]*/\1/')

Install/restart ReportPortal: 

docker-compose -p $RP_PRJ up -d --force-recreate

Show all logs: 

docker-compose -p $RP_PRJ logs

Show specific logs: 

docker-compose -p $RP_PRJ logs <name, e.g. api>

Delete everything except data: 

docker-compose -p $RP_PRJ down --rmi -v --remove-orphans

Backup / Dump the data: 

docker exec <postgres_container_name> pg_dump -U <POSTGRES_USER> <database_name> > backup.sql

Clean up the data: 

docker exec -it <postgres_container_name> psql -U <POSTGRES_USER> -d <database_name>
    DROP TABLE schema_migrations;
DROP SCHEMA quartz CASCADE;
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
\q

Restore the data: 

docker exec -i <postgres_container_name> psql -U <POSTGRES_USER> -d <database_name> < backup.sql

You can download PDF file with commands.

+ + \ No newline at end of file diff --git a/installation-steps/OptimalPerformanceHardwareSetup/index.html b/installation-steps/OptimalPerformanceHardwareSetup/index.html index 4966ceaf7..b86824854 100644 --- a/installation-steps/OptimalPerformanceHardwareSetup/index.html +++ b/installation-steps/OptimalPerformanceHardwareSetup/index.html @@ -12,18 +12,18 @@ - - + +
-

Optimal Performance Hardware setup

Find below the recommended hardware configuration to set up ReportPortal and have good performance using our centralized test automation tool.

1. Disk I/O

To speed up PostgreSQL database performance, on instance strongly recommended use SSD disk hardware.

2. CPU utilization

Consider choosing the CPU optimized instances to reduce high CPU utilization of the ReportPortal service-API and speed up ReportPortal overall.

For example:

  • Azure: Fsv2-series instances,

  • AWS: c5 instances.

    The instance capacity(4 CPUs/8Gb RAM or 8 CPUs/16Gb RAM etc.) should be selected regarding average reporting test-cases/day and average CPU/RAM utilization. If the CPU/RAM utilization of the ReportPortal instance up to 100% a long time daily, consider scale up the VM x2.

System hardware requirements

Simple Docker installation from the box:

Server typeCPU'sRAM size, GbDisk space, GbDisk typeAWS Shape
Small48300gp2c5.xlarge
Middle816500gp2c5.2xlarge
Middle+16321000gp2c5.4xlarge
Large32642000gp2c5a.8xlarge

Kubernetes:


note

In Report Portal version 5.7.3, the log double-entry saving approach to DB and Elasticsearch (to data streams) has been implemented. This saving approach reduces the DB footprint almost x10 times, improves the speed of reporting logs, minimizes computation power to clean up data, and brings full-text search capabilities. Our general recommendation is to roll out Elasticsearch on the separate cluster nodes if you have a Kubernetes deployment (consider creating the node group for Elasticsearch). But if you have or expect a large amount of the logs reporting, separate cluster nodes for Elasticsearch are required. The proposed shapes for Elasticsearch nodes have been verified during performance testing and perform stable without degradation on all server configurations (from Small server type to Large). However, if you report many logs, you can tune the node's Disk size or scale up the shapes according to your needs. In addition, please pay attention to the number of Elasticsearch active shards (primary and total). In case you have a large count of projects, additional tuning for Elasticsearch might be needed(due to limitations that Elasticsearch has on the number of active shards). Please see Part 7 below for the tips.

Additional nodes for Elasticsearch:



**io2 = 1 GB per month x 0.149 USD x 1 instances = 0.149 USD (EBS Storage Cost) / iops = 1 Provisioned IOPS x 0.119 USD x 1 instances = 0.119 USD (EBS IOPS Cost)*
***Replica*
note

The approximate server's cost is relevant for the current cost of infrastructure on AWS. The estimated server cost is the current cost of the AWS infrastructure. When changing any cost of resources, costs need to be recalculated.


3. Which scale I need? Configuration testing results and saturation points

What does Saturation and vUser means? How to transform it into test cases?

RPS means Requests Per Second. Any request to server to upload, create, read the data. In ReportPortal terms it can be request to create Launch (execution), Test Suite, Test case, log line. Read data or update data.

Saturation (in RPS) can be assumed as maximum capacity of your configuration (app deployed on specifics instance type) which can procced requests without significant response time degradation. Let's say upper limit

vUser means Virtual user which describes regular model of behaviour of user (API client) which interacts with your system. Under vUser we assume test framework integration which will generate:

◾️ 3 Launches with

◾️◾️ 3 suites inside, with

◾️◾️◾️ 3 test classes inside, with

◾️◾️◾️◾️ 3 test cases inside, with

◾️◾️◾️◾️◾️ 5 steps inside, with

◾️◾️◾️◾️◾️◾️ 10 logs inside for each step.

Which practically will generate:

  • 10 * 5 * 3 * 3 * 3 * 3 = (4050) createLog requests.
  • 5 * 3 * 3 * 3 * 3 = (405) startStep requests and equal amount of finishStep requests. Total 910
  • 3 * 3 * 3 * 3 = (81) startTest requests and equal amount of finishTest requests (inclluding all precondition methods, as @After and @Before in Java). Total 162
  • 3 * 3 * 3 = (27) startTestClass requests and equal amount of finishTestClass requests. Total 54
  • 3 * 3 = (9) startSuite requests and equal amount of finishSuite requests. Total 18
  • 3 = (3) startLaunch requests and equal amount of finishLaunch requests. Total 6

Default configuration of integration sends logs in batches (rp.batch.size.logs = 20) which combines 20 requests at once into 1 batch request for createLog. And minimize count of createLog requests from 4050 to 203. +

Optimal Performance Hardware setup

Find below the recommended hardware configuration to set up ReportPortal and have good performance using our centralized test automation tool.

1. Disk I/O

To speed up PostgreSQL database performance, on instance strongly recommended use SSD disk hardware.

2. CPU utilization

Consider choosing the CPU optimized instances to reduce high CPU utilization of the ReportPortal service-API and speed up ReportPortal overall.

For example:

  • Azure: Fsv2-series instances,

  • AWS: c5 instances.

    The instance capacity(4 CPUs/8Gb RAM or 8 CPUs/16Gb RAM etc.) should be selected regarding average reporting test-cases/day and average CPU/RAM utilization. If the CPU/RAM utilization of the ReportPortal instance up to 100% a long time daily, consider scale up the VM x2.

System hardware requirements

Simple Docker installation from the box:

Server typeCPU'sRAM size, GbDisk space, GbDisk typeAWS Shape
Small48300gp2c5.xlarge
Middle816500gp2c5.2xlarge
Middle+16321000gp2c5.4xlarge
Large32642000gp2c5a.8xlarge

Kubernetes:


note

In Report Portal version 5.7.3, the log double-entry saving approach to DB and Elasticsearch (to data streams) has been implemented. This saving approach reduces the DB footprint almost x10 times, improves the speed of reporting logs, minimizes computation power to clean up data, and brings full-text search capabilities. Our general recommendation is to roll out Elasticsearch on the separate cluster nodes if you have a Kubernetes deployment (consider creating the node group for Elasticsearch). But if you have or expect a large amount of the logs reporting, separate cluster nodes for Elasticsearch are required. The proposed shapes for Elasticsearch nodes have been verified during performance testing and perform stable without degradation on all server configurations (from Small server type to Large). However, if you report many logs, you can tune the node's Disk size or scale up the shapes according to your needs. In addition, please pay attention to the number of Elasticsearch active shards (primary and total). In case you have a large count of projects, additional tuning for Elasticsearch might be needed(due to limitations that Elasticsearch has on the number of active shards). Please see Part 7 below for the tips.

Additional nodes for Elasticsearch:



**io2 = 1 GB per month x 0.149 USD x 1 instances = 0.149 USD (EBS Storage Cost) / iops = 1 Provisioned IOPS x 0.119 USD x 1 instances = 0.119 USD (EBS IOPS Cost)*
***Replica*
note

The approximate server's cost is relevant for the current cost of infrastructure on AWS. The estimated server cost is the current cost of the AWS infrastructure. When changing any cost of resources, costs need to be recalculated.


3. Which scale I need? Configuration testing results and saturation points

What does Saturation and vUser means? How to transform it into test cases?

RPS means Requests Per Second. Any request to server to upload, create, read the data. In ReportPortal terms it can be request to create Launch (execution), Test Suite, Test case, log line. Read data or update data.

Saturation (in RPS) can be assumed as maximum capacity of your configuration (app deployed on specifics instance type) which can procced requests without significant response time degradation. Let's say upper limit

vUser means Virtual user which describes regular model of behaviour of user (API client) which interacts with your system. Under vUser we assume test framework integration which will generate:

◾️ 3 Launches with

◾️◾️ 3 suites inside, with

◾️◾️◾️ 3 test classes inside, with

◾️◾️◾️◾️ 3 test cases inside, with

◾️◾️◾️◾️◾️ 5 steps inside, with

◾️◾️◾️◾️◾️◾️ 10 logs inside for each step.

Which practically will generate:

  • 10 * 5 * 3 * 3 * 3 * 3 = (4050) createLog requests.
  • 5 * 3 * 3 * 3 * 3 = (405) startStep requests and equal amount of finishStep requests. Total 910
  • 3 * 3 * 3 * 3 = (81) startTest requests and equal amount of finishTest requests (inclluding all precondition methods, as @After and @Before in Java). Total 162
  • 3 * 3 * 3 = (27) startTestClass requests and equal amount of finishTestClass requests. Total 54
  • 3 * 3 = (9) startSuite requests and equal amount of finishSuite requests. Total 18
  • 3 = (3) startLaunch requests and equal amount of finishLaunch requests. Total 6

Default configuration of integration sends logs in batches (rp.batch.size.logs = 20) which combines 20 requests at once into 1 batch request for createLog. And minimize count of createLog requests from 4050 to 203. In grand total such a structure creates 3 Launches with 243 test case inside and produces 1253 requests.

Now we can divide their number by the duration in seconds, and get the RPS result. if it runs for 6 minutes (2 minutes each lunch), then: 60s * 6 = 360 and 1253 / 360 ~=4.5 requests per second.

If launches will be executed in parallel, 3 at the time, then RPS will be equal to 4.5*3 = 13.5 rps.


Summary

Having information regarding number of test cases in your framework, average number of logs, number of parallel threads and durations, you can calculate system capacity according to the tables below.


Configuration testing results

The purpose of the configuration performance testing is to determine saturation points and overall system capacity for different instance sizes and specifications. Testing was conducted on the С5 instances which are optimized for compute-intensive workloads and deliver cost-effective high performance at a low price per compute ratio(Compute Optimized Instances) with Up to 3.4GHz, and single core turbo frequency of up to 3.5 GHz 2nd generation Intel Xeon Scalable Processors (Cascade Lake) or 1st generation Intel Xeon Platinum 8000 series (Skylake-SP) processor with a sustained all core Turbo frequency.

Application and Database are deployed on separate VMs

Instance TypeSaturation point, rpsvUsers countDisk IOPSJava Options
с5.xlarge64060up to 3000-Xmx1g
c5.2xlarge1374115up to 4000-Xmx2g
c5.4xlarge3104356up to 8000-Xmx3g
с5.9xlarge5700489up to 10000-Xmx4g

Application and Database are deployed on single VM

Instance TypeSaturation point, rpsvUsers countDisk IOPSJava Options
с5.xlarge52150up to 3000-Xmx1g
c5.2xlarge107883up to 4000-Xmx2g
c5.4xlarge2940305up to 8000-Xmx3g
с5.9xlarge5227440up to 10000-Xmx4g


4. The database separately from other services

Consider deploying the database separately from other RP services. It allows increasing throughput of the server and performance of the ReportPortal overall. This can be, for example, AWS RDS PostgreSQL Database or a separate VM only for the PostgreSQL database.

The separate database instance should be the same by CPU's and RAM, but started from middle+ server type, the database instance may need to have doubled CPU's and RAM size in comparison with the application instance. This is explained by the fact that with an increase in the size of the database and the number of concurrent users, the load is distributed more on the database server: increased volume of resources(CPU, memory, IOPS number, etc.) required to performing each DB query since it handles / can handle more data volume and/or can handle of a greater number of concurrent users.

Example for the middle+ server:

Instance typeCPU'sRAM size, GbDisk space, GbAWS Shape
Application instance1632200c5.4xlarge
Database instance16321000c5.4xlarge

5. PostgreSQL Performance Tuning

Since PostgreSQL Database is used, it needs some set of special configs for the best performance. These set contains two categories:

  • general and universal for any capacity of the instance hardware:

    effective_io_concurrency=200
    random_page_cost=0.1
    seq_page_cost=1
    min_wal_size=1GB
    max_wal_size=4GB
    wal_buffers=16MB
    default_statistics_target=100
    synchronous_commit=off
    wal_writer_delay=10ms
    checkpoint_completion_target=0.9
  • based on CPU/RAM size at the instance(example for 4 CPUs/8GB RAM; the database is deployed on the separate VM):

    shared_buffers=2GB
    effective_cache_size=6GB
    maintenance_work_mem=512MB
    work_mem=96MB
    max_worker_processes=4
    max_parallel_workers_per_gather=2
    max_parallel_workers=4
    max_parallel_maintenance_workers=2

    Recommendations regarding PostgreSQL server tuning for the instance with 8 CPUs/16GB RAM(where all RP services are deployed):

    shared_buffers=4GB
    effective_cache_size=8GB
    wal_buffers=16MB
    default_statistics_target=100
    effective_io_concurrency=200
    work_mem=96MB
    min_wal_size=1GB
    synchronous_commit=off
    wal_writer_delay=10ms
    maintenance_work_mem=1GB
    seq_page_cost=1
    checkpoint_completion_target=0.9
    random_page_cost=0.1
    max_wal_size=4GB
    max_worker_processes=8
    max_parallel_workers_per_gather=4
    max_parallel_workers=8
    max_parallel_maintenance_workers=4

    If the PostgreSQL database and services are deployed on the separate VM’s, the "effective_cache_size" parameter should be changed to "12GB"(total RAM size - shared_buffers size).


    **Simple ways to set these parameters:**

    CPU’s count related:

    max_worker_processes = <DB instance CPU’s count>
    max_parallel_workers_per_gather = <DB instance CPU’s count / 2>
    max_parallel_workers = <DB instance CPU’s count>
    max_parallel_maintenance_workers = <DB instance CPU’s count / 2>

    RAM size related:

    shared_buffers = <DB instance RAM size in GB / 4>
    effective_cache_size = <DB instance RAM size in GB - shared_buffers>
    maintenance_work_mem = < if total RAM size > 16 Gb – 2Gb; under 16Gb – 1Gb and less>

    For the docker-compose: add the following lines to the command section by the “-c” option to “postgres” service.

    Example:

    postgres:
    image: postgres:12-alpine
    shm_size: '512m'
    ...
    command:
    -c effective_io_concurrency=200
    -c random_page_cost=0.1
    -c seq_page_cost=1
    ...
    # Some another configs

    For the AWS RDS: create new parameter group(Services -> RDS -> Parameter groups -> Create parameter group), search config by the name and set up the following values, then apply created parameter group to the RDS DB.

    The following parameters can be scaled and depends on CPU’s number and RAM size of the instance. For example, for the instance 16 CPUs/32GB RAM(the database is deployed on the separate VM) this parameters should be:

    shared_buffers = '8GB'
    effective_cache_size = '24GB'
    max_worker_processes = '16'
    max_parallel_workers = '16'

6. Application connections pool tuning

By default, ReportPortal has 27 connections on service-api and 27 connections in pool on service-authorization. In general these values are valid for the small and middle servers. But from the middle+ server type, the connection pool may be increased if it's not enough for your server load.

It can be detected as periodic freezes and the "Loading" message when opening any page, and/or slowing down the work with RP after a certain period of time during active reporting and use with UI. Restarts of API and UAT services can also be observed.

To increasing the connection pool on both services, need to add next environment variables to the service-api and to the service-authorization:

RP_DATASOURCE_MAXIMUMPOOLSIZE=100

After increasing the connection pool from the application side, do not forget increase the max_connections from the Database side, using following DB configuration paramether:

max_connections=500

The values of these parameters are given for example only, but in general, can be valid for all types of loads for servers middle+ and large.

Please note, that the max_connections paramether must be more than the sum of the RP_DATASOURCE_MAXIMUMPOOLSIZE for the API and the UAT services + several connections for connecting to the database from outside.

7. Elasticsearch Performance Tuning

As mentioned above, in some cases may be necessary to increase the limits of shards. The general rule is 2 active shards per 1 data stream(1 data stream equals 1 project in the ReportPortal on the default configuration). If the data stream reaches the default 50 GB storage limit, it will be rollovered and a new generation will be created (please see the diagram below). Please consider that the number of Elasticsearch shards on the default configuration is insufficient for ReportPortal installations with a large number of projects. As a result, after storing close to 3000 indices without any tuning the logs-saving behavior may be incorrect.

To retrieve statistics from a cluster (to check the value of shard):

GET /_cluster/stats

{
"_nodes": {
"total": 3,
"successful": 3,
"failed": 0
},
"cluster_name": "elasticsearch",
"cluster_uuid": "Oq5UUZUg3RGE0Pa_Trfds",
"timestamp": 172365897412,
"status": "green",
"indices": {
"count": 470,
"shards": {
"total": 940,
"primaries": 470,
"replication": 1.0,
"index": {
"shards": {
"min": 2,
"max": 2,
"avg": 2.0
},
...
}

The API returns basic index metrics (shard numbers, store size, memory usage) and information about the current nodes that form the cluster (number, roles, os, jvm versions, memory usage, cpu and installed plugins).

To increase the limits of the total number of primary and replica shards for the cluster:

PUT /_cluster/settings

{
"persistent" : {
"cluster.max_shards_per_node": 3000
}
}

Keep in mind, that the more shards you allow per node the more resources each node will need and the worse the performance can get.

We also recommend to check the next guides in the official Elasticsearch documentation:

Data streams

Size your shards

- - + + \ No newline at end of file diff --git a/installation-steps/ReportPortal23.1FileStorageOptions/index.html b/installation-steps/ReportPortal23.1FileStorageOptions/index.html index 8b999389f..d3e9bf8f7 100644 --- a/installation-steps/ReportPortal23.1FileStorageOptions/index.html +++ b/installation-steps/ReportPortal23.1FileStorageOptions/index.html @@ -12,15 +12,15 @@ - - + +
-

ReportPortal 23.1 File storage options

In ReportPortal 23.1 we can use multiple ways to store log attachments, user pictures and plugins.

  • AWS S3
  • MinIO distributed object storage
  • File system

Currently we have 2 file storage systems: multi-bucket and single-bucket.

In the multi-bucket system structure of buckets looks like this:

  • bucketPrefix + ‘keystore’ (bucket for storing integration secrets)
  • bucketPrefix + ‘users’ (bucket for storing user data)
  • defaultBucketName (bucket for storing plugins)
  • bucketPrefix + projectId (bucket for storing project attachments)

In the single-bucket system structure of single-bucket is the following:

  • singleBucketName/integration-secrets/ (prefix for integration secrets)
  • singleBucketName/user-data/ (prefix for user data)
  • singleBucketName/plugins/ (prefix for plugins)
  • singleBucketName/project-data/projectId (prefix for project attachments)

AWS S3

Amazon Simple Storage Service (Amazon S3) is an object storage service offering industry-leading scalability, data availability, security, and performance. Bucket names must be unique across all AWS accounts in all the AWS Regions within a partition. A partition is a grouping of Regions.

To set up AWS S3 in API, UAT & Jobs services use the following variables:

  • DATASTORE_TYPE: s3
  • DATASTORE_ACCESSKEY for AWS S3 AccessKey
  • DATASTORE_SECRETKEY for AWS S3 SecretKey
  • DATASTORE_REGION for AWS region

To set up the multi-bucket system, use the following environment variables:

  • DATASTORE_BUCKETPREFIX for prefix of bucket name (‘prj-‘ by default)
  • DATASTORE_DEFAULTBUCKETNAME for name of plugins bucket (‘rp-bucket’ by default)

To set up the single-bucket system, use the following environment variables:

  • DATASTORE_DEFAULTBUCKETNAME for single-bucket name
  • RP_FEATURE_FLAGS: singleBucket

MinIO

MinIO is a high-performance distributed object storage server. It stays on top of S3 or any other cloud storage and allows to have a shared FS for several API, UAT & Jobs pods in Kubernetes.

To set up MinIO in services, use the following variables:

  • DATASTORE_TYPE: minio
  • DATASTORE_ENDPOINT for endpoint (address)
  • DATASTORE_ACCESSKEY for accesskey
  • DATASTORE_SECRETKEY for secretkey

To set the multi-bucket system, use the following environment variables:

  • DATASTORE_BUCKETPREFIX for prefix of bucket name (‘prj-‘ by default)
  • DATASTORE_DEFAULTBUCKETNAME for name of plugins bucket (‘rp-bucket’ by default)

To set the single-bucket system, use the following environment variables:

  • DATASTORE_DEFAULTBUCKETNAME for single-bucket name
  • RP_FEATURE_FLAGS : singleBucket

File system

The file system option is used when you want to store this data in a mounted folder in the service-api or/and service-uat.

To use this option, set up environment variables like this:

  • DATASTORE_TYPE: filesystem
  • DATASTORE_PATH for path in filesystem to store files.

It can be done in both Docker and Kubernetes ReportPortal versions.

- - +

ReportPortal 23.1 File storage options

In ReportPortal 23.1 we can use multiple ways to store log attachments, user pictures and plugins.

  • AWS S3
  • MinIO distributed object storage
  • File system

Currently we have 2 file storage systems: multi-bucket and single-bucket.

In the multi-bucket system structure of buckets looks like this:

  • bucketPrefix + ‘keystore’ (bucket for storing integration secrets)
  • bucketPrefix + ‘users’ (bucket for storing user data)
  • defaultBucketName (bucket for storing plugins)
  • bucketPrefix + projectId (bucket for storing project attachments)

In the single-bucket system structure of single-bucket is the following:

  • singleBucketName/integration-secrets/ (prefix for integration secrets)
  • singleBucketName/user-data/ (prefix for user data)
  • singleBucketName/plugins/ (prefix for plugins)
  • singleBucketName/project-data/projectId (prefix for project attachments)

AWS S3

Amazon Simple Storage Service (Amazon S3) is an object storage service offering industry-leading scalability, data availability, security, and performance. Bucket names must be unique across all AWS accounts in all the AWS Regions within a partition. A partition is a grouping of Regions.

To set up AWS S3 in API, UAT & Jobs services use the following variables:

  • DATASTORE_TYPE: s3
  • DATASTORE_ACCESSKEY for AWS S3 AccessKey
  • DATASTORE_SECRETKEY for AWS S3 SecretKey
  • DATASTORE_REGION for AWS region

To set up the multi-bucket system, use the following environment variables:

  • DATASTORE_BUCKETPREFIX for prefix of bucket name (‘prj-‘ by default)
  • DATASTORE_DEFAULTBUCKETNAME for name of plugins bucket (‘rp-bucket’ by default)

To set up the single-bucket system, use the following environment variables:

  • DATASTORE_DEFAULTBUCKETNAME for single-bucket name
  • RP_FEATURE_FLAGS: singleBucket

MinIO

MinIO is a high-performance distributed object storage server. It stays on top of S3 or any other cloud storage and allows to have a shared FS for several API, UAT & Jobs pods in Kubernetes.

To set up MinIO in services, use the following variables:

  • DATASTORE_TYPE: minio
  • DATASTORE_ENDPOINT for endpoint (address)
  • DATASTORE_ACCESSKEY for accesskey
  • DATASTORE_SECRETKEY for secretkey

To set the multi-bucket system, use the following environment variables:

  • DATASTORE_BUCKETPREFIX for prefix of bucket name (‘prj-‘ by default)
  • DATASTORE_DEFAULTBUCKETNAME for name of plugins bucket (‘rp-bucket’ by default)

To set the single-bucket system, use the following environment variables:

  • DATASTORE_DEFAULTBUCKETNAME for single-bucket name
  • RP_FEATURE_FLAGS : singleBucket

File system

The file system option is used when you want to store this data in a mounted folder in the service-api or/and service-uat.

To use this option, set up environment variables like this:

  • DATASTORE_TYPE: filesystem
  • DATASTORE_PATH for path in filesystem to store files.

It can be done in both Docker and Kubernetes ReportPortal versions.

+ + \ No newline at end of file diff --git a/installation-steps/ScalingUpReportPortalAPIService/index.html b/installation-steps/ScalingUpReportPortalAPIService/index.html index 180ddfa68..bb3bd6e37 100644 --- a/installation-steps/ScalingUpReportPortalAPIService/index.html +++ b/installation-steps/ScalingUpReportPortalAPIService/index.html @@ -12,14 +12,14 @@ - - + +
-

Scaling Up the ReportPortal Service API

Due to the current implementation specifics Asynchronous Reporting Scheme, horizontal auto-scaling of the ReportPortal service API is not feasible. However, manual scaling is achievable. This limitation stems from the way RabbitMQ, in conjunction with the API, manages the number of queues on the RabbitMQ side.

Given that ReportPortal can receive a substantial volume of concurrent streams from different project spaces, a mechanism has been implemented. This mechanism determines the number of queues based on the hash of the launch object and distributes them across different queues to increase the likelihood of processing.

In simpler terms, this means that a launch that arrives later in time has the chance to be processed and recorded in the database from the queue, even while another launch from a different project with a large number of test cases has already entered the queue. Instead of a situation where the queue would only reach the last launch after processing the earlier, larger one, the API will handle different queues concurrently. This approach allows the later launch to be processed without undue delay.

Scaling up configuration for ReportPortal API Service

Kubernetes

To scale your ReportPortal services in Kubernetes, you need to adjust the replicaCount and queues.totalNumber in your values.yaml file.

  1. Update Replica Count: +

    Scaling Up the ReportPortal Service API

    Due to the current implementation specifics Asynchronous Reporting Scheme, horizontal auto-scaling of the ReportPortal service API is not feasible. However, manual scaling is achievable. This limitation stems from the way RabbitMQ, in conjunction with the API, manages the number of queues on the RabbitMQ side.

    Given that ReportPortal can receive a substantial volume of concurrent streams from different project spaces, a mechanism has been implemented. This mechanism determines the number of queues based on the hash of the launch object and distributes them across different queues to increase the likelihood of processing.

    In simpler terms, this means that a launch that arrives later in time has the chance to be processed and recorded in the database from the queue, even while another launch from a different project with a large number of test cases has already entered the queue. Instead of a situation where the queue would only reach the last launch after processing the earlier, larger one, the API will handle different queues concurrently. This approach allows the later launch to be processed without undue delay.

    Scaling up configuration for ReportPortal API Service

    Kubernetes

    To scale your ReportPortal services in Kubernetes, you need to adjust the replicaCount and queues.totalNumber in your values.yaml file.

    1. Update Replica Count: Change replicaCount from 1 to 2 for additional replication.
      values.yaml replicaCount

    2. Edit Total Number of Queues: Modify queues.totalNumber from 10 to 20 to increase the total available queues.
      @@ -29,7 +29,7 @@ Create a copy of the API values block and rename api to api_replica_1 to facilitate scaling.
      docker-compose.yml API values block

      version: '3.8'
      services:

      api:
      <...>
      environment:
      RP_AMQP_QUEUES: 20
      RP_AMQP_QUEUESPERPOD: 10
      <...>

      api_replica_1:
      <...>
      environment:
      RP_AMQP_QUEUES: 20
      RP_AMQP_QUEUESPERPOD: 10
      <...>
    3. Docker Compose v3.3+

      • Add replicas: Add deploy.replicas: 2 to your API:
        version: '3.8'
        services:

        api:
        <...>
        deploy:
        replicas: 2
        <...>
- - + + \ No newline at end of file diff --git a/installation-steps/SetupTSLSSLInTraefik2.0.x/index.html b/installation-steps/SetupTSLSSLInTraefik2.0.x/index.html index eff9052f8..205d907b2 100644 --- a/installation-steps/SetupTSLSSLInTraefik2.0.x/index.html +++ b/installation-steps/SetupTSLSSLInTraefik2.0.x/index.html @@ -12,15 +12,15 @@ - - + +
-

Setup TLS(SSL) in Traefik 2.0.x

This is a short guideline that provides information on how to configure ReportPortal to use Let TLS/SSL certificate setup for your existing ReportPortal environment.

Overview

We use Traefik as a layer-7 load balancer with TLS/SSL termination for the set of micro-services used to run ReportPortal web application.

Pre-requisites

  • Server with a public IP address, with Docker and docker-compose installed on it
  • Installed ReportPortal on this servers
  • Your own domain and the DNS configured accordingly so the hostname records

Configuration

Provided below is an example of using Traefik (gateway service) in docker-compose.yaml. If you don't have any custom configurations, you are free to use the example below.

Create a directory on the server for Traefik data and storing certificates

mkdir data/traefik/ && mkdir -p data/certs/traefik

Check:

data
|-- certs
|-- elasticsearch
|-- postgres
|-- traefik

Create config file for Traefik with certificate and key path.

cat << EOF | tee -a data/traefik/certs-traefik.yaml
tls:
certificates:
- certFile: /etc/certs/examplecert.crt
keyFile: /etc/certs/examplecert.key
EOF

Place certificate examplecert.crt and key examplecert.key to directory data/certs/traefik/ you created earlier.

Edit Traefik service in the docker-compose.yaml

Add the following volumes to Traefik:

services:
gateway:
volumes:
- "./data/traefik/dynamic/certs-traefik.yaml:/etc/traefik/dynamic/certs-traefik.yaml"
- "./data/certs/traefik:/etc/certs/"

commands:

services:
gateway:
commands:
- "--providers.file.directory=/etc/traefik/dynamic"
- "--entrypoints.websecure.address=:443"

and ports:

services:
gateway:
ports:
- "443:443"

Check the Traefik part:

version: '2.4'
services:

gateway:
image: traefik:v2.0.5
ports:
- "8080:8080" # HTTP exposed
- "8081:8081" # HTTP Administration exposed
- "443:443" # TLS/SSL
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "./data/traefik/dynamic/certs-traefik.yaml:/etc/traefik/dynamic/certs-traefik.yaml"
- "./data/certs/traefik:/etc/certs/"
command:
- "--providers.docker=true"
- "--providers.docker.constraints=Label(`traefik.expose`, `true`)"
- "--entrypoints.web.address=:8080"
- "--entrypoints.traefik.address=:8081"
- "--api.dashboard=true"
- "--api.insecure=true"
# TLS/SSL
- "--providers.file.directory=/etc/traefik/dynamic"
- "--entrypoints.websecure.address=:443"
restart: always

Add the following labels to existing services api, uat, index, ui, replacing <service> with the corresponding service name

labels:
- "traefik.http.routers.<service>.tls=true"

Check the UI and API services as an example:

version: '2.4'
services:

ui:
image: reportportal/service-ui:5.3.4
environment:
- RP_SERVER_PORT=8080
labels:
- "traefik.http.middlewares.ui-strip-prefix.stripprefix.prefixes=/ui"
- "traefik.http.routers.ui.middlewares=ui-strip-prefix@docker"
- "traefik.http.routers.ui.rule=PathPrefix(`/ui`)"
- "traefik.http.routers.ui.service=ui"
- "traefik.http.services.ui.loadbalancer.server.port=8080"
- "traefik.http.services.ui.loadbalancer.server.scheme=http"
- "traefik.expose=true"
- "traefik.http.routers.ui.tls=true" # label is here
restart: always
note

Make sure that the required ports are opened. Please check your firewall settings.

  1. Traefik HTTPS&TLS Offical documentation
  2. Traefik 2 & TLS 101
  3. Traefik Routing TLS

Issues

Unable to find valid certification path to requested target

Feb-2 00:00:00.000 [rp-io-1] ERROR Launch - [18] ReportPortal execution error
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Solutions:

  1. Recomended. Add certificate to Java-machine
  2. Not recommended. Ignoring SSL certificate
- - +

Setup TLS(SSL) in Traefik 2.0.x

This is a short guideline that provides information on how to configure ReportPortal to use Let TLS/SSL certificate setup for your existing ReportPortal environment.

Overview

We use Traefik as a layer-7 load balancer with TLS/SSL termination for the set of micro-services used to run ReportPortal web application.

Pre-requisites

  • Server with a public IP address, with Docker and docker-compose installed on it
  • Installed ReportPortal on this servers
  • Your own domain and the DNS configured accordingly so the hostname records

Configuration

Provided below is an example of using Traefik (gateway service) in docker-compose.yaml. If you don't have any custom configurations, you are free to use the example below.

Create a directory on the server for Traefik data and storing certificates

mkdir data/traefik/ && mkdir -p data/certs/traefik

Check:

data
|-- certs
|-- elasticsearch
|-- postgres
|-- traefik

Create config file for Traefik with certificate and key path.

cat << EOF | tee -a data/traefik/certs-traefik.yaml
tls:
certificates:
- certFile: /etc/certs/examplecert.crt
keyFile: /etc/certs/examplecert.key
EOF

Place certificate examplecert.crt and key examplecert.key to directory data/certs/traefik/ you created earlier.

Edit Traefik service in the docker-compose.yaml

Add the following volumes to Traefik:

services:
gateway:
volumes:
- "./data/traefik/dynamic/certs-traefik.yaml:/etc/traefik/dynamic/certs-traefik.yaml"
- "./data/certs/traefik:/etc/certs/"

commands:

services:
gateway:
commands:
- "--providers.file.directory=/etc/traefik/dynamic"
- "--entrypoints.websecure.address=:443"

and ports:

services:
gateway:
ports:
- "443:443"

Check the Traefik part:

version: '2.4'
services:

gateway:
image: traefik:v2.0.5
ports:
- "8080:8080" # HTTP exposed
- "8081:8081" # HTTP Administration exposed
- "443:443" # TLS/SSL
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "./data/traefik/dynamic/certs-traefik.yaml:/etc/traefik/dynamic/certs-traefik.yaml"
- "./data/certs/traefik:/etc/certs/"
command:
- "--providers.docker=true"
- "--providers.docker.constraints=Label(`traefik.expose`, `true`)"
- "--entrypoints.web.address=:8080"
- "--entrypoints.traefik.address=:8081"
- "--api.dashboard=true"
- "--api.insecure=true"
# TLS/SSL
- "--providers.file.directory=/etc/traefik/dynamic"
- "--entrypoints.websecure.address=:443"
restart: always

Add the following labels to existing services api, uat, index, ui, replacing <service> with the corresponding service name

labels:
- "traefik.http.routers.<service>.tls=true"

Check the UI and API services as an example:

version: '2.4'
services:

ui:
image: reportportal/service-ui:5.3.4
environment:
- RP_SERVER_PORT=8080
labels:
- "traefik.http.middlewares.ui-strip-prefix.stripprefix.prefixes=/ui"
- "traefik.http.routers.ui.middlewares=ui-strip-prefix@docker"
- "traefik.http.routers.ui.rule=PathPrefix(`/ui`)"
- "traefik.http.routers.ui.service=ui"
- "traefik.http.services.ui.loadbalancer.server.port=8080"
- "traefik.http.services.ui.loadbalancer.server.scheme=http"
- "traefik.expose=true"
- "traefik.http.routers.ui.tls=true" # label is here
restart: always
note

Make sure that the required ports are opened. Please check your firewall settings.

  1. Traefik HTTPS&TLS Offical documentation
  2. Traefik 2 & TLS 101
  3. Traefik Routing TLS

Issues

Unable to find valid certification path to requested target

Feb-2 00:00:00.000 [rp-io-1] ERROR Launch - [18] ReportPortal execution error
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Solutions:

  1. Recomended. Add certificate to Java-machine
  2. Not recommended. Ignoring SSL certificate
+ + \ No newline at end of file diff --git a/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically/index.html b/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically/index.html index 4ab9f2997..e9262cdc9 100644 --- a/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically/index.html +++ b/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomatically/index.html @@ -12,15 +12,15 @@ - - + +
-

How to add a test stack trace to a description automatically

You can make your process of a test analysis more convenient and quick by adding a description for failed tests that will include a last error message from the test log.

You will not need to open an every single test to see the failure reason. With this new functionality you will see test failures reasons right in a table on All launches (step level), so that you can perform group actions to items.

How to activate this option:

Change your listener to wrap log messages on error level with special text:

    <place your error message here>

We have prepared an example how to extend a TestNG agent, and you can find it below:

An extend agent service:

    public static class ParamTaggingTestNgService extends TestNGService {

public ParamTaggingTestNgService(ListenerParameters parameters, ReportPortalClient reportPortalClient) {
super(parameters, reportPortalClient);
}

@Override
protected StartTestItemRQ buildStartStepRq(ITestResult testResult) {
final StartTestItemRQ rq = super.buildStartStepRq(testResult);
if (testResult.getParameters() != null && testResult.getParameters().length != 0) {
final Set<String> tags = Optional.fromNullable(rq.getTags()).or(new HashSet<>());
for (Object param : testResult.getParameters()) {
tags.add(param.toString());
}
rq.setTags(tags);

}
return rq;
}

@Override
protected FinishTestItemRQ buildFinishTestMethodRq(String status, ITestResult testResult) {
FinishTestItemRQ finishTestItemRQ = super.buildFinishTestMethodRq(status, testResult);
if (testResult.getThrowable() != null) {
String description =
"```error\n"
+ Throwables.getStackTraceAsString(testResult.getThrowable())
+ "\n```";
description = description + Throwables.getStackTraceAsString(testResult.getThrowable());
finishTestItemRQ.setDescription(description);
}
return finishTestItemRQ;
}
}

An extend listener with your extended service:

    public static class ExtendedListener extends BaseTestNGListener {
public ExtendedListener() {
super(override(new TestNGAgentModule()).with((Module) binder -> binder.bind(ITestNGService.class)
.toProvider(new TestNGProvider() {
@Override
protected TestNGService createTestNgService(ListenerParameters listenerParameters,
ReportPortalClient reportPortalClient) {
return new ParamTaggingTestNgService(listenerParameters, reportPortalClient);
}
})));
}
}
- - +

How to add a test stack trace to a description automatically

You can make your process of a test analysis more convenient and quick by adding a description for failed tests that will include a last error message from the test log.

You will not need to open an every single test to see the failure reason. With this new functionality you will see test failures reasons right in a table on All launches (step level), so that you can perform group actions to items.

How to activate this option:

Change your listener to wrap log messages on error level with special text:

    <place your error message here>

We have prepared an example how to extend a TestNG agent, and you can find it below:

An extend agent service:

    public static class ParamTaggingTestNgService extends TestNGService {

public ParamTaggingTestNgService(ListenerParameters parameters, ReportPortalClient reportPortalClient) {
super(parameters, reportPortalClient);
}

@Override
protected StartTestItemRQ buildStartStepRq(ITestResult testResult) {
final StartTestItemRQ rq = super.buildStartStepRq(testResult);
if (testResult.getParameters() != null && testResult.getParameters().length != 0) {
final Set<String> tags = Optional.fromNullable(rq.getTags()).or(new HashSet<>());
for (Object param : testResult.getParameters()) {
tags.add(param.toString());
}
rq.setTags(tags);

}
return rq;
}

@Override
protected FinishTestItemRQ buildFinishTestMethodRq(String status, ITestResult testResult) {
FinishTestItemRQ finishTestItemRQ = super.buildFinishTestMethodRq(status, testResult);
if (testResult.getThrowable() != null) {
String description =
"```error\n"
+ Throwables.getStackTraceAsString(testResult.getThrowable())
+ "\n```";
description = description + Throwables.getStackTraceAsString(testResult.getThrowable());
finishTestItemRQ.setDescription(description);
}
return finishTestItemRQ;
}
}

An extend listener with your extended service:

    public static class ExtendedListener extends BaseTestNGListener {
public ExtendedListener() {
super(override(new TestNGAgentModule()).with((Module) binder -> binder.bind(ITestNGService.class)
.toProvider(new TestNGProvider() {
@Override
protected TestNGService createTestNgService(ListenerParameters listenerParameters,
ReportPortalClient reportPortalClient) {
return new ParamTaggingTestNgService(listenerParameters, reportPortalClient);
}
})));
}
}
+ + \ No newline at end of file diff --git a/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace/index.html b/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace/index.html index fd27c4a7b..29a4f839d 100644 --- a/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace/index.html +++ b/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpace/index.html @@ -12,15 +12,15 @@ - - + +
-

How to avoid local execution reported into project space

Option 1:

Use a specific attribute for launches, which should represent the state.

Create filters using those attributes. Build widgets and dashboards, based on those attributes.

You can add those additional attributes via the CI command line.

So, only Jenkins will generate launches with those attributes.

Option 2:

Put rp.mode=debug in all reportportal.properties files.

For Jenkins executions, overload this param via the command line as rp.mode=default,

so that all local launches will be in debug, all Jenkins – in launches.

Option 3:

Combine option #2 and option #3, in the launch name.

rp.launch=xxx saved in all reportportal.properties files.

For Jenkins executions, overload this param via the command line as rp.launch=yyy

The auto-analysis will use only yyy launches for review.

Use filter, based on your yyy name for widgets.

Option 4:

The same like option 2, but with rp.enable=false|true

This will turn off reporting for local launches

Option 5:

Set all users on the project with the Role Operator. This role can’t report data into RP.

Create an internal user for Jenkins executions, set him/her as a PROJECT MANAGER role.

This will make it possible to create launches only for Jenkins users

note

It is also possible to combine all those options at the same time.

- - +

How to avoid local execution reported into project space

Option 1:

Use a specific attribute for launches, which should represent the state.

Create filters using those attributes. Build widgets and dashboards, based on those attributes.

You can add those additional attributes via the CI command line.

So, only Jenkins will generate launches with those attributes.

Option 2:

Put rp.mode=debug in all reportportal.properties files.

For Jenkins executions, overload this param via the command line as rp.mode=default,

so that all local launches will be in debug, all Jenkins – in launches.

Option 3:

Combine option #2 and option #3, in the launch name.

rp.launch=xxx saved in all reportportal.properties files.

For Jenkins executions, overload this param via the command line as rp.launch=yyy

The auto-analysis will use only yyy launches for review.

Use filter, based on your yyy name for widgets.

Option 4:

The same like option 2, but with rp.enable=false|true

This will turn off reporting for local launches

Option 5:

Set all users on the project with the Role Operator. This role can’t report data into RP.

Create an internal user for Jenkins executions, set him/her as a PROJECT MANAGER role.

This will make it possible to create launches only for Jenkins users

note

It is also possible to combine all those options at the same time.

+ + \ No newline at end of file diff --git a/issues-troubleshooting/HowToCheckLDAPConnection/index.html b/issues-troubleshooting/HowToCheckLDAPConnection/index.html index 45ae68fa5..5887ea230 100644 --- a/issues-troubleshooting/HowToCheckLDAPConnection/index.html +++ b/issues-troubleshooting/HowToCheckLDAPConnection/index.html @@ -12,15 +12,15 @@ - - + +
-

How to check LDAP connection

Firstly, check the availability of your LDAP server from the server when ReportPortal is installed. For example, use the command ldapsearch.

ldapsearch -x -h <ldap hostname> -p <ldap port> -D "<bind DN>" -w "<bind password>" -b "<base users DN>" "uid=user1"

Output will be:

# extended LDIF
#
# LDAPv3
# base <dc=rp,dc=com> with scope subtree
# filter: uid=user1
# requesting: ALL
#

# user1, people, rp.com
dn: cn=tester,ou=people,dc=rp,dc=com
objectClass: inetOrgPerson
cn: user1
sn: user1
uid: user1
userPassword:: PASSWORD
mail: user1@rp.com
description: user1 for experiments

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Hints

If you are using docker you can also use the internal container IP docker inspect -f '\{{range .NetworkSettings.Networks}}\{{.IPAddress}}\{{end}}' <LDAP container name>

- - +

How to check LDAP connection

Firstly, check the availability of your LDAP server from the server when ReportPortal is installed. For example, use the command ldapsearch.

ldapsearch -x -h <ldap hostname> -p <ldap port> -D "<bind DN>" -w "<bind password>" -b "<base users DN>" "uid=user1"

Output will be:

# extended LDIF
#
# LDAPv3
# base <dc=rp,dc=com> with scope subtree
# filter: uid=user1
# requesting: ALL
#

# user1, people, rp.com
dn: cn=tester,ou=people,dc=rp,dc=com
objectClass: inetOrgPerson
cn: user1
sn: user1
uid: user1
userPassword:: PASSWORD
mail: user1@rp.com
description: user1 for experiments

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Hints

If you are using docker you can also use the internal container IP docker inspect -f '\{{range .NetworkSettings.Networks}}\{{.IPAddress}}\{{end}}' <LDAP container name>

+ + \ No newline at end of file diff --git a/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack/index.html b/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack/index.html index 199a95ebd..df37bb333 100644 --- a/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack/index.html +++ b/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepack/index.html @@ -12,16 +12,16 @@ - - + +
-

How to clean up the ReportPortal database using PG_REPACK

Description

pg_repack is a PostgreSQL extension that lets you remove bloat from tables and indexes, and optionally restore the physical order of clustered indexes. Unlike CLUSTER and VACUUM FULL it works online, without holding an exclusive lock on the processed tables during processing. pg_repack is efficient to boot, with performance comparable to using CLUSTER directly.

Performance

Initial Database SizeFinal Database SizeRepack durationDuration
1500 Gb251 Gb1200 Gb7 hours

Overall pg_repack performance has been tested during load tests running and without. The database load during pg_repack is pretty good by capacity and instance   +

How to clean up the ReportPortal database using PG_REPACK

Description

pg_repack is a PostgreSQL extension that lets you remove bloat from tables and indexes, and optionally restore the physical order of clustered indexes. Unlike CLUSTER and VACUUM FULL it works online, without holding an exclusive lock on the processed tables during processing. pg_repack is efficient to boot, with performance comparable to using CLUSTER directly.

Performance

Initial Database SizeFinal Database SizeRepack durationDuration
1500 Gb251 Gb1200 Gb7 hours

Overall pg_repack performance has been tested during load tests running and without. The database load during pg_repack is pretty good by capacity and instance   High DB RAM Utilization faced at the pr_repack starting, but then the overall RAM Usage becomes normal. During reporting(load tests running) faced small response times and throughput degradation around 10 minutes, but then they became a regular performance. Also, no KO requests during reporting and pg_repack run in parallel, so that all Staging pg_repack configuration can be safely porting to Production.

Detailed DB Resource Utilization Stats

ResourcesUsed
CPU utilization13 %
CPU IOwait7%
Disk IO Read/Write1800/30000 IOPS

PG_REPACK installation

To install PG_REPACK use the guide from the official GitHub page. If you use Amazon RDS follow the link

PG_REPACK usage

  • Attach to Screen session:
screen

For more information about the Screen read this guide.

  • You need to add the path to the PG_REPACK executable file. The PATH variable is an environment variable that contains an ordered list of paths that Unix will search for executables when running a command. Run the following command:
export PATH=$PATH:/usr/pgsql-12/bin/
  • Create .pgpass file and fill your data. The file .pgpass the file referenced by PGPASSFILE contain passwords to be used if the connection requires a password. Documentation.
cat << EOF | tee -a /.pgpass
<database_host>:<database_port>:<database_name>:<database_user>:<database_password>
EOF

For example, .pgpass file should look like this:

reportportal-cdufjldqrau0.eu-west-3.rds.amazonaws.com:5432:reportportal:rpuser:strongpassword
  • Change permissions to .pgpasss file:
chmod 600 /.pgpass
  • Set PGPASSFILE environment variable:
export PGPASSFILE='/.pgpass'
  • Fill your data and run PG_REPACK:
pg_repack -h <database_address> -U <database_user> -k <database_name> &>> /pg_repack-rpdb.log

No password is needed for the database because you are using .pgpass.

When you run the command, you will get artifact pg_repack-rpdb.log, where PG_REPACK will storage the logs. The pg_repack-rpdb.log file is stored in your root directory /.

  • To detach from the Screen session type Control+a+d (on OSX and Linux). The result will be similar to:
[detached from 22556.pts-0.ip-10-68-38-165]

22556 is ID of you screen session. You will get a different ID. Save it.

  • Attach to the Screen session:
screen -r

If you have one Screen session, you will join it. If you have two or more of them, you will get the following result:

There are several suitable screens on:
22556.pts-0.ip-10-68-38-165 (Detached)
8175.pts-0.ip-10-68-38-165 (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

To join the PG_REPACK Screen session fill your Screen ID that you saved in step 4 and run the following command:

screen -r <your_screen_id>
  • To view the process of running the command you can read pg_repack-rpdb.log with command:
cat /pg_repack-rpdb.log

In addition, you can stream log with the command:

tail -F /pg_repack-rpdb.log

Type Control+c (on OSX and Linux) to exit from Tail

- - + + \ No newline at end of file diff --git a/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull/index.html b/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull/index.html index d2fc33999..16f0633a8 100644 --- a/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull/index.html +++ b/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFull/index.html @@ -12,20 +12,20 @@ - - + +
-

How to clean up the ReportPortal database using VACUUM FULL

General information

VACUUM reclaims storage occupied by dead tuples. In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. Therefore it's necessary to do VACUUM periodically, especially on frequently-updated tables. +

How to clean up the ReportPortal database using VACUUM FULL

General information

VACUUM reclaims storage occupied by dead tuples. In normal PostgreSQL operation, tuples that are deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. Therefore it's necessary to do VACUUM periodically, especially on frequently-updated tables. VACUUM ANALYZE performs a VACUUM and then an ANALYZE for each selected table. This is a handy combination form for routine maintenance scripts. See PostgreSQL documentation for more details about those operations. Plain VACUUM (without FULL) simply reclaims space and makes it available for re-use. This form of the command can operate in parallel with normal reading and writing of the table, as an exclusive lock is not obtained. However, extra space is not returned to the operating system (in most cases); it's just kept available for re-use within the same table. VACUUM FULL rewrites the entire contents of the table into a new disk file with no extra space, allowing unused space to be returned to the operating system. This form is much slower and requires an exclusive lock on each table while it is being processed.

The main goals for performing VACUUM FULL at the ReportPoral database:

  • improve DB queries performance by removing dead tuples and updating statistics;
  • reclaim storage space occupied by dead tuples;
  • prevent bloating tables.

Parameters

ParameterDescription
FULLSelects "full" vacuum, which can reclaim more space, but takes much longer and exclusively locks the table. This method also requires extra disk space, since it writes a new copy of the table and doesn't release the old copy until the operation is complete. Usually this should only be used when a significant amount of space needs to be reclaimed from within the table.
FREEZESelects aggressive "freezing" of tuples. Specifying FREEZE is equivalent to performing VACUUM with the vacuum_freeze_min_age and vacuum_freeze_table_age parameters set to zero. Aggressive freezing is always performed when the table is rewritten, so this option is redundant when FULL is specified.
VERBOSEPrints a detailed vacuum activity report for each table.
ANALYZEUpdates statistics used by the planner to determine the most efficient way to execute a query.

⚠️ Important notes

  1. Assuming that VACUUM FULL required exclusive locks on the tables and required high time-consuming on the large databases, the suggestions are:

    • conduct testing of the VACUUM FULL execution at Staging/Dev/Non-Prod environment;
    • schedule the particular downtime for the Production database and shut down the application services except for the database.
  2. Сheck that the database disk has free space equal to or greater than the size of the largest table(with its indexes) in the database.

The main suggestion is to perform VACUUM FULL operation periodically not for the whole database, but only for the particular tables defined below, which helps increase overall SQL queries performance. VACUUM FULL frequency for the databases more than 1Tb with high reporting amount - at least once per 3 months.

Tables list and it's operations duration on our database(AWS RDS PostgreSQL Database spec: db.m5.4xlarge 16CPUs, 64Gb RAM):

TableRows countVACUUM OperationDuration
log614 372 224FULL14h 30m
log614 372 224ANALYZE1h 30m
test_item207 311 552FULL1h 50m
test_item207 311 552ANALYZE21m
statistics299 341 024FULL10m
statistics299 341 024ANALYZE3m 49s
test_item_results450 264 992FULL9m
test_item_results450 264 992ANALYZE4m 12s

VACUUM FULL execution

Preconditions: Apply next configuration to PostgreSQL Parameter Group(database restart not needed after applying):

maintenance_work_mem=8000000
max_parallel_maintenance_workers=16
  • Configuration examples are defined for the database shape 16CPU, 64Gb RAM. The suggestion for other database shapes are: for maintenance_work_mem - 1/4 part of the total database RAM size; max_parallel_maintenance_workers - database CPUs count.

Perform VACUUM FULL and ANALYZE on the each database table using the query:

VACUUM (FULL, ANALYZE) my_table

Or perform VACUUM FULL and VACUUM ANALYZE on all tables in the database using commands sequentially:

VACUUM FULL
VACUUM ANALYZE

Postconditions: Apply regular configuration to PostgreSQL Parameter Group(database restart not needed after applying):

maintenance_work_mem=2000000
max_parallel_maintenance_workers=8

Useful PostgreSQL queries

Total database size:

SELECT pg_size_pretty(pg_database_size('reportportal'));

Show autovacuum stats:

SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables;

Detailed statistic by each table and indexes:

SELECT *, pg_size_pretty(total_bytes) AS total
, pg_size_pretty(index_bytes) AS index
, pg_size_pretty(toast_bytes) AS toast
, pg_size_pretty(table_bytes) AS table
FROM (
SELECT *, total_bytes-index_bytes-coalesce(toast_bytes,0) AS table_bytes FROM (
SELECT c.oid,nspname AS table_schema, relname AS table_name
, c.reltuples AS row_estimate
, pg_total_relation_size(c.oid) AS total_bytes
, pg_indexes_size(c.oid) AS index_bytes
, pg_total_relation_size(reltoastrelid) AS toast_bytes
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE relkind = 'r'
) a
) a;

Dead tuples amount per table:

SELECT relname, n_dead_tup FROM pg_stat_user_tables order by n_dead_tup desc;
- - + + \ No newline at end of file diff --git a/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion/index.html b/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion/index.html index 270bb88f8..68cb9b0ff 100644 --- a/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion/index.html +++ b/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersion/index.html @@ -12,16 +12,16 @@ - - + +
-

How to resolve issues with migration to the new version

Error: Dirty database version XX. Fix and force version.

That means, migration process has been interrupted during XX migration (migration has been started but not finished)

  1. At first, you need to check the logs of migration (service itselft and database), it can be helpful, if yes, make some actions based on logs, if not then move next.
  2. You need to rollback all applied (if any) migration XX parts.

The format for url is the next:

https://github.com/reportportal/migrations/blob/develop/migrations/XX_some_name.up.sql

(Usually nothing to rollback, but need check)

  1. Change in schema_migrations table, change values in this table to version=XX-1 (previous successful migration number), and dirty flag set to true.
  2. Restart migration.

For instance, if you have "Error: Dirty database version 10. Fix and force version."

  1. Check the logs(service itselft and database), in case we've found nothing, move next.
  2. You need to check 10 migration (https://github.com/reportportal/migrations/blob/develop/migrations/10_attachment_size.up.sql) and rollback if you have some partly migration.
  3. Then execute #update schema_migrations set version=9, dirty=f
  4. Redeploy RP based on docker-composer for example (migration should be started automatically, if you followed by instructions of installation for this way.)

Error: org.jasypt.exceptions.EncryptionOperationNotPossibleException: null. API doesn't start. ReportPortal unavailable.

Minio files are used during migration to change integration passwords encryption. +

How to resolve issues with migration to the new version

Error: Dirty database version XX. Fix and force version.

That means, migration process has been interrupted during XX migration (migration has been started but not finished)

  1. At first, you need to check the logs of migration (service itselft and database), it can be helpful, if yes, make some actions based on logs, if not then move next.
  2. You need to rollback all applied (if any) migration XX parts.

The format for url is the next:

https://github.com/reportportal/migrations/blob/develop/migrations/XX_some_name.up.sql

(Usually nothing to rollback, but need check)

  1. Change in schema_migrations table, change values in this table to version=XX-1 (previous successful migration number), and dirty flag set to true.
  2. Restart migration.

For instance, if you have "Error: Dirty database version 10. Fix and force version."

  1. Check the logs(service itselft and database), in case we've found nothing, move next.
  2. You need to check 10 migration (https://github.com/reportportal/migrations/blob/develop/migrations/10_attachment_size.up.sql) and rollback if you have some partly migration.
  3. Then execute #update schema_migrations set version=9, dirty=f
  4. Redeploy RP based on docker-composer for example (migration should be started automatically, if you followed by instructions of installation for this way.)

Error: org.jasypt.exceptions.EncryptionOperationNotPossibleException: null. API doesn't start. ReportPortal unavailable.

Minio files are used during migration to change integration passwords encryption. Files in Minio may be corrupted and deleted somehow before migration during Reportportal usage.

Removing existing integrations from db before deploying can help. Creation of a new integration will use a new encryption type.

  1. Execute the next script in database to remove existing integrations before deploy:
DELETE FROM integration WHERE type IN (SELECT id FROM integration_type WHERE name IN ('email', 'jira', 'ldap', 'ad'));

  1. Deploy Reportportal
  2. Create integrations again
- - + + \ No newline at end of file diff --git a/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve/index.html b/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve/index.html index a868d96f1..57d7f1ffd 100644 --- a/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve/index.html +++ b/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolve/index.html @@ -12,14 +12,14 @@ - - + +
-

Issues with JIRA bug tracking system: how to resolve

In case user is connecting to JIRA system and gets the error like +

Issues with JIRA bug tracking system: how to resolve

In case user is connecting to JIRA system and gets the error like "Impossible interact with external system.<name of current user's project>", there are some reasons could cause the issue.

First, verify that the link to JIRA system is correct. There are some variants are possible, for instance:

https://jira.company.com/jira
https://jiraeu.company.com

Second, verify the project name is correct. Please fill in Project name field with @@ -32,7 +32,7 @@ login name and password into the fields)

  • Submit the login form Screen with CAPTCHA should appears
  • Enter the symbols
  • Submit the credentials again
  • Now try to establish the connection to JIRA on ReportPortal project.
  • Fourth, maybe the connection to the jira instance requires a certificate, in this case you need to import the certificate inside the jira container:

    1. docker exec -it reportportal_jira_1 ash # go inside shell
    2. cd /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
    3. wget url://to/your/foo.cert
    4. keytool -importcert -noprompt -file foo.crt -alias "JIRA CERT" -keystore cacerts -storepass abc123 (default password for keystore: changeit)
    5. exit and restart the docker jira
    6. Now try to establish the connection to JIRA on ReportPortal project.

    or

    1. docker cp cert.der reportportal_jira_1:/cert.der
    2. docker exec -t -i reportportal_jira_1 ./usr/lib/jvm/java-1.8-openjdk/jre/bin/keytool -import -alias rootcert -keystore /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/cacerts -file /cert.der
    3. exit and restart the docker jira
    4. Now try to establish the connection to JIRA on ReportPortal project.
    note

    SSL instance of JIRA (even cloud version) can be accessed by JIRA API token, used instead of password.

    If these didn't resolve your issues, please contact us.

    - - + + \ No newline at end of file diff --git a/issues-troubleshooting/IssuesWithLDAPSHowToResolve/index.html b/issues-troubleshooting/IssuesWithLDAPSHowToResolve/index.html index da1aba87b..93e751b0f 100644 --- a/issues-troubleshooting/IssuesWithLDAPSHowToResolve/index.html +++ b/issues-troubleshooting/IssuesWithLDAPSHowToResolve/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Issues with LDAPS: how to resolve

    When configuring LDAP to work with ldaps:// users may see the following error when trying to log in:

    sun.security.validator.ValidatorException: PKIX path building failed: 
    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.

    This error can be solved by importing the needed certificate within the authorization container:

    # Enter service-authorization container as root
    docker exec -u 0 -it reportportal_uat_1 sh

    # Download certificates
    cd /usr/local/share/ca-certificates/
    wget url://to/your/foo.cert

    # Import the cert to keytool. if password is required the default should be "changeit"
    $JAVA_HOME/bin/keytool -import -alias ldap_cert -keystore $JAVA_HOME/lib/security/cacerts -file /usr/local/share/ca-certificates/foo.cert

    # exit container and restart it
    docker restart reportportal_uat_1
    - - +

    Issues with LDAPS: how to resolve

    When configuring LDAP to work with ldaps:// users may see the following error when trying to log in:

    sun.security.validator.ValidatorException: PKIX path building failed: 
    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.

    This error can be solved by importing the needed certificate within the authorization container:

    # Enter service-authorization container as root
    docker exec -u 0 -it reportportal_uat_1 sh

    # Download certificates
    cd /usr/local/share/ca-certificates/
    wget url://to/your/foo.cert

    # Import the cert to keytool. if password is required the default should be "changeit"
    $JAVA_HOME/bin/keytool -import -alias ldap_cert -keystore $JAVA_HOME/lib/security/cacerts -file /usr/local/share/ca-certificates/foo.cert

    # exit container and restart it
    docker restart reportportal_uat_1
    + + \ No newline at end of file diff --git a/issues-troubleshooting/ResolveAnalyzerKnownIssues/index.html b/issues-troubleshooting/ResolveAnalyzerKnownIssues/index.html index be4cdbe68..ecaa0f885 100644 --- a/issues-troubleshooting/ResolveAnalyzerKnownIssues/index.html +++ b/issues-troubleshooting/ResolveAnalyzerKnownIssues/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Resolve Analyzer Known Issues

    Problem 1. Auto-Analyser doesn't work. Analyzer health check status failed: Elasticsearch is not healthy

    Problem Description

    Analyzer log:

    2021-09-09 11:34:47,927 - analyzerApp - ERROR - Analyzer health check status failed: Elasticsearch is not healthy;
    [pid: 10|app: 0|req: 1/3] 127.0.0.1 () {28 vars in 294 bytes} [Thu Sep 9 11:34:46 2021] GET / => generated 43 bytes in 1643 msecs (HTTP/1.1 503) 3 headers in 120 bytes (1 switches on core 0)
    2021-09-09 11:35:48,737 - analyzerApp.utils - ERROR - Error with loading url: http://elasticsearch:9200/_cluster/health
    2021-09-09 11:35:48,752 - analyzerApp.utils - ERROR - HTTPConnectionPool(host='elasticsearch', port=9200): Max retries exceeded with url: /_cluster/health (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f5cb82d4290>: Failed to establish a new connection: [Errno 111] Connection refused'))
    2021-09-09 11:35:48,753 - analyzerApp.esclient - ERROR - Elasticsearch is not healthy
    2021-09-09 11:35:48,753 - analyzerApp.esclient - ERROR - list indices must be integers or slices, not str

    ElasticSearch container restarting all the time:

    STATUS                                     NAMES
    Up Less than a second (health: starting) reportportal_elasticsearch_1

    Solution

    Create a directory for ElasticSearch and assign permissions with the following commands

    mkdir -p data/elasticsearch
    chmod 777 data/elasticsearch
    chgrp 1000 data/elasticsearch

    Recreate ReportPortal services.

    Problem 2. Auto-Analyser doesn't work. KeyError: 'found_test_and_methods' not found

    Problem Description

    2021-09-09 11:35:48,737 - analyzerApp.utils - ERROR - KeyError: 'found_test_and_methods' not found

    Solution

    Regenerate index in the ElasticSearch. Project settings -> Auto-Analysis -> Genetate Index

    Problem 3. Amqp connection was not established

    Problem Description

    2021-09-09 11:32:00,579 - analyzerApp - INFO - Starting waiting for AMQP connection
    2021-09-09 11:32:00,586 - analyzerApp.amqp - INFO - Try connect to amqp://rabbitmq:5672/analyzer?heartbeat=600
    2021-09-09 11:32:00,595 - analyzerApp - ERROR - Amqp connection was not established

    Solution

    RabbitMQ container is not running. Wait for status running or recreate the RabbitMQ container.

    Problem 4. Performance

    Problem Description

    Slowing down analysis or waiting for a long time fore responce.

    Analyzer logs:

    DAMN ! worker 1 (pid: 9191) died, killed by signal 9 :( trying respawn ...
    Respawned uWSGI worker 1 (new pid: 9490)

    Solution

    Increase VM stats. We recommend using the minimum memory:

    Also you can reduce the number of Analyzer processes with processing environment variable UWSGI_WORKERS: 2 (default 4), then:

    However, UWSGI_WORKERS will slow down the Analyzer.

    - - +

    Resolve Analyzer Known Issues

    Problem 1. Auto-Analyser doesn't work. Analyzer health check status failed: Elasticsearch is not healthy

    Problem Description

    Analyzer log:

    2021-09-09 11:34:47,927 - analyzerApp - ERROR - Analyzer health check status failed: Elasticsearch is not healthy;
    [pid: 10|app: 0|req: 1/3] 127.0.0.1 () {28 vars in 294 bytes} [Thu Sep 9 11:34:46 2021] GET / => generated 43 bytes in 1643 msecs (HTTP/1.1 503) 3 headers in 120 bytes (1 switches on core 0)
    2021-09-09 11:35:48,737 - analyzerApp.utils - ERROR - Error with loading url: http://elasticsearch:9200/_cluster/health
    2021-09-09 11:35:48,752 - analyzerApp.utils - ERROR - HTTPConnectionPool(host='elasticsearch', port=9200): Max retries exceeded with url: /_cluster/health (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f5cb82d4290>: Failed to establish a new connection: [Errno 111] Connection refused'))
    2021-09-09 11:35:48,753 - analyzerApp.esclient - ERROR - Elasticsearch is not healthy
    2021-09-09 11:35:48,753 - analyzerApp.esclient - ERROR - list indices must be integers or slices, not str

    ElasticSearch container restarting all the time:

    STATUS                                     NAMES
    Up Less than a second (health: starting) reportportal_elasticsearch_1

    Solution

    Create a directory for ElasticSearch and assign permissions with the following commands

    mkdir -p data/elasticsearch
    chmod 777 data/elasticsearch
    chgrp 1000 data/elasticsearch

    Recreate ReportPortal services.

    Problem 2. Auto-Analyser doesn't work. KeyError: 'found_test_and_methods' not found

    Problem Description

    2021-09-09 11:35:48,737 - analyzerApp.utils - ERROR - KeyError: 'found_test_and_methods' not found

    Solution

    Regenerate index in the ElasticSearch. Project settings -> Auto-Analysis -> Genetate Index

    Problem 3. Amqp connection was not established

    Problem Description

    2021-09-09 11:32:00,579 - analyzerApp - INFO - Starting waiting for AMQP connection
    2021-09-09 11:32:00,586 - analyzerApp.amqp - INFO - Try connect to amqp://rabbitmq:5672/analyzer?heartbeat=600
    2021-09-09 11:32:00,595 - analyzerApp - ERROR - Amqp connection was not established

    Solution

    RabbitMQ container is not running. Wait for status running or recreate the RabbitMQ container.

    Problem 4. Performance

    Problem Description

    Slowing down analysis or waiting for a long time fore responce.

    Analyzer logs:

    DAMN ! worker 1 (pid: 9191) died, killed by signal 9 :( trying respawn ...
    Respawned uWSGI worker 1 (new pid: 9490)

    Solution

    Increase VM stats. We recommend using the minimum memory:

    Also you can reduce the number of Analyzer processes with processing environment variable UWSGI_WORKERS: 2 (default 4), then:

    However, UWSGI_WORKERS will slow down the Analyzer.

    + + \ No newline at end of file diff --git a/issues-troubleshooting/TuningCITool/index.html b/issues-troubleshooting/TuningCITool/index.html index df1ccfb39..dc27a2dae 100644 --- a/issues-troubleshooting/TuningCITool/index.html +++ b/issues-troubleshooting/TuningCITool/index.html @@ -12,17 +12,17 @@ - - + +
    -

    Tuning CI tool

    How to provide parameters via system variables in the CI tool (for example - Jenkins) for our continuous testing platform.

    In order to provide specific parameters (Such as attributes) for different +

    Tuning CI tool

    How to provide parameters via system variables in the CI tool (for example - Jenkins) for our continuous testing platform.

    In order to provide specific parameters (Such as attributes) for different executions that are based on the parameters loading order, you can provide them as system variables.

    To do so, follow the steps below:

    1. Open the Job configuration in Jenkins.
    1. Select the "This build is parameterized" check-box.

    2. Click the "Add Parameter" and select "Text Parameter".

    1. Define any name for the parameter and set the default value (note that attributes should have semicolon-separated values, with no spaces).
    1. Update the execution command at the "Build" section: add ReportPortal parameters using –D for a system variable parameters. For attributes it is "rp.tags":
    1. Click the "Build with Parameters" button.
    1. In the opened dialog, specify the needed parameters, using semicolons to separate values.
    1. Then Click the "Build" button.
    - - + + \ No newline at end of file diff --git a/log-data-in-reportportal/HowToRunYourTests/index.html b/log-data-in-reportportal/HowToRunYourTests/index.html index f94523f70..c0e5a388e 100644 --- a/log-data-in-reportportal/HowToRunYourTests/index.html +++ b/log-data-in-reportportal/HowToRunYourTests/index.html @@ -12,16 +12,16 @@ - - + +
    -

    How to run your tests

    Automated tests can be executed in the any CI tool you are using on the project (Jenkins, Bamboo, Azure DevOps, GitHub Actions, CircleCI, TeamCity, GitLab, Travis CI, Codeship, Buddy, GoCD, Wercker and more). +

    - - + + \ No newline at end of file diff --git a/log-data-in-reportportal/ImplementOwnIntegration/index.html b/log-data-in-reportportal/ImplementOwnIntegration/index.html index 455a59198..de037fff6 100644 --- a/log-data-in-reportportal/ImplementOwnIntegration/index.html +++ b/log-data-in-reportportal/ImplementOwnIntegration/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/ImportDataToReportPortal/index.html b/log-data-in-reportportal/ImportDataToReportPortal/index.html index 4b9585191..70b9b602a 100644 --- a/log-data-in-reportportal/ImportDataToReportPortal/index.html +++ b/log-data-in-reportportal/ImportDataToReportPortal/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Import data to ReportPortal

    Import functionality gives the opportunity to upload log files via UI. +

    Import data to ReportPortal

    Import functionality gives the opportunity to upload log files via UI. To start the import process, you should hit the 'Import' button on the Launch page (All Launches tab). In a new pop-up window 'Import Launch' you can drop files or add them by adding a link.

    ReportPortal checks file size and format first. Imported files should meet the following requirements:

    • File format is zip archive or XML file.
    • File size is up to 32Mb.
    • Timestamp format is 2022-11-17T10:15:43

    If the file format is incorrect, it is marked in red and the reason is shown in the tooltip on hovering over the file in the pop-up window. This is to prevent any incorrect files from being run through the import process.

    If all the files added are correct you may hit the 'Import' or 'Cancel' buttons:

    • The Cancel button closes the pop-up window without any operation under log files.
    • The Import button starts copying files into the RP file storage and disables the 'Import' button.

    The System will start copying files into the RP file storage if the files meet the following requirements:

    • The File format is a zip archive.
    • The File size is up to 32Mb.
    • The XML files must have the JUnit structure in the zip archive.

    The system copies valid XML files into RP file storage and marked them in green in the Import pop-up window.

    If files from the zip archive have formats other than XML, the system will skip them.

    If the XML file is not in the JUnit structure, the system will interrupt the process of copying and mark the file in red. The reason is then shown on the tooltip when hovering the file in the pop-up window.

    note

    Files that were copied earlier stay in the RP file storage

    When all of the valid log files are downloaded and processed the 'OK' button is enabled. The 'OK' button closes the Import launches pop-up window. The Zip archive is then deleted after the Import is finished or canceled.

    You can only interrupt the import in UI when files are being downloaded into the RP file storage. In this case, you should hit the 'Cancel' button (or X button in the pop-up window) and confirm the cancellation of import and then hit the 'Cancel' button again.

    Import via API

    The details about import via API you can find on the ReportPortal menu at the bottom: API -> launch controller -> Import junit xml report

    You can configure parameters (name, description, attributes) for the imported launch by specifying these values in your API request.

    The endpoint POST /v1/{projectName}/launch/import allows importing a launch into the specified project using an XML or ZIP file in JUnit format.

    Permissions: Admin, PM, Member, Customer, Operator.

    Here's an example of a request to the endpoint:

    curl -X 'POST' \
    'http://localhost:8585/api/v1/testProject/launch/import?attributeKey=someKey&attributeValue=someValue&description=someDescription&launchName=someName&skippedIsNotIssue=true' \
    -F 'file=@Launch.zip;type=application/x-zip-compressed'

    Query parameters:

    attributeKey (String) – Launch attribute key. If this parameter is specified, "attributeValue" is required.

    attributeValue (String) – Launch attribute value. Can be specified without the "attributeKey" parameter.

    description (String) – Launch description.

    launchName (String) – Launch name. If this parameter is not specified, the file name will be used as the launch name.

    skippedIsNotIssue (Boolean) – When set to "true", all skipped issues are processed without applying a defect type; when set to "false", skipped issues are processed and marked with the defect type "To Investigate". If the parameter is not set, the default behavior is equivalent to "false".

    note

    These parameters are optional and can be used individually, in any combination, or all together.

    Scenario 1

    If you want to mark skipped items as "To Investigate", use the following request:

    curl -X 'POST' 'http://localhost:8585/api/v1/testProject/launch/import'

    Scenario 2

    If you don't want to mark skipped items as "To Investigate", use the following request:

    curl -X 'POST' 'http://localhost:8585/api/v1/testProject/launch/import?skippedIsNotIssue=true'
    - - + + \ No newline at end of file diff --git a/log-data-in-reportportal/ReportingSDK/index.html b/log-data-in-reportportal/ReportingSDK/index.html index 973109ccb..a5a4acae6 100644 --- a/log-data-in-reportportal/ReportingSDK/index.html +++ b/log-data-in-reportportal/ReportingSDK/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/index.html b/log-data-in-reportportal/index.html new file mode 100644 index 000000000..776a75eaa --- /dev/null +++ b/log-data-in-reportportal/index.html @@ -0,0 +1,26 @@ + + + + + +Log data in ReportPortal | ReportPortal Documentation + + + + + + + + + + + + + + +
    +

    Log data in ReportPortal

    ReportPortal is a CI/CD agnostic tool. Therefore, you can continue using your favorite CI/CD tool (GitLab, Jenkins, GitHub, Azure DevOps, Bamboo) to send data to ReportPortal and get test results of execution.

    The data transmission is regulated not by the CI/CD process, but by the test framework. The only requirement is to ensure that the machine where your CI/CD is located has access to the ReportPortal instance to which you are trying to send the data.

    As for test frameworks, a generic approach is to set the address of ReportPortal and other data in your test framework via properties or a configuration file, and your test framework will start reporting data to ReportPortal.

    ReportPortal supports various frameworks. For example, we have integration with Java frameworks (TestNG, Jbehave, etc.), Python frameworks (Pytest, Robot Framework, etc.), JavaScript frameworks (Playwright, Postman, etc.), .NET frameworks (NUnit, VSTest, etc.).

    Integration with ReportPortal is not dependent on the type of tests you run. It can be API tests, integration tests, or UI tests such as Selenium, Cypress, so, you can run different types of tests and get test results.

    ReportPortal can be integrated with external services, enabling you to report test results from platforms like Browserstack, Sauce Labs, and other third-party services. For Sauce Labs integration, we have a plugin.

    + + + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Cucumber/index.html b/log-data-in-reportportal/test-framework-integration/Java/Cucumber/index.html index 83c7a7ed2..2ac72a067 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Cucumber/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Cucumber/index.html @@ -12,15 +12,15 @@ - - + +
    -

    ReportPortal Cucumber Integration

    There is an agent to integrate Cucumber with ReportPortal.

    Cucumber is a popular open-source framework for behavior-driven development (BDD) which based on Gherkin language and allows developers, testers, and business stakeholders to work together and define an application's behavior.

    Compatibility matrix for cucumber agents

    Version(s) of cucumber java and cucumber junitGherkin's version(s)Link to agent's github
    1.2.52.12.2sources/cucumber1
    2.0.0 - 2.4.03.2.0 - 5.1.0sources/cucumber2
    3.0.0 - 3.0.2_sources/cucumber3
    4.4.0 - 4.8.13.2.0 - 5.1.0sources/cucumber4
    5.0.0 - 5.7.0_sources/cucumber5
    6.0.0 - 7.0.06.0.0 - 7.0.0sources/cucumber6

    Installation guide

    Examples

    - - +

    ReportPortal Cucumber Integration

    There is an agent to integrate Cucumber with ReportPortal.

    Cucumber is a popular open-source framework for behavior-driven development (BDD) which based on Gherkin language and allows developers, testers, and business stakeholders to work together and define an application's behavior.

    Compatibility matrix for cucumber agents

    Version(s) of cucumber java and cucumber junitGherkin's version(s)Link to agent's github
    1.2.52.12.2sources/cucumber1
    2.0.0 - 2.4.03.2.0 - 5.1.0sources/cucumber2
    3.0.0 - 3.0.2_sources/cucumber3
    4.4.0 - 4.8.13.2.0 - 5.1.0sources/cucumber4
    5.0.0 - 5.7.0_sources/cucumber5
    6.0.0 - 7.0.06.0.0 - 7.0.0sources/cucumber6

    Installation guide

    Examples

    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/JBehave/index.html b/log-data-in-reportportal/test-framework-integration/Java/JBehave/index.html index dc24c3c55..c49a2286d 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/JBehave/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/JBehave/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/JUnit4/index.html b/log-data-in-reportportal/test-framework-integration/Java/JUnit4/index.html index 4ef5f48f6..954278376 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/JUnit4/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/JUnit4/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/JUnit5/index.html b/log-data-in-reportportal/test-framework-integration/Java/JUnit5/index.html index 27409d414..abe740d09 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/JUnit5/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/JUnit5/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents/index.html b/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents/index.html index b385ea187..c3b19c920 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponents/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J/index.html b/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J/index.html index d16fcaff3..117e2e9f6 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4J/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback/index.html b/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback/index.html index c8986b90a..229ba52a2 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logback/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3/index.html b/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3/index.html index 07cfd7306..b5401d565 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured/index.html b/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured/index.html index 6dc74cc59..5ae6dcfce 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssured/index.html @@ -12,17 +12,17 @@ - - + +
    -

    ReportPortal Rest Assured Integration

    The logger intercept and logs all Requests and Responses issued by REST Assured into ReportPortal in Markdown format, including multipart +

    - - + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide/index.html b/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide/index.html index 7bd582f75..cbe2a883a 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenide/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/SoapUI/index.html b/log-data-in-reportportal/test-framework-integration/Java/SoapUI/index.html index 8fbe6aff2..6268259cf 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/SoapUI/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/SoapUI/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/Spock/index.html b/log-data-in-reportportal/test-framework-integration/Java/Spock/index.html index e85b18bae..6aee171fa 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/Spock/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/Spock/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/TestNG/index.html b/log-data-in-reportportal/test-framework-integration/Java/TestNG/index.html index 23c24f261..c8505425a 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/TestNG/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/TestNG/index.html @@ -12,15 +12,15 @@ - - + +
    -

    ReportPortal TestNG Integration

    There is an agent to integrate TestNG with ReportPortal.

    TestNG provides support for attaching custom listeners, reporters, annotation transformers and method interceptors to your tests.

    TestNG agent can handle next events:

    • Start launch
    • Finish launch
    • Start suite
    • Finish suite
    • Start test
    • Finish test
    • Start test step
    • Successful finish of test step
    • Fail of test step
    • Skip of test step
    • Start configuration (All «before» and «after» methods)
    • Fail of configuration
    • Successful finish of configuration
    • Skip configuration

    Installation guide

    Examples

    - - +

    ReportPortal TestNG Integration

    There is an agent to integrate TestNG with ReportPortal.

    TestNG provides support for attaching custom listeners, reporters, annotation transformers and method interceptors to your tests.

    TestNG agent can handle next events:

    • Start launch
    • Finish launch
    • Start suite
    • Finish suite
    • Start test
    • Finish test
    • Start test step
    • Successful finish of test step
    • Fail of test step
    • Skip of test step
    • Start configuration (All «before» and «after» methods)
    • Fail of configuration
    • Successful finish of configuration
    • Skip configuration

    Installation guide

    Examples

    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Java/index.html b/log-data-in-reportportal/test-framework-integration/Java/index.html index 65ee68a31..add3e19e0 100644 --- a/log-data-in-reportportal/test-framework-integration/Java/index.html +++ b/log-data-in-reportportal/test-framework-integration/Java/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Java

    To integrate your Java test framework with ReportPortal, you need to create a file named reportportal.properties in your in your Java project in a source folder src/main/resources or src/test/resources (depending on where your tests are located):

    reportportal.properties

    rp.endpoint={RP_SERVER_URL}

    rp.api.key={YOUR_TOKEN}

    rp.project={YOUR_PROJECT}

    rp.launch={NAME_OF_YOUR_LAUNCH}

    Property description

    rp.endpoint - the URL for the report portal server (actual link).

    rp.api.key - an access token for Report Portal which is used for user identification. It can be found on your report portal user profile page.

    rp.project - a project code on which the agent will report test launches. Must be set to one of your assigned projects.

    rp.launch - a user-selected identifier of test launches.

    note

    Starting from the Service Release 23.1++, rp.uuid was renamed to rp.api.key.

    This set of properties will allow you to report your tests. And there are more properties available for fine grain tuning of integration. Details available here.

    If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.

    All agents use client-java to communicate with ReportPortal API and as common code library. Also you can use any combination of agent and logger.

    - - +

    Java

    To integrate your Java test framework with ReportPortal, you need to create a file named reportportal.properties in your in your Java project in a source folder src/main/resources or src/test/resources (depending on where your tests are located):

    reportportal.properties

    rp.endpoint={RP_SERVER_URL}

    rp.api.key={YOUR_TOKEN}

    rp.project={YOUR_PROJECT}

    rp.launch={NAME_OF_YOUR_LAUNCH}

    Property description

    rp.endpoint - the URL for the report portal server (actual link).

    rp.api.key - an access token for Report Portal which is used for user identification. It can be found on your report portal user profile page.

    rp.project - a project code on which the agent will report test launches. Must be set to one of your assigned projects.

    rp.launch - a user-selected identifier of test launches.

    note

    Starting from the Service Release 23.1++, rp.uuid was renamed to rp.api.key.

    This set of properties will allow you to report your tests. And there are more properties available for fine grain tuning of integration. Details available here.

    If you need a sophisticated and full-featured integration with a test framework, you can configure it by your self.

    All agents use client-java to communicate with ReportPortal API and as common code library. Also you can use any combination of agent and logger.

    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept/index.html index 8ec1da8e5..3341a12ae 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Codecept/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS/index.html index e6f74718a..9f296db48 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJS/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress/index.html index 3ddc810ca..1b5b76aec 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Cypress/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine/index.html index de4abd061..a25a38fbc 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmine/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Jest/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Jest/index.html index a9f5c3648..42047181e 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Jest/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Jest/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha/index.html index f11032031..1f5390bd2 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Mocha/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch/index.html index 3fa7464e9..3fbf59a79 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatch/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright/index.html index 1ac3f5bd7..2fc992cf5 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Playwright/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/Postman/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/Postman/index.html index 90a2ecb17..a25e0d6d7 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/Postman/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/Postman/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe/index.html index 3a114f85a..57f80a3ba 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafe/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO/index.html index 720d1d9c5..3904cb381 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIO/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/JavaScript/index.html b/log-data-in-reportportal/test-framework-integration/JavaScript/index.html index 70cda8de4..e020280fa 100644 --- a/log-data-in-reportportal/test-framework-integration/JavaScript/index.html +++ b/log-data-in-reportportal/test-framework-integration/JavaScript/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net/index.html b/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net/index.html index ec3ac6f66..b53f721cb 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Net/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog/index.html b/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog/index.html index d6fe50f44..5a4a0d618 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLog/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog/index.html b/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog/index.html index 9f2e40c75..b064f7aaf 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilog/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener/index.html b/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener/index.html index 577e72f95..4e71abd2f 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListener/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/NUnit/index.html b/log-data-in-reportportal/test-framework-integration/Net/NUnit/index.html index e37af595d..95f08b18d 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/NUnit/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/NUnit/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/SpecFlow/index.html b/log-data-in-reportportal/test-framework-integration/Net/SpecFlow/index.html index 3fc00f241..99573b12c 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/SpecFlow/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/SpecFlow/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/VSTest/index.html b/log-data-in-reportportal/test-framework-integration/Net/VSTest/index.html index 875a4bb53..dfe30ae76 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/VSTest/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/VSTest/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/index.html b/log-data-in-reportportal/test-framework-integration/Net/index.html index 566a1aa38..28692c71c 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Net/xUnit/index.html b/log-data-in-reportportal/test-framework-integration/Net/xUnit/index.html index 19340e5c3..0a38cf343 100644 --- a/log-data-in-reportportal/test-framework-integration/Net/xUnit/index.html +++ b/log-data-in-reportportal/test-framework-integration/Net/xUnit/index.html @@ -12,15 +12,15 @@ - - + +
    -

    ReportPortal xUnit Integration

    There is an agent to integrate xUnit with ReportPortal.

    xUnit is a testing framework for .NET applications. The "Arrange, Act, Assert" (AAA) pattern, which is a systematic method of designing test cases, is the foundation of xUnit. The AAA pattern places emphasis on how each test should clearly distinguish between how the test environment and data are set up, how the test code is executed, and how the test result is verified (Assert).

    Installation guide

    Examples

    - - +

    ReportPortal xUnit Integration

    There is an agent to integrate xUnit with ReportPortal.

    xUnit is a testing framework for .NET applications. The "Arrange, Act, Assert" (AAA) pattern, which is a systematic method of designing test cases, is the foundation of xUnit. The AAA pattern places emphasis on how each test should clearly distinguish between how the test environment and data are set up, how the test code is executed, and how the test result is verified (Assert).

    Installation guide

    Examples

    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Other/index.html b/log-data-in-reportportal/test-framework-integration/Other/index.html index b5e516bc7..7df7eefe9 100644 --- a/log-data-in-reportportal/test-framework-integration/Other/index.html +++ b/log-data-in-reportportal/test-framework-integration/Other/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Other

    Please find the full list of available integrations with test frameworks in our GitHub repositories.

    If you need further guidelines, you can explore our Developers guides.

    What you can do if you can not find your Test Framework? +

    - - + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/PHP/Behat/index.html b/log-data-in-reportportal/test-framework-integration/PHP/Behat/index.html index 6485b1b63..6e0f64b4c 100644 --- a/log-data-in-reportportal/test-framework-integration/PHP/Behat/index.html +++ b/log-data-in-reportportal/test-framework-integration/PHP/Behat/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/PHP/Codeception/index.html b/log-data-in-reportportal/test-framework-integration/PHP/Codeception/index.html index def4c01b3..cea9419fd 100644 --- a/log-data-in-reportportal/test-framework-integration/PHP/Codeception/index.html +++ b/log-data-in-reportportal/test-framework-integration/PHP/Codeception/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit/index.html b/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit/index.html index 9fe1cc909..6112e43c1 100644 --- a/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit/index.html +++ b/log-data-in-reportportal/test-framework-integration/PHP/PHPUnit/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/PHP/index.html b/log-data-in-reportportal/test-framework-integration/PHP/index.html index e51fc584d..805d7817c 100644 --- a/log-data-in-reportportal/test-framework-integration/PHP/index.html +++ b/log-data-in-reportportal/test-framework-integration/PHP/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Python/RobotFramework/index.html b/log-data-in-reportportal/test-framework-integration/Python/RobotFramework/index.html index c5ed70b9d..466d66e60 100644 --- a/log-data-in-reportportal/test-framework-integration/Python/RobotFramework/index.html +++ b/log-data-in-reportportal/test-framework-integration/Python/RobotFramework/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Python/behave/index.html b/log-data-in-reportportal/test-framework-integration/Python/behave/index.html index 749d1b8d2..405c45df6 100644 --- a/log-data-in-reportportal/test-framework-integration/Python/behave/index.html +++ b/log-data-in-reportportal/test-framework-integration/Python/behave/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Python/index.html b/log-data-in-reportportal/test-framework-integration/Python/index.html index 92bfd9995..5a519394e 100644 --- a/log-data-in-reportportal/test-framework-integration/Python/index.html +++ b/log-data-in-reportportal/test-framework-integration/Python/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Python/nosetests/index.html b/log-data-in-reportportal/test-framework-integration/Python/nosetests/index.html index 92c811e86..0e394d6c2 100644 --- a/log-data-in-reportportal/test-framework-integration/Python/nosetests/index.html +++ b/log-data-in-reportportal/test-framework-integration/Python/nosetests/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/Python/pytest/index.html b/log-data-in-reportportal/test-framework-integration/Python/pytest/index.html index fee644bdb..ad2fe0ec5 100644 --- a/log-data-in-reportportal/test-framework-integration/Python/pytest/index.html +++ b/log-data-in-reportportal/test-framework-integration/Python/pytest/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/log-data-in-reportportal/test-framework-integration/index.html b/log-data-in-reportportal/test-framework-integration/index.html index 5c8e5c804..0958dcb6c 100644 --- a/log-data-in-reportportal/test-framework-integration/index.html +++ b/log-data-in-reportportal/test-framework-integration/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Test Framework Integration

    ReportPortal is a system that integrates with your Test Framework, listens for events and visualizes test results. You cannot execute results right from ReportPortal.

    How can ReportPortal be integrated with Test Framework?

    Integration steps

    To do this, you need to follow a few simple steps.

    1. Installation
      +

      Test Framework Integration

      ReportPortal is a system that integrates with your Test Framework, listens for events and visualizes test results. You cannot execute results right from ReportPortal.

      How can ReportPortal be integrated with Test Framework?

      Integration steps

      To do this, you need to follow a few simple steps.

      1. Installation
        Add an agent to your project that corresponds to the Test Framework you use.
      2. Configuration
        Provide parameters such as ReportPortal URL, API key/token, project, launch name, etc.
      tip

      After completing these two steps, the report will be available on the ReportPortal side.
      But if you want to use all the features of ReportPortal, you need to take one more step.

      1. Update tests with additional data
        @@ -27,7 +27,7 @@ For specific tool details, select your language and Test Framework in the sections below.

      Examples

      If you do not know anything about ReportPortal. If you just want to integrate ReportPortal with your Test Framework and view info about test case executions: a name, a status, a duration, parameters, attachments (files, screenshots, video and other), logs and others. So this section for you.

      You can review and mimic the following examples to start your integration with the ReportPortal.

      Test frameworksExamples
      Java Test Frameworkshttps://github.com/reportportal/examples-java
      JavaScript based Test Frameworkshttps://github.com/reportportal/examples-js
      .Net based Test Frameworkshttps://github.com/reportportal?q=example-net&type=&language=&sort=
      Python based Test Frameworkshttps://github.com/reportportal/examples-python
    - - + + \ No newline at end of file diff --git a/plugins/AtlassianJiraCloud/index.html b/plugins/AtlassianJiraCloud/index.html index 77bf23f8b..a6bd30f11 100644 --- a/plugins/AtlassianJiraCloud/index.html +++ b/plugins/AtlassianJiraCloud/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Atlassian Jira Cloud

    To install the Atlassian Jira Cloud plugin, see Upload plugin section.

    Integration with the Atlassian JIRA Cloud can be required for projects that collect defects in a separate tracking tool. The integration provides an exchange of information between our centralized test automation tool and the Atlassian JIRA Cloud, such as posting issues and linking issues, getting updates on their statuses.

    Global Atlassian JIRA Cloud integration

    Add new global Atlassian Jira Cloud integration

    If all projects on your instance are using the same Jira projects, you will be able to configure global integrations which will be applied on all projects.

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Cloud plugin panel

    4. Click on "Add integration" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project key in BTS': <project key in bug tracking system>
    'Email': <user email>
    'API Token': <user API Token>

    After you have created a connection with the JIRA project, you can choose predefined JIRA ticket fields. These fields will be shown to you all the time when you post the issue in Jira Cloud.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on all your projects will be able to submit issues in Jira Cloud. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration" button.

    User can add several integrations, but with a different name to the one JIRA project.

    Use case:

    Situation: User wants to post to JIRA Cloud issues with type Defect and Task to the project NNN-MMM in Jira. Is it possible? +

    Atlassian Jira Cloud

    To install the Atlassian Jira Cloud plugin, see Upload plugin section.

    Integration with the Atlassian JIRA Cloud can be required for projects that collect defects in a separate tracking tool. The integration provides an exchange of information between our centralized test automation tool and the Atlassian JIRA Cloud, such as posting issues and linking issues, getting updates on their statuses.

    Global Atlassian JIRA Cloud integration

    Add new global Atlassian Jira Cloud integration

    If all projects on your instance are using the same Jira projects, you will be able to configure global integrations which will be applied on all projects.

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Cloud plugin panel

    4. Click on "Add integration" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project key in BTS': <project key in bug tracking system>
    'Email': <user email>
    'API Token': <user API Token>

    After you have created a connection with the JIRA project, you can choose predefined JIRA ticket fields. These fields will be shown to you all the time when you post the issue in Jira Cloud.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on all your projects will be able to submit issues in Jira Cloud. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration" button.

    User can add several integrations, but with a different name to the one JIRA project.

    Use case:

    Situation: User wants to post to JIRA Cloud issues with type Defect and Task to the project NNN-MMM in Jira. Is it possible? Yes!

    Solution: Add two integrations to the project NNN-MMM in Jira with names f.e. "Project -1" and "Project -2". Add to the "Project -1" issue type Defect and for "Project -2" - issue type Task. While posing issue procedure, choose integration with needed type.

    Update global Atlassian Jira Cloud integration

    If you need to edit Jira Cloud integration authorization parameters, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Cloud plugin panel

    4. Click on a tab with existing integration

    5. Click on "Edit authorization" link

    6. Change "Integration name"

    7. Submit the form

    note

    You can edit the "Integration name" only. If you need other changes, please submit new integration.

    If you need to edit fields which should be posted in Jira Cloud, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Cloud plugin panel

    4. Click on a tab with existing integration

    5. Click on "Configure" button

    6. Choose issue type from the drop-down

    7. Check the needed fields and fill them in if necessary

    8. Click on "Submit" button

    Remove global Atlassian Jira Cloud integration

    If you need to remove Jira Cloud integration, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Cloud plugin panel

    4. Click on a tab with existing integration

    5. Click on "Remove integration"

    6. Submit the action

    Project Atlassian JIRA Cloud integration

    Add new project Atlassian Jira Cloud integration

    If any project needs different Jira Cloud configurations, you should unlink a project from Global configurations and add a project configuration. It means that now when a new global integration is added to our test automation results dashboard, it won't be applied to the unlinked project.

    For that,

    1. Log in as an ADMIN or Project Manager

    2. Go to Project Settings > Integrations

    3. Click on the JIRA Cloud integration panel

    4. Click on "Unlink and setup manually" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project key in BTS': <project key in bug tracking system>
    'Email': <user email>
    'API Token': <user API Token>

    After you have created a connection with the JIRA project, you can choose predefined JIRA ticket fields. These fields will be shown to you all the time when you post the issue in Jira Cloud.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on this project will be able to submit issues in Jira Cloud. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration" button.

    Reset to project Atlassian Jira Cloud Integrations

    If you want to delete project integrations with Jira Cloud and link your project with global configurations, please perform actions described below:

    1. Log in as an ADMIN or Project Manager

    2. Go to Project Settings > Integrations

    3. Click on the JIRA Cloud integration panel

    4. Click on "Reset to global settings" button

    5. Confirm the action

    Post issue to Atlassian Jira Cloud

    Posting an issue to Jira Cloud means to create a new issue in Jira from ReportPortal and upload logs and attachments from an execution.

    If you want to post a new issue to Jira, you need to have a project or global integration with Jira Cloud.

    Post issue via Step view

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator

    2. Go to a Step view

    3. Choose a needed item

    4. Click on "Actions" button

    5. Choose "Post issue" option

    6. Fill in the "Post issue" form with valid data

    `BTS`: if you have configured BTS integrations, you will be able to choose between them
    `Integration name`: from the drop-down, you can choose any of integrations for chosen earlier BTS
    `Predefined fields`: fields which you choose on Project Settings/ or Plugins
    `Included data`: which data should be posted to BTS (attachments, logs, comments)
    1. Submit the form

    2. A new issue will be posted in BTS with information from ReportPortal

    3. A label with issue ID will be added to the test item

    Linking an issue with an issue in Jira Cloud means adding a clickable link to an existing issue in Jira from ReportPortal that will show a status of this issue.

    Link issue via Step view

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator

    2. Go to a Step view

    3. Choose a needed item

    4. Click on "Actions" button

    5. Choose "Link issue" option

    6. Fill in the "Link issue" form with valid data

    `BTS`: if you have configured BTS integrations, you will be able to choose between them
    `Integration name`: from the drop-down, you can choose any of integrations for chosen earlier BTS
    `Link to issue`: a full link to the item in BTS
    `Issue ID`: information which will be displayed on the label in ReportPortal
    1. Submit the form

    2. A label with issue ID will be added to the test item

    - - + + \ No newline at end of file diff --git a/plugins/AtlassianJiraServer/index.html b/plugins/AtlassianJiraServer/index.html index 8422b9cd6..8ff7e0391 100644 --- a/plugins/AtlassianJiraServer/index.html +++ b/plugins/AtlassianJiraServer/index.html @@ -12,20 +12,20 @@ - - + +
    -

    Atlassian Jira Server

    To install the Jira Server plugin, see Upload plugin section.

    Integration with the Atlassian JIRA Server can be required for projects that collect defects in a separate tracking tool. The integration provides an exchange of information between our test automation reporting dashboard and the Atlassian JIRA Server, such as posting issues and linking issues, getting updates on their statuses.

    Permission:

    The Administrator can upload a plugin and create global integrations on the Plugin tab in the Administrate section. Also, the Administrator can unlink project configurations from global. +

    Atlassian Jira Server

    To install the Jira Server plugin, see Upload plugin section.

    Integration with the Atlassian JIRA Server can be required for projects that collect defects in a separate tracking tool. The integration provides an exchange of information between our test automation reporting dashboard and the Atlassian JIRA Server, such as posting issues and linking issues, getting updates on their statuses.

    Permission:

    The Administrator can upload a plugin and create global integrations on the Plugin tab in the Administrate section. Also, the Administrator can unlink project configurations from global. The Project Manager can work only on the project level. He can unlink and re-write global configuration with project ones on Project Settings > Integrations.

    Global Atlassian JIRA Server integration

    Add new global Atlassian Jira Server integration

    If all projects on your instance are using the same Jira projects, you will be able to configure global integrations which will be applied on all projects.

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Server plugin panel

    4. Click on "Add integration" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project key in BTS': <project key in bug tracking system>
    'Authorization Type': Basic (predefined)
    'BTS Username': <JIRA user name>
    'BTS Password': <JIRA user password>

    After you have created a connection with the JIRA project, you can choose predefined JIRA ticket fields. These fields will be shown to you all the time when you post the issue in Jira.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on all your projects will be able to submit issues in Jira. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration" button.

    User can add several integrations, but with a different name to the one JIRA project.

    Use case:

    Situation: User wants to post to JIRA Server issues with type Defect and Task to the project NNN-MMM in Jira. Is it possible? Yes!

    Solution: Add two integrations to the project NNN-MMM in Jira with names f.e. "Project -1" and "Project -2". Add to the "Project -1" issue type Defect and for "Project -2" - issue type Task. While posing issue procedure, choose integration with needed type.

    Update global Atlassian Jira Server integration

    If you need to edit Jira Server integration authorization parameters, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Server plugin panel

    4. Click on a tab with existing integration

    5. Click on "Edit authorization" link

    6. Change "Integration name"

    7. Type your Jira Server credentials

    8. Submit the form

    note

    You can edit the "Integration name" only. If you need other changes, please submit new integration.

    If you need to edit fields which should be posted in Jira Server, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Server plugin panel

    4. Click on a tab with existing integration

    5. Click on "Configure" button

    6. Choose issue type from the drop-down

    7. Check the needed fields and fill them in if necessary

    8. Click on "Submit" button

    Remove global Atlassian Jira Server integration

    If you need to remove Jira Server integration, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on JIRA Server plugin panel

    4. Click on a tab with existing integration

    5. Click on "Remove integration"

    6. Submit the action

    Project Atlassian JIRA Server integration

    Add new project Atlassian Jira Server integration

    If any project needs different Jira Server configurations, you should unlink a project from Global configurations and add a project configuration. It means that now when a new global integration is added to the our centralized test automation tool, it won't be applied to the unlinked project.

    For that,

    1. Log in as an ADMIN or Project Manager

    2. Go to Project Settings > Integrations

    3. Click on the JIRA Server integration panel

    4. Click on "Unlink and setup manually" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project key in BTS': <project key in bug tracking system>
    'Authorization Type': Basic (predefined)
    'BTS Username': <JIRA user name>
    'BTS Password': <JIRA user password>

    After you have created a connection with the JIRA project, you can choose predefined JIRA ticket fields. These fields will be shown to you all the time when you post the issue in Jira.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on this project will be able to submit issues in Jira. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration" button.

    Reset to project Atlassian Jira Server Integrations

    If you want to delete project integrations with Jira Server and link your project with global configurations, please perform actions described below:

    1. Log in as an ADMIN or Project Manager

    2. Go to Project Settings > Integrations

    3. Click on the JIRA Server integration panel

    4. Click on "Reset to global settings" button

    5. Confirm the action

    Some tricks when you create a new connection:

    1. Verify that the link to the JIRA Server system is correct. There are several possible variants are possible, for instance:
    https://jira.company.com/jira
    https://jiraeu.company.com
    1. Verify the project key in JIRA Server is correct. Please fill in the Project key field with project key-value, e.g. project ABC-DEF has key ABCDEF.

    2. Verify the username and password data. Make sure, that the login name and not the email are in the username field. In case all the data above is correct, but the error appears again, check whether the user's credentials to JIRA Server are not expired. As far as JIRA Server sends the request in HTML format, we are not able to display the real reason for the error. To check and/or resolve the issue, please do the next steps:

      • Open JIRA Server page
      • Log in to JIRA Server with domain credentials using basic authorization (i.e., fill in user's login name and password into the fields)
      • Submit the login form Screen with CAPTCHA should appear
      • Enter the symbols
      • Submit the credentials again
      • Now try to establish the connection to JIRA Server on the ReportPortal project.
    3. SSL instance of JIRA (even cloud version) can be accessed by JIRA API token, used instead of a password. After you have connected Jira and our test automation results dashboard, you can choose an issue type that you will be able to add to Jira during the “Post Issue” operation. Also, the user can add predefined fields that the user can fill.

    Post issue to Atlassian Jira Server

    Posting an issue to Jira Server means to create a new issue in Jira from ReportPortal and upload logs and attachments from an execution.

    If you want to post a new issue to Jira, you need to have a project or global integration with Jira Server.

    Post issue via Step view

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator

    2. Go to a Step view

    3. Choose a needed item

    4. Click on "Actions" button

    5. Choose "Post issue" option

    6. Fill in the "Post issue" form with valid data

    `BTS`: if you have configured BTS integrations, you will be able to choose between them
    `Integration name`: from the drop-down, you can choose any of integrations for chosen earlier BTS
    `Predefined fields`: fields which you choose on Project Settings/ or Plugins
    `Included data`: which data should be posted to BTS (attachments, logs, comments)
    `BTS username`: reporter login in Jira Server
    `BTS password`: reporter password in Jira Server
    1. Submit the form

    2. A new issue will be posted in BTS with information from ReportPortal

    3. A label with issue ID will be added to the test item

    Linking an issue with an issue in Jira Server means adding a clickable link to an existing issue in Jira from ReportPortal that will show a status of this issue.

    Link issue via Step view

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator

    2. Go to a Step view

    3. Choose a needed item

    4. Click on "Actions" button

    5. Choose "Link issue" option

    6. Fill in the "Link issue" form with valid data

    `BTS`: if you have configured BTS integrations, you will be able to choose between them
    `Integration name`: from the drop-down, you can choose any of integrations for chosen earlier BTS
    `Link to issue`: a full link to the item in BTS
    `Issue ID`: information which will be displayed on the label in ReportPortal
    1. Submit the form

    2. A label with issue ID will be added to the test item

    - - + + \ No newline at end of file diff --git a/plugins/AzureDevOpsBTS/index.html b/plugins/AzureDevOpsBTS/index.html index 9cc319601..2a6a781b5 100644 --- a/plugins/AzureDevOpsBTS/index.html +++ b/plugins/AzureDevOpsBTS/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Azure DevOps BTS

    To install the Azure DevOps BTS plugin, see Upload plugin section.

    Integration with our centralized test automation tool can be helpful for projects which are already using Azure DevOps BTS (Bug Tracking System) as a tracking tool. This feature allows posting issues and linking/unlinking issues, getting updates on their statuses. For example, just a few clicks – and bug with detailed logs is created!

    Azure DevOps BTS integration can be configured on the global level (for all projects on the instance) or on the project level (only for one project).

    Global Azure DevOps BTS integration

    Add new global Azure DevOps BTS integration

    You might want to configure global integrations which will be applied on all projects if all projects on your instance are using the same Azure DevOps BTS projects.

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on the “Add integration” button.

    1. Fill and Save the authorization form.

    Please, follow the steps below to get a token for Azure DevOps integration:

    You can choose predefined Azure DevOps ticket fields after you have created a connection with the Azure DevOps BTS project. These fields will be shown to you all the time when you post an issue to the Azure DevOps BTS.

    This feature also gives you the ability to choose proper issue type for newly created issues in Azure DevOps BTS.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions on the opened Configuration form:

    1. Choose issue type from the drop-down.

    2. 2.Check the fields needed and fill them in if necessary.

    3. Click on “Submit” button.

    Now team members on all your projects will be able to submit issues in Azure DevOps BTS. Options for Post Issue/Link issue are activated.

    You can add more integrations by clicking on “Add integration”.

    User can add several integrations, but with a different name to the one Azure DevOps BTS project.

    Use case:

    Situation: User wants to post to Azure DevOps BTS issues with type Issue and Task to the project NNN-MMM in Azure DevOps BTS. Is it possible? Yes!

    Solution: Add two integrations to the project NNN-MMM in Azure DevOps BTS with names e.g., “Project -1” and “Project -2”. Add to the “Project -1” issue type Issue and for “Project -2” - issue type Task. While posing issue procedure, choose integration with needed type.

    Update global Azure DevOps BTS integration

    If you need to edit Azure DevOps BTS integration authorization parameters, please perform actions:

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on a tab with existing integration.

    5. Click on “Edit authorization” link.

    1. Change “Integration name”.

    2. Type your Azure DevOps credentials.

    3. Submit the form.

    note

    You can edit only “Integration name”. If you need other changes, please submit new integration.

    If you need to edit fields which should be posted in Azure DevOps BTS, please perform actions:

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on the tab with existing integration.

    5. Click on “Configure” button.

    1. Choose issue type from the drop-down.

    2. Check the fields needed and fill them in if necessary.

    3. Click on “Submit” button.

    Remove global Azure DevOps BTS integration

    If you need to remove Azure DevOps BTS integration, please perform actions:

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on the tab with existing integration.

    5. Click on “Remove integration”.

    1. Submit the action.

    Project Azure DevOps BTS integration

    Add new project Azure DevOps BTS integration

    If any project needs different Azure DevOps BTS configurations, you should unlink a project from Global configurations and add a Project configuration. It means that now when a new global integration is added to the ReportPortal, it won't be applied to the unlinked project.

    For that,

    1. Log in as an ADMIN or Project Manager.

    2. Go to Project Settings > Integrations.

    3. Click on the Azure DevOps integration panel.

    4. Click on “Unlink and setup manually” button.

    1. Fill and confirm the authorization form.
    note

    Please, have a look at Global Azure DevOps BTS integration for detailed configuration steps.

    You can choose predefined Azure DevOps ticket fields after you have created a connection with the Azure DevOps BTS project. These fields will be shown to you all the time when you post an issue to the Azure DevOps BTS.

    This feature also gives you the ability to choose proper issue type for newly created issues in Azure DevOps BTS.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions on the opened Configuration form:

    1. Choose issue type from the drop-down.

    2. Check the needed fields and fill them in if necessary.

    3. Click on “Submit” button.

    Now team members on this project will be able to submit issues in Azure DevOps BTS. Options for Post Issue/Link issue are activated.

    You can add more integrations by clicking on “Add integration” button.

    Reset to project Azure DevOps BTS Integrations

    If you want to delete project integrations with Azure DevOps BTS and link your project with global configurations, please perform actions described below:

    1. Log in as an ADMIN or Project Manager.

    2. Go to Project Settings > Integrations.

    3. Click on the Azure DevOps integration panel.

    4. Click on “Reset to global settings” button.

    5. Confirm the action.

    Post issue to Azure DevOps BTS

    Posting an issue to Azure DevOps BTS means creating a new issue in Azure DevOps BTS from ReportPortal and uploading logs and attachments from an execution.

    If you want to post a new issue to Azure DevOps BTS, you need to have a project or global integration with Azure DevOps BTS.

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator.

    2. Go to Launches.

    3. Choose a needed item.

    1. Click on the pencil icon to open “Make decision” modal.
    1. Choose “Post issue” option and then “Apply & Continue”.
    1. Fill in the “Post Issue” form with valid data and submit the form.
    1. A new issue will be posted in Azure DevOps BTS with information from ReportPortal.
    1. A label with issue ID will be added to the test item.

    Linking an issue with an issue in Azure DevOps BTS means adding a clickable link to an existing issue in Azure DevOps BTS from ReportPortal that will show a status of this issue.

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator.

    2. Go to Launches.

    3. Choose a needed item.

    1. Click on the pencil icon to open “Make decision” modal.
    1. Choose “Link issue” option and then “Apply & Continue”.
    1. Fill in the “Link issue” form with valid data and submit the form.
    1. A label with issue ID will be added to the test item.
    1. Link is redirected to this issue in Azure DevOps BTS.

    You can also unlink an issue.

    1. Click on the “remove” icon.
    1. Click “Unlink Issue”.
    1. Link to the issue in Azure DevOps BTS is removed.

    Custom issue type in Azure DevOps BTS

    You can configure any custom issue type (e.g., Bug for Adam) in Azure DevOps BTS and then choose it as predefined Azure DevOps ticket field. So, developer Adam will see on the Azure DevOps BTS all issues from ReporPortal which assigned to him.

    Follow the steps below to configure custom issue type:

    1. Log in to Azure portal.

    2. Go to Organization settings.

    1. Click on the “Process” menu item.
    1. Select three dots near the current process and create a new one.
    1. Click on the name of the just created process.
    1. Create custom issue type.
    1. Click on the project quantity and change the process for your project.
    1. Change Issue Type for Azure DevOps BTS integration on ReportPortal.
    1. Post issues to Azure DevOps BTS.

    2. Now you can see issues with custom issue type on Azure DevOps BTS.

    - - +

    Azure DevOps BTS

    To install the Azure DevOps BTS plugin, see Upload plugin section.

    Integration with our centralized test automation tool can be helpful for projects which are already using Azure DevOps BTS (Bug Tracking System) as a tracking tool. This feature allows posting issues and linking/unlinking issues, getting updates on their statuses. For example, just a few clicks – and bug with detailed logs is created!

    Azure DevOps BTS integration can be configured on the global level (for all projects on the instance) or on the project level (only for one project).

    Global Azure DevOps BTS integration

    Add new global Azure DevOps BTS integration

    You might want to configure global integrations which will be applied on all projects if all projects on your instance are using the same Azure DevOps BTS projects.

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on the “Add integration” button.

    1. Fill and Save the authorization form.

    Please, follow the steps below to get a token for Azure DevOps integration:

    You can choose predefined Azure DevOps ticket fields after you have created a connection with the Azure DevOps BTS project. These fields will be shown to you all the time when you post an issue to the Azure DevOps BTS.

    This feature also gives you the ability to choose proper issue type for newly created issues in Azure DevOps BTS.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions on the opened Configuration form:

    1. Choose issue type from the drop-down.

    2. 2.Check the fields needed and fill them in if necessary.

    3. Click on “Submit” button.

    Now team members on all your projects will be able to submit issues in Azure DevOps BTS. Options for Post Issue/Link issue are activated.

    You can add more integrations by clicking on “Add integration”.

    User can add several integrations, but with a different name to the one Azure DevOps BTS project.

    Use case:

    Situation: User wants to post to Azure DevOps BTS issues with type Issue and Task to the project NNN-MMM in Azure DevOps BTS. Is it possible? Yes!

    Solution: Add two integrations to the project NNN-MMM in Azure DevOps BTS with names e.g., “Project -1” and “Project -2”. Add to the “Project -1” issue type Issue and for “Project -2” - issue type Task. While posing issue procedure, choose integration with needed type.

    Update global Azure DevOps BTS integration

    If you need to edit Azure DevOps BTS integration authorization parameters, please perform actions:

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on a tab with existing integration.

    5. Click on “Edit authorization” link.

    1. Change “Integration name”.

    2. Type your Azure DevOps credentials.

    3. Submit the form.

    note

    You can edit only “Integration name”. If you need other changes, please submit new integration.

    If you need to edit fields which should be posted in Azure DevOps BTS, please perform actions:

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on the tab with existing integration.

    5. Click on “Configure” button.

    1. Choose issue type from the drop-down.

    2. Check the fields needed and fill them in if necessary.

    3. Click on “Submit” button.

    Remove global Azure DevOps BTS integration

    If you need to remove Azure DevOps BTS integration, please perform actions:

    1. Log in as ADMIN.

    2. Go to Administrate > Plugins.

    3. Click on Azure DevOps plugin.

    4. Click on the tab with existing integration.

    5. Click on “Remove integration”.

    1. Submit the action.

    Project Azure DevOps BTS integration

    Add new project Azure DevOps BTS integration

    If any project needs different Azure DevOps BTS configurations, you should unlink a project from Global configurations and add a Project configuration. It means that now when a new global integration is added to the ReportPortal, it won't be applied to the unlinked project.

    For that,

    1. Log in as an ADMIN or Project Manager.

    2. Go to Project Settings > Integrations.

    3. Click on the Azure DevOps integration panel.

    4. Click on “Unlink and setup manually” button.

    1. Fill and confirm the authorization form.
    note

    Please, have a look at Global Azure DevOps BTS integration for detailed configuration steps.

    You can choose predefined Azure DevOps ticket fields after you have created a connection with the Azure DevOps BTS project. These fields will be shown to you all the time when you post an issue to the Azure DevOps BTS.

    This feature also gives you the ability to choose proper issue type for newly created issues in Azure DevOps BTS.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions on the opened Configuration form:

    1. Choose issue type from the drop-down.

    2. Check the needed fields and fill them in if necessary.

    3. Click on “Submit” button.

    Now team members on this project will be able to submit issues in Azure DevOps BTS. Options for Post Issue/Link issue are activated.

    You can add more integrations by clicking on “Add integration” button.

    Reset to project Azure DevOps BTS Integrations

    If you want to delete project integrations with Azure DevOps BTS and link your project with global configurations, please perform actions described below:

    1. Log in as an ADMIN or Project Manager.

    2. Go to Project Settings > Integrations.

    3. Click on the Azure DevOps integration panel.

    4. Click on “Reset to global settings” button.

    5. Confirm the action.

    Post issue to Azure DevOps BTS

    Posting an issue to Azure DevOps BTS means creating a new issue in Azure DevOps BTS from ReportPortal and uploading logs and attachments from an execution.

    If you want to post a new issue to Azure DevOps BTS, you need to have a project or global integration with Azure DevOps BTS.

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator.

    2. Go to Launches.

    3. Choose a needed item.

    1. Click on the pencil icon to open “Make decision” modal.
    1. Choose “Post issue” option and then “Apply & Continue”.
    1. Fill in the “Post Issue” form with valid data and submit the form.
    1. A new issue will be posted in Azure DevOps BTS with information from ReportPortal.
    1. A label with issue ID will be added to the test item.

    Linking an issue with an issue in Azure DevOps BTS means adding a clickable link to an existing issue in Azure DevOps BTS from ReportPortal that will show a status of this issue.

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator.

    2. Go to Launches.

    3. Choose a needed item.

    1. Click on the pencil icon to open “Make decision” modal.
    1. Choose “Link issue” option and then “Apply & Continue”.
    1. Fill in the “Link issue” form with valid data and submit the form.
    1. A label with issue ID will be added to the test item.
    1. Link is redirected to this issue in Azure DevOps BTS.

    You can also unlink an issue.

    1. Click on the “remove” icon.
    1. Click “Unlink Issue”.
    1. Link to the issue in Azure DevOps BTS is removed.

    Custom issue type in Azure DevOps BTS

    You can configure any custom issue type (e.g., Bug for Adam) in Azure DevOps BTS and then choose it as predefined Azure DevOps ticket field. So, developer Adam will see on the Azure DevOps BTS all issues from ReporPortal which assigned to him.

    Follow the steps below to configure custom issue type:

    1. Log in to Azure portal.

    2. Go to Organization settings.

    1. Click on the “Process” menu item.
    1. Select three dots near the current process and create a new one.
    1. Click on the name of the just created process.
    1. Create custom issue type.
    1. Click on the project quantity and change the process for your project.
    1. Change Issue Type for Azure DevOps BTS integration on ReportPortal.
    1. Post issues to Azure DevOps BTS.

    2. Now you can see issues with custom issue type on Azure DevOps BTS.

    + + \ No newline at end of file diff --git a/plugins/EmailServer/index.html b/plugins/EmailServer/index.html index 0fe61df7f..d007ff265 100644 --- a/plugins/EmailServer/index.html +++ b/plugins/EmailServer/index.html @@ -12,17 +12,17 @@ - - + +
    -

    E-mail server

    E-mail server plugin is available in ReportPortal on the Plugins page.

    You don't need to download . It is already available in ReportPortal on the Plugins page.

    Add E-mail server integrations

    You can integrate our centralized test automation tool with an E-mail server via SMTP protocol. With this integration, you will be able to perform such functions as:

    • invite a new user to the project
    • configure notification rules on launch finish

    Permissions:

    user with account role ADMINISTRATOR can configure E-mail integration for the whole instance or per project. +

    E-mail server

    E-mail server plugin is available in ReportPortal on the Plugins page.

    You don't need to download . It is already available in ReportPortal on the Plugins page.

    Add E-mail server integrations

    You can integrate our centralized test automation tool with an E-mail server via SMTP protocol. With this integration, you will be able to perform such functions as:

    • invite a new user to the project
    • configure notification rules on launch finish

    Permissions:

    user with account role ADMINISTRATOR can configure E-mail integration for the whole instance or per project. User with account role PROJECT MANAGER can configure E-mail integration only on a project where he is assigned on as Project Manager.

    Global E-mail server integration

    To configure the SMTP server for the whole instance:

    1. Log in to the ReportPortal as an ADMIN user

    2. Then open the list on the right of the user's image.

    3. Click the 'Administrative' link

    4. Click the 'Plugins' from the left-hand sidebar

    5. Click on the 'Email Server' tab.

    6. Click on Add new integration

    7. The next fields should be present:

    `Host`: <host_name_of_email_server>
    `Protocol`: SMTP (predefined)
    `Default sender name`: (optional)
    `Port`: <port_number>
    `Authorization`: OFF/ON
    `Username`: <user_email_address>
    `Password`: <user_email_password>
    'TLS' or 'SSL': should be checked depends on the selected port.

    Example of SMTP server configuration for Gmail email server (detailed info could be found here)

    `Host`: smtp.gmail.com
    `Protocol`: SMTP
    `Default sender name`: Report Portal
    `Port`: 465
    `Authorization`: ON
    `Username`: <user_email_address>
    `Password`: <user_email_password>
    `SSL`: checkbox should be checked.

    Example of an SMTP server configuration for a Yandex email server (detailed info can be found here)

    `Host`: smtp.yandex.com
    `Protocol`: SMTP
    `Default sender name`: Report Portal
    `Port`: 465
    `Authorization`: ON
    `Username`: <user_email_address>
    `Password`: <user_email_password>
    `SSL`: checkbox should be checked.
    1. Confirm data in the form

    After E-mail server integration adding, the configuration will be applied to all projects on the instance.

    Project E-mail integration

    If E-mail integration has not to be added on the project, or if Project Manager or Admin want to specified special configurations for a special project, they can configure E-mail server in the project settings.

    To configure SMTP server for one single project instance:

    1. Log in to the ReportPortal as an ADMIN or PM user
    2. Then click on the Project settings icon.
    3. Click on the Integrations tab.
    4. Click on the 'E-mail Server' tab.
    5. Click on the button "Unlink & Setup Manually"
    6. The next fields should be present:
    `Host`: <host_name_of_email_server>
    `Protocol`: SMTP (predefined)
    `Default sender name`: (optional)
    `Port`: <port_number>
    `Authorization`: OFF/ON
    `Username`: <user_email_address>
    `Password`: <user_email_password>
    'TLS' or 'SSL': should be checked depends on the selected port.

    Example of SMTP server configuration for Gmail email server (detailed info could be found here)

    `Host`: smtp.gmail.com
    `Protocol`: SMTP
    `Default sender name`: Report Portal
    `Port`: 465
    `Authorization: ON
    `Username`: <user_email_address>
    `Password`: <user_email_password>
    `SSL`: checkbox should be checked.

    Example of an SMTP server configuration for a Yandex email server (detailed info can be found here)

    Host: smtp.yandex.com
    `Protocol`: SMTP
    `Default sender name`: Report Portal
    `Port`: 465
    `Authorization`: ON
    `Username`: <user_email_address>
    `Password`: <user_email_password>
    `SSL`: checkbox should be checked.
    1. Confirm data in the form

    After E-mail server integration adding, the configuration will be applied to all projects on the instance.

    note

    In case you unlink your project settings from Global settings, for the chosen project

    A possibility to provide custom host in links (started from 5.4 version)

    You can make this operation via API. For that just choose an API call Integration controller - Update project integration instance, and provide a link to your host in the field ' "rpHost": "custom_link.com" ''

    PUT/v1/integration/{projectName}/{integrationId}

    {
    "enabled": true,
    "integrationParameters": {
    "protocol": "smtp",
    "rpHost": "custom_link.com",
    "authEnabled": true,
    "port": "",
    "sslEnabled": false,
    "starTlsEnabled": true,
    "host": "smtp.com",
    "username": ""
    }
    }
    - - + + \ No newline at end of file diff --git a/plugins/ManagePlugins/index.html b/plugins/ManagePlugins/index.html index c5b639612..6c930e879 100644 --- a/plugins/ManagePlugins/index.html +++ b/plugins/ManagePlugins/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Manage plugins

    ReportPortal as a test management system can be reinforced by uploading plugins. For now, you can install the next plugins from the box:

    • Bug Tracking Systems plugins: Atlassian Jira Server, Atlassian Jira Cloud, Azure DevOps and Rally
    • E-mail server
    • Sauce Labs
    PluginFeatures
    Atlassian Jira Server/Atlassian Jira Cloud/Azure DevOps/RallyThis plugin can be required for projects that collect defects in a separate tracking tool. The integration provides an exchange of information between ReportPortal and Jira or Rally, for example: posting new issues to BTS, linking test failures with the existing issue in BTS, track issue statuses
    E-mail serverWith this plugin, you will be able to configure notifications about test result finish in real time.
    SauceLabsThis plugin helps you to integrate ReportPortal with Sauce Labs and watch a video of test executions right in the ReportPortal application on the log view.
    LDAP/Active directory/SAMLThis plugin helps authorize without new user creation
    Implement your own pluginhttps://reportportal.io/docs/dev-guides/PluginDevelopersGuide/

    Upload plugin

    Permissions: +

    Manage plugins

    ReportPortal as a test management system can be reinforced by uploading plugins. For now, you can install the next plugins from the box:

    • Bug Tracking Systems plugins: Atlassian Jira Server, Atlassian Jira Cloud, Azure DevOps and Rally
    • E-mail server
    • Sauce Labs
    PluginFeatures
    Atlassian Jira Server/Atlassian Jira Cloud/Azure DevOps/RallyThis plugin can be required for projects that collect defects in a separate tracking tool. The integration provides an exchange of information between ReportPortal and Jira or Rally, for example: posting new issues to BTS, linking test failures with the existing issue in BTS, track issue statuses
    E-mail serverWith this plugin, you will be able to configure notifications about test result finish in real time.
    SauceLabsThis plugin helps you to integrate ReportPortal with Sauce Labs and watch a video of test executions right in the ReportPortal application on the log view.
    LDAP/Active directory/SAMLThis plugin helps authorize without new user creation
    Implement your own pluginhttps://reportportal.io/docs/dev-guides/PluginDevelopersGuide/

    Upload plugin

    Permissions: Only ADMINISTRATOR can upload plugin.

    You can find the latest version of all ReportPortal plugins by the link. Then you should download the latest version of a needed plugin. Or you can use a direct link to the needed plugin from the table below.

    PluginLink to download
    Atlassian JIRA Serverhttps://search.maven.org/artifact/com.epam.reportportal/plugin-bts-jira or https://github.com/reportportal/plugin-bts-jira/packages
    Atlassian JIRA Cloudhttps://github.com/reportportal/plugin-bts-jira-cloud/packages
    Azure DevOpshttps://github.com/reportportal/plugin-bts-azure/packages
    Rallyhttps://search.maven.org/artifact/com.epam.reportportal/plugin-bts-rally or https://github.com/reportportal/plugin-bts-rally/packages
    SauceLabshttps://search.maven.org/artifact/com.epam.reportportal/plugin-saucelabs or https://github.com/reportportal/plugin-saucelabs/packages
    E-mail/LDAP/ Active directory/SAMLYou do not need to download these plugins, there are already available on the Plugin page

    For a plugin uploading please perform the following actions:

    • login ReportPortal with Admin account
    • come on Administrative> Plugins
    • click on a button Upload
    • choose .jar file which should be uploaded
    • and click Upload

    Technical requirements for the plugin:

    • a plugin should have the format: .jar
    • a plugin file size is up to 128Mb
    • a plugin should have a version
    • a plugin should have a Manifest
    • a plugin should have a plugin Extensions
    • Admin cannot upload a plugin with existing ID and existing version to the system

    Update a plugin

    Permissions: Only ADMINISTRATOR can update the plugin. It is the same procedure as for Uploading. You can upload a plugin with the latest version to the ReportPortal, and an existing version will be updated to the latest one.

    Enable / Disable a plugin

    Permissions: @@ -35,7 +35,7 @@ Pros: Project Manager or Administrator configures integrations per project, team members from different projects can not see configurations of each other.

    Use case 3:

    Situation: On ReportPortal instance there are several projects. Separate projects are added for different teams. But for one team has been added several projects. So several projects on ReportPortal have connections with one Jira (or Rally) project and several projects have a connection with different Jira (or Rally) projects. Solution: configure global integrations on the Management board, and configure project integrations for Jira (or Rally) plugin on the Project settings. Pros: Administrator configures integration once for those who need the same settings, and Project Manager or Administrator configures integrations per project, for those projects who need to limit access.

    - - + + \ No newline at end of file diff --git a/plugins/Rally/index.html b/plugins/Rally/index.html index ad3df6d70..da69d5cf6 100644 --- a/plugins/Rally/index.html +++ b/plugins/Rally/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Rally

    To install the Rally plugin, see Upload plugin section.

    Global RALLY integration

    Add new global RALLY integration

    If all projects on your instance are using the same RALLY projects, you will be able to configure global integrations which will be applied on all projects.

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on RALLY plugin panel

    4. Click on "Add integration" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project ID in BTS': <project ID in bug tracking system>
    'Authorization Type': ApiKey (predefined)
    'ApiKey': <RALLY user apikey>

    After you have created a connection with the RALLY project, you can choose predefined RALLY ticket fields. These fields will be shown to you all the time when you post the issue in the RALLY.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on all your projects will be able to submit issues in RALLY. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration"

    User can add several integrations, but with a different name to the one RALLY project.

    Use case:

    Situation: User wants to post to RALLY issues with type Defect and Task to the project NNN-MMM in RALLY. Is it possible? +

    Rally

    To install the Rally plugin, see Upload plugin section.

    Global RALLY integration

    Add new global RALLY integration

    If all projects on your instance are using the same RALLY projects, you will be able to configure global integrations which will be applied on all projects.

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on RALLY plugin panel

    4. Click on "Add integration" button

    5. Fill and confirm the authorization form

    'Integration Name': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project ID in BTS': <project ID in bug tracking system>
    'Authorization Type': ApiKey (predefined)
    'ApiKey': <RALLY user apikey>

    After you have created a connection with the RALLY project, you can choose predefined RALLY ticket fields. These fields will be shown to you all the time when you post the issue in the RALLY.

    This feature gives you the ability to choose which type you will post a ticket.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on all your projects will be able to submit issues in RALLY. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration"

    User can add several integrations, but with a different name to the one RALLY project.

    Use case:

    Situation: User wants to post to RALLY issues with type Defect and Task to the project NNN-MMM in RALLY. Is it possible? Yes!

    Solution: Add two integrations to the project NNN-MMM in RALLY with names f.e. "Project -1" and "Project -2". Add to the "Project -1" issue type Defect and for "Project -2" - issue type Task. While posing issue procedure, choose integration with needed type.

    Update global RALLY integration

    If you need to edit RALLY integration authorization parameters, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on RALLY plugin panel

    4. Click on a tab with existing integration

    5. Click on "Edit authorization" link

    6. Change "Integration name"

    7. Type your RALLY credentials

    8. Submit the form

    note

    You can edit only "Integration name". If you need other changes, please submit new integration.

    If you need to edit fields which should be posted in RALLY, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on RALLY plugin panel

    4. Click on a tab with existing integration

    5. Click on "Configure" button

    6. Choose issue type from the drop-down

    7. Check the needed fields and fill them in if necessary

    8. Click on "Submit" button

    Remove global RALLY integration

    If you need to remove RALLY integration, please perform actions:

    1. Log in as ADMIN

    2. Go to Administrative > Plugins

    3. Click on RALLY plugin panel

    4. Click on a tab with existing integration

    5. Click on "Remove integration"

    6. Submit the action

    Project RALLY integration

    Add new project RALLY integration

    If any project needs different RALLY configurations, you should unlink a project from Global configurations and add a project configuration. It means that now when a new global integration is added to the ReportPortal, it won't be applied to the unlinked project.

    For that,

    1. Log in as an ADMIN or Project Manager

    2. Go to Project Settings > Integrations

    3. Click on the RALLY integration panel

    4. Click on "Unlink and setup manually" button

    5. Fill and confirm the authorization form

    'Integration Name ': <The name which you want to give to your integration> - should be unique
    'Link to BTS': <valid URL of bug tracking system>
    'Project ID in BTS': <project ID in bug tracking system>
    'Authorization Type': Basic (predefined)
    'BTS Username': <RALLY user name>
    'BTS Password': <RALLY user password>

    After you have created a connection with the RALLY project, you can choose predefined RALLY ticket fields. These fields will be shown to you all the time when you post the issue in the RALLY.

    This feature gives you the ability to choose which type you will post a ticket with.

    To choose a needed issue type and predefined field for the chosen issue, you should perform the following actions:

    1. Click on "Configure" button

    2. Choose issue type from the drop-down

    3. Check the needed fields and fill them in if necessary

    4. Click on "Submit" button

    Now team members on this project will be able to submit issues in RALLY. Options for Post Issue / Link issue are activated.

    You can add more integrations by clicking on "Add integration" button.

    Reset to project RALLY Integrations

    If you want to delete project integrations with RALLY and link your project with global configurations, please perform actions described below:

    1. Log in as an ADMIN or Project Manager

    2. Go to Project Settings > Integrations

    3. Click on the RALLY integration panel

    4. Click on "Reset to global settings" button

    5. Confirm the action

    Post issue to Rally

    Posting an issue to Rally means to create a new issue in Rally from ReportPortal and upload logs and attachments from an execution.

    If you want to post a new issue to Rally, you need to have a project or global integration with Rally.

    Post issue via Step view

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator

    2. Go to a Step view

    3. Choose a needed item

    4. Click on "Actions" button

    5. Choose "Post issue" option

    6. Fill in the "Post issue" form with valid data

    `BTS`: if you have configured BTS integrations, you will be able to choose between them
    `Integration name`: from the drop-down, you can choose any of integrations for chosen earlier BTS
    `Predefined fields`: fields which you choose on Project Settings/ or Plugins
    `Included data`: which data should be posted to BTS (attachments, logs, comments)
    `ApiKey`: user apikey
    1. Submit the form

    2. A new issue will be posted in BTS with information from ReportPortal

    3. A label with issue ID will be added to the test item

    Linking an issue with an issue in Rally means adding a clickable link to an existing issue in Rally from ReportPortal that will show a status of this issue.

    Link issue via Step view

    1. Log in to ReportPortal as Admin, PM, Member, Customer or Operator

    2. Go to a Step view

    3. Choose a needed item

    4. Click on "Actions" button

    5. Choose "Link issue" option

    6. Fill in the "Link issue" form with valid data

    `BTS`: if you have configured BTS integrations, you will be able to choose between them
    `Integration name`: from the drop-down, you can choose any of integrations for chosen earlier BTS
    `Link to issue`: a full link to the item in BTS
    `Issue ID`: information which will be displayed on the label in ReportPortal
    1. Submit the form

    2. A label with issue ID will be added to the test item

    - - + + \ No newline at end of file diff --git a/plugins/SauceLabs/index.html b/plugins/SauceLabs/index.html index 7f2ec722e..34a360079 100644 --- a/plugins/SauceLabs/index.html +++ b/plugins/SauceLabs/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Sauce Labs

    To install the Sauce Labs plugin, see Upload plugin section.

    Add the Sauce Labs integration

    Configure the integration with Sauce Labs to watch a video of test executions in the our centralized test automation tool.

    Permissions:

    • User with account role ADMINISTRATOR can configure the integration for the whole instance or per project.
    • User with account role PROJECT MANAGER can configure the integration only on a project where they are assigned on as Project Manager.

    Global Sauce Labs integration

    To configure Sauce Labs for the whole instance:

    1. Log in to ReportPortal as an ADMIN user.

    2. Open the list on the right of the user's image.

    3. Click the 'Administrative' link.

    4. Click 'Plugins' from the left-hand sidebar.

    5. Click the 'Sauce Labs' tab.

    6. Click 'Add integration'.

    7. The following fields should be present:

      `User name`: <host_name_of_email_server>
      `Access token`: <your access token>
      `Data center`: <Europe, USA>
    8. Confirm data in the form.

    After you've added the Sauce Labs integration, you can use the Sauce Labs in ReportPortal.

    Project Sauce Labs integration

    If the plugin is configured on the global level, then all projects at this instance will use this configuration by default.

    However, you can unlink the integration from the global level and use a project level configuration instead.

    To unlink the integration, click 'Unlink & Setup Manually', then follow the on-screen instructions.

    How to use the Sauce Labs integration

    Before using this feature, you should report test results to ReportPortal with the attribute: SLID: XXXXXXXX.

    Where: SLID = Sauce Labs ID and XXXXXXXX = # of job in Sauce Labs

    The SLID: XXXXXXXX attribute links the execution in ReportPortal and a job in Sauce Labs. If a test item has attribute SLID: XXXXXXXX, and there is a global or project integration with Sauce Labs, a user will be able to view a video from Sauce Labs for the appropriate job in ReportPortal on a log view.

    - - +

    Sauce Labs

    To install the Sauce Labs plugin, see Upload plugin section.

    Add the Sauce Labs integration

    Configure the integration with Sauce Labs to watch a video of test executions in the our centralized test automation tool.

    Permissions:

    • User with account role ADMINISTRATOR can configure the integration for the whole instance or per project.
    • User with account role PROJECT MANAGER can configure the integration only on a project where they are assigned on as Project Manager.

    Global Sauce Labs integration

    To configure Sauce Labs for the whole instance:

    1. Log in to ReportPortal as an ADMIN user.

    2. Open the list on the right of the user's image.

    3. Click the 'Administrative' link.

    4. Click 'Plugins' from the left-hand sidebar.

    5. Click the 'Sauce Labs' tab.

    6. Click 'Add integration'.

    7. The following fields should be present:

      `User name`: <host_name_of_email_server>
      `Access token`: <your access token>
      `Data center`: <Europe, USA>
    8. Confirm data in the form.

    After you've added the Sauce Labs integration, you can use the Sauce Labs in ReportPortal.

    Project Sauce Labs integration

    If the plugin is configured on the global level, then all projects at this instance will use this configuration by default.

    However, you can unlink the integration from the global level and use a project level configuration instead.

    To unlink the integration, click 'Unlink & Setup Manually', then follow the on-screen instructions.

    How to use the Sauce Labs integration

    Before using this feature, you should report test results to ReportPortal with the attribute: SLID: XXXXXXXX.

    Where: SLID = Sauce Labs ID and XXXXXXXX = # of job in Sauce Labs

    The SLID: XXXXXXXX attribute links the execution in ReportPortal and a job in Sauce Labs. If a test item has attribute SLID: XXXXXXXX, and there is a global or project integration with Sauce Labs, a user will be able to view a video from Sauce Labs for the appropriate job in ReportPortal on a log view.

    + + \ No newline at end of file diff --git a/quality-gates/AssessmentOfTestResultsUsingQualityGates/index.html b/quality-gates/AssessmentOfTestResultsUsingQualityGates/index.html index 213ac322b..b64904f78 100644 --- a/quality-gates/AssessmentOfTestResultsUsingQualityGates/index.html +++ b/quality-gates/AssessmentOfTestResultsUsingQualityGates/index.html @@ -12,19 +12,19 @@ - - + +
    -

    Assessment of test results using Quality Gates

    Now the system is preconfigured, and you can start using Quality Gates Analysis.

    Quality Gates plugin can be used with CI/CD tools - in this case, and Quality Gate status will be sent to CI/CD pipeline. +

    Assessment of test results using Quality Gates

    Now the system is preconfigured, and you can start using Quality Gates Analysis.

    Quality Gates plugin can be used with CI/CD tools - in this case, and Quality Gate status will be sent to CI/CD pipeline. But also, Quality Gates can be used just as a way of test results analysis.

    First, let's discuss how ReportPortal assesses a test run quality and provides a full report with real time test results. Second, let's check how to send assessment results to CI/CD.

    Quality Gate Analysis

    How to run Quality Gates Manually

    By default, all launches have "N\A" status. It means that Quality Gate analysis has not been run for these launches.

    If you want to run Quality Gate analysis manually, click on the label "N/A" and click on the "Run Quality Gate" in the opened pop-up.

    How to recalculate Quality Gates

    If you want to recalculate Quality Gate status for a launch, just perform next actions:

    • click on the label with a status of a launch
    • click on the "Recalculate" in the opened pop-up

    Quality Gates can not be run for launches in progress.

    note

    If Quality Gate status has been already sent to CI/CD, a status can not be recalculated for a such launch.

    How to run Quality Gates Automatically

    You can configure Auto Quality Gate Analysis on the Project Settings. If you switch Quality Gate Analysis ON, the system will start QG analysis on the launch finish.

    Quality Gate Status and Timeout

    When a launch finishes, the system starts Quality Gate Analysis.

    First, the system checks if there Quality Gate for a launch under analysis. If there is no, such Quality Gate, the system shows error message. Second, if Quality Gates is found, the systems checks all rules in Quality Gate one by one and define a status for each rule Third, if all rules are done, the system defines the status of a whole Quality Gate.

    How is status calculated:

    StatusCalculationMeaning
    PassedAll rules in a Quality Gate have status PASSEDQuality Assessment passed, a test run matches specified quality criteria
    UndefinedIf Quality Gate does not have FAILED, IN PROGRESS rules, but at least one rule has status UndefinedQuality Assessment can not be finished ❓
    In ProgressIf Quality Gate does not have FAILED rules, but at least one rule in a Quality Gate has status IN PROGRESSQuality Assessment is in progress
    FailedAt least one rule in a Quality Gate has status FAILEDQuality Assessment failed, a test run does not match specified quality criteria

    Forth, if there is an integration with CI/CD, the system sends status to CI/CD tools to a pipeline.

    ❓ The reasons why Quality Gates can get a status Undefined:

    • For "Amount of issues" rule: if a number of To Investigate issues in the analyzed launch is more than allowable To Investigate level
    • For "New Failure": if a baseline is not found in the system

    If you get this status, you can proceed with launch analysis (or choose another baseline) and rerun Quality Gates. For that check the section ### How to recalculate Qulaity Gates.

    Timeout

    Specially for integration with CI\CD, Quality Gates has parameter Timeout. If a launch whose status should be sent to a pipeline, gets UNDEFINED status, the system uses a value from Timeout. Default Timeout equals to 2 hours. It means, that after 2 hours after launch finish, the system force recaluculats Quality Gate Status and defined status.

    Jenkins Job StatusQuality Gate StatusDescription
    SUCCESSPASSEDAll Rulles Passed
    FAILEDFAILEDAt least one rule does not pass

    If you want to choose other options for a timeout, you can do it:

    • Login ReportPortal as Project Manager or Admin
    • Open Project Settings> Quality Gates
    • Click on the pencil on the Quality Gate rule
    • Click on "Edit Details."
    • Choose needed option in a dropdown "Timeout"
    • Save a Quality Gate

    If there is no needed option in the dropdown, you can specify custom value via API.

    Quality Gate Report

    A Quality Gate report is a full report that shows information on Quality gate results. This is a table that shows:

    • all rules in a Quality Gate
    • rule status: Passed/Failed/Skipped
    • expected results
    • actual results

    All actual results are clickable in the report except New Failure. A clickable area for New failure will be available in the version 5.7. So user can drill down and investigate items, that became a reason of build failure.

    - - + + \ No newline at end of file diff --git a/quality-gates/DeleteQualityGates/index.html b/quality-gates/DeleteQualityGates/index.html index e6fce989d..ea8d336f1 100644 --- a/quality-gates/DeleteQualityGates/index.html +++ b/quality-gates/DeleteQualityGates/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/quality-gates/FeatureOverview/index.html b/quality-gates/FeatureOverview/index.html index 0abd75ef1..d3c298477 100644 --- a/quality-gates/FeatureOverview/index.html +++ b/quality-gates/FeatureOverview/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Feature overview

    Quality Gate analysis provides capabilities to speed up CI/CD pipeline by sending auto-feedback to your CI/CD tools. ReportPortal assesses the build quality and sends auto feedback to CI/CD.

    Quality Gates plugin adds to our continuous testing platform possibilities:

    • to create quality rules based on general test automation KPI: number of executed tests and executed tests, failure rate, failure of critical components, number of issues in completed tests, number of essential issues in the critical parts, new failures & new errors in the build
    • run Quality Gates analysis for build and view build report that helps to troubleshoot issues in the build
    • automatically send Quality Gates status to CI/CD.
    - - +

    Feature overview

    Quality Gate analysis provides capabilities to speed up CI/CD pipeline by sending auto-feedback to your CI/CD tools. ReportPortal assesses the build quality and sends auto feedback to CI/CD.

    Quality Gates plugin adds to our continuous testing platform possibilities:

    • to create quality rules based on general test automation KPI: number of executed tests and executed tests, failure rate, failure of critical components, number of issues in completed tests, number of essential issues in the critical parts, new failures & new errors in the build
    • run Quality Gates analysis for build and view build report that helps to troubleshoot issues in the build
    • automatically send Quality Gates status to CI/CD.
    + + \ No newline at end of file diff --git a/quality-gates/HowToInstallQualityGates/index.html b/quality-gates/HowToInstallQualityGates/index.html index 5a90b3d68..aa88cf6b9 100644 --- a/quality-gates/HowToInstallQualityGates/index.html +++ b/quality-gates/HowToInstallQualityGates/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI/index.html b/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI/index.html index 1432b41ae..7dd925ffc 100644 --- a/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI/index.html +++ b/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCI/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Integration with GitLab CI

    In this tutorial we will walk you through the process of integrating ReportPortal with GitLab CI. It is not the case for GitLab, but there are some recipes.

    Prerequisites

    To run your tests in any kind of CI, you first need a way to execute them in the +

    Integration with GitLab CI

    In this tutorial we will walk you through the process of integrating ReportPortal with GitLab CI. It is not the case for GitLab, but there are some recipes.

    Prerequisites

    To run your tests in any kind of CI, you first need a way to execute them in the console. E.G. for Java this might be calling a build tool like Gradle or Maven with: ./gradlew test or ./mvnw test respectively. For Python it might be pytest command. Your tests should be already integrated with a ReportPortal agent. To @@ -137,7 +137,7 @@ shell scripts and console commands. We also implemented HashiCorp Vault integration to store our test secrets securely. To provide more outlook we described how to run tests in Kotlin and Python.

    And here are the corresponding pipeline files, which we implemented:

    - - + + \ No newline at end of file diff --git a/quality-gates/IntegrationWithCICD/IntegrationWithJenkins/index.html b/quality-gates/IntegrationWithCICD/IntegrationWithJenkins/index.html index a13ee4db4..b787aa439 100644 --- a/quality-gates/IntegrationWithCICD/IntegrationWithJenkins/index.html +++ b/quality-gates/IntegrationWithCICD/IntegrationWithJenkins/index.html @@ -12,17 +12,17 @@ - - + +
    -

    Integration with Jenkins

    Jenkins configuration

    1. Go to “Manage Jenkins” -> “Manage Plugins”.
    2. Make sure that the necessary Jenkins plugin is installed:

    a. Switch to the “Installed” tab and search for the “Webhook Step” plugin.

    b. If no results of the search:

    i. Switch to the “Available” tab;

    ii. Search for “Webhook Step”;

    iii. Install the plugin with “Download now and install after restart”.

    1. Define webhook configuration to the Jenkins job/pipeline before tests execution:
    def hook = registerWebhook();
    def encodedUrl = sh(script: "echo -n ${hook.getURL().toString()} | base64 -w 0", returnStdout: true)

    encodedUrl – this is a unique string that will be generated from the Jenkins job/pipeline and connect each reported launch with the appropriate Jenkins run from which the launch was reported.

    Put the encodedUrl variable into the test execution string at the enumeration of RP.attributes. For example(Maven build):

    Drp.attributes='k1:v1;k2:v2;rp.webhook.key:${encodedUrl}'
    1. Configure webhook waiting data from RP:

    a. Option #1

    This option allows sending the Quality Gates result status to the separate pipeline stage. It doesn’t affect the tests execution stage, and the status of that stage will be determined by the result of the Quality Gate status. +

    Integration with Jenkins

    Jenkins configuration

    1. Go to “Manage Jenkins” -> “Manage Plugins”.
    2. Make sure that the necessary Jenkins plugin is installed:

    a. Switch to the “Installed” tab and search for the “Webhook Step” plugin.

    b. If no results of the search:

    i. Switch to the “Available” tab;

    ii. Search for “Webhook Step”;

    iii. Install the plugin with “Download now and install after restart”.

    1. Define webhook configuration to the Jenkins job/pipeline before tests execution:
    def hook = registerWebhook();
    def encodedUrl = sh(script: "echo -n ${hook.getURL().toString()} | base64 -w 0", returnStdout: true)

    encodedUrl – this is a unique string that will be generated from the Jenkins job/pipeline and connect each reported launch with the appropriate Jenkins run from which the launch was reported.

    Put the encodedUrl variable into the test execution string at the enumeration of RP.attributes. For example(Maven build):

    Drp.attributes='k1:v1;k2:v2;rp.webhook.key:${encodedUrl}'
    1. Configure webhook waiting data from RP:

    a. Option #1

    This option allows sending the Quality Gates result status to the separate pipeline stage. It doesn’t affect the tests execution stage, and the status of that stage will be determined by the result of the Quality Gate status. Add additional pipeline stage Wait for webhook and define the particular TIMEOUT_TIME, how long Jenkins should wait for data from RP:

    stage('Wait for webhook') {
    timeout(time: params.TIMEOUT_TIME, unit: params.TIMEOUT_UNIT) {

    echo 'Waiting for RP processing...'
    data = waitForWebhook hook;
    echo "Processing finished... ${data}"

    def jsonData = readJSON text: data
    assert jsonData['status'] == 'PASSED'
    }
    }

    Parameters for TIMEOUT_TIME and TIMEOUT_UNIT can be defined like that:

    parameters {
    string(name: 'TIMEOUT_TIME', defaultValue: '30', description: '')
    string(name: 'TIMEOUT_UNIT', defaultValue: 'SECONDS', description: '')
    }

    b. Option #2

    This option should send the results from the RP to the tests run pipeline stage, and the status of that stage(tests execution) will be determined by the result of the Quality Gate status. Add next code in the pipeline stage, where tests run:

    echo 'Waiting for RP processing...'
    data = waitForWebhook hook;
    echo "Processing finished... ${data}"

    def jsonData = readJSON text: data
    assert jsonData['status'] == 'PASSED'

    If the Jenkins received a response about QualityGate status from RP, the build status should be appropriately marked:

    Jenkins Job StatusQuality Gate StatusDescription
    SUCCESSPASSEDQuality Gate is passed
    ABORTEDUNDEFINEDThe Jenkins timeout has been exceeded
    FAILEDFAILEDQuality Gate is failed
    - - + + \ No newline at end of file diff --git a/quality-gates/IntegrationWithCICD/index.html b/quality-gates/IntegrationWithCICD/index.html index 3e5559069..bbf50fb0a 100644 --- a/quality-gates/IntegrationWithCICD/index.html +++ b/quality-gates/IntegrationWithCICD/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/quality-gates/QualityGateEdit/index.html b/quality-gates/QualityGateEdit/index.html index 95b543538..819132c10 100644 --- a/quality-gates/QualityGateEdit/index.html +++ b/quality-gates/QualityGateEdit/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/quality-gates/QualityGatePurpose/index.html b/quality-gates/QualityGatePurpose/index.html index 7a0c95e29..85c2a31ba 100644 --- a/quality-gates/QualityGatePurpose/index.html +++ b/quality-gates/QualityGatePurpose/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Quality Gate Purpose

    ReportPortal is a continuous testing platform with build-in functionality - Quality Gates.

    The primary Quality Gate purpose is to speed up a CI/CD pipeline.

    Quality Gates plugin supports the next user flow:

    • Create Quality Gate rules in ReportPortal
    • Start a test job in CI/CD with webhook
    • ReportPortal assesses launch quality using created rules
    • ReportPortal sends auto feedback to CI/CD tool with status Passed or Failed
    • Based on ReportPortal Feedback, CI/CD tool fails a build or promotes it to the next stage

    The second purpose of Quality Gate is to simplify interactions between a QA team and business stakeholders. Quality Gates provides a possibility to create business-friendly rules such as:

    • define required number of tests in a job
    • specify tests that should be executed (features, components)
    • define minimum executed tests failure rate
    • new failure of critical components
    • define a number of issues in executed tests
    • define a number of critical issues in the critical components
    • new failures & new errors in the build

    And it leads us to the third purpose of Quality Gates. It is a full-featured report on Quality Gates analysis results which helps to troubleshoot problems and fix them.

    - - +

    Quality Gate Purpose

    ReportPortal is a continuous testing platform with build-in functionality - Quality Gates.

    The primary Quality Gate purpose is to speed up a CI/CD pipeline.

    Quality Gates plugin supports the next user flow:

    • Create Quality Gate rules in ReportPortal
    • Start a test job in CI/CD with webhook
    • ReportPortal assesses launch quality using created rules
    • ReportPortal sends auto feedback to CI/CD tool with status Passed or Failed
    • Based on ReportPortal Feedback, CI/CD tool fails a build or promotes it to the next stage

    The second purpose of Quality Gate is to simplify interactions between a QA team and business stakeholders. Quality Gates provides a possibility to create business-friendly rules such as:

    • define required number of tests in a job
    • specify tests that should be executed (features, components)
    • define minimum executed tests failure rate
    • new failure of critical components
    • define a number of issues in executed tests
    • define a number of critical issues in the critical components
    • new failures & new errors in the build

    And it leads us to the third purpose of Quality Gates. It is a full-featured report on Quality Gates analysis results which helps to troubleshoot problems and fix them.

    + + \ No newline at end of file diff --git a/quality-gates/QualityRulesConfiguration/index.html b/quality-gates/QualityRulesConfiguration/index.html index 36e3c526b..1b6fb6af7 100644 --- a/quality-gates/QualityRulesConfiguration/index.html +++ b/quality-gates/QualityRulesConfiguration/index.html @@ -12,19 +12,19 @@ - - + +
    -

    Quality Rules Configuration

    Now let's configure the Quality rule, which will be used for launch quality assessment.

    Quality Gate creation

    Quality Gates can be configured on the Project Settings on the tab Quality Gate.

    The Project Manager or Admin can create several rules for one project.

    For Quality Gate creation Project Manager or Admin should:

    • Open Project Settings> Quality Gates
    • Click on the Create Gate button
    • In Create Quality Gate fill in the form
    • Click on the button "Save"
    • A Quality Gate is created successfully
    • Quality Gate is added to the Quality Gate List
    Quality Gate Name: (Min length 1 - max length 55) A name that will be added to the Quality Gate report on All launches
    Analyzed Launch: Launch Name of a launch that should be analyzed
    Attributes: key: value AND key:value AND key:value (example = build: 5.0 AND device: MacOS AND test plan: Regression)

    Quality Gate ordering

    Quality Gate rules

    When Quality Gate is created, you can fill your gate with quality rules.

    There are four types of Quality Gate rules:

    • Amount of tests
    • Amount of issues
    • Percent
    • New failures
    • New errors (from version 5.7)

    Amount of tests in the run

    Case: Regression suite has 224 tests. You want to track that all tests should be run every time.

    The purpose of the rule is to block a run that contains not all tests so that you can define the minimum number of tests that should be in the run.

    For adding this rule Project Manager or Admin should:

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule"
    4. Choose the option "Amount"
    5. Choose the option "All tests"
    6. Add a number of min allowable amount of tests in the launch - N
    7. Click on the tick
    8. The rule is added to the Quality Gate

    Now the system will automatically analyze a launch and compare the number of tests in the analyzed launch with the number in the "amount" rule in the Quality Gate. If the number of tests in the launch is less than in the rule, the system fails the rule and Quality Gate.

    note

    You can add only 1 "All tests amount" rule to 1 Quality Gate.

    Amount of tests in a component/feature/etc

    Case: Regression suite contains 24 tests with critical priority. You want to track if these tests are executed every time.

    You can also track the number of tests that belong to a feature, component, priority or others in a launch. +

    Quality Rules Configuration

    Now let's configure the Quality rule, which will be used for launch quality assessment.

    Quality Gate creation

    Quality Gates can be configured on the Project Settings on the tab Quality Gate.

    The Project Manager or Admin can create several rules for one project.

    For Quality Gate creation Project Manager or Admin should:

    • Open Project Settings> Quality Gates
    • Click on the Create Gate button
    • In Create Quality Gate fill in the form
    • Click on the button "Save"
    • A Quality Gate is created successfully
    • Quality Gate is added to the Quality Gate List
    Quality Gate Name: (Min length 1 - max length 55) A name that will be added to the Quality Gate report on All launches
    Analyzed Launch: Launch Name of a launch that should be analyzed
    Attributes: key: value AND key:value AND key:value (example = build: 5.0 AND device: MacOS AND test plan: Regression)

    Quality Gate ordering

    Quality Gate rules

    When Quality Gate is created, you can fill your gate with quality rules.

    There are four types of Quality Gate rules:

    • Amount of tests
    • Amount of issues
    • Percent
    • New failures
    • New errors (from version 5.7)

    Amount of tests in the run

    Case: Regression suite has 224 tests. You want to track that all tests should be run every time.

    The purpose of the rule is to block a run that contains not all tests so that you can define the minimum number of tests that should be in the run.

    For adding this rule Project Manager or Admin should:

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule"
    4. Choose the option "Amount"
    5. Choose the option "All tests"
    6. Add a number of min allowable amount of tests in the launch - N
    7. Click on the tick
    8. The rule is added to the Quality Gate

    Now the system will automatically analyze a launch and compare the number of tests in the analyzed launch with the number in the "amount" rule in the Quality Gate. If the number of tests in the launch is less than in the rule, the system fails the rule and Quality Gate.

    note

    You can add only 1 "All tests amount" rule to 1 Quality Gate.

    Amount of tests in a component/feature/etc

    Case: Regression suite contains 24 tests with critical priority. You want to track if these tests are executed every time.

    You can also track the number of tests that belong to a feature, component, priority or others in a launch. For that, tests in the analyzed launch should have attributes (f.i. feature: Payment, or component: Payment, or priority: critical, or any others).

    Then you need to add an "amount" rule with an attribute option:

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule"
    4. Choose the option "Amount"
    5. Choose option "Tests with attributes"
    6. Add a number of min allowable amount of tests for the component, feature etc. - N
    7. Click on the tick
    8. The rule is added to the Quality Gate

    Now the system will automatically analyze a launch and compare the number of tests with specified attributes in the analyzed launch with a number in the "amount" rule in the Quality Gate. If the number of tests is less than in the rule, the system fails the rule and Quality Gate.

    note

    You can add several "Tests with attribute amount" rules to the Quality Gate. But it is impossible to create duplicates.

    Failure rate of the run

    Case 1: You want to track that the passing rate for regression suite should be no more than 20%.

    Case 2: You want to track that all critical tests in regression suite are always passed.

    The purpose of the rule is to block a run that has a not allowable passing rate so that you can define the minimum failure rate for the run.

    Launch Failure rate

    For adding this rule Project Manager or Admin should:

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule"
    4. Choose the option "Percent"
    5. Choose the option "All tests"
    6. Add a % of min allowable failure rate - N%
    7. Click on the tick
    8. The rule is added to the Quality Gate

    On the finish, the system will automatically analyze a launch and compare failure rate in the analyzed launch with % in the "failure per cent" rule in the Quality Gate. If the failure rate in the launch is more than in the rule, the system fails the rule and Quality Gate.

    note

    How a failure rate is calculated
    Failure rate = items with type STEP with status FAILED / ALL items with type STEP in the analyzed launch

    You can add only 1 "All tests failure rate" rule to 1 Quality Gate.

    Failure rate in a component/feature/etc

    You can also track the failure rate of tests that belong to a feature, component, priority or others in a launch. For that, tests in the analyzed launch should have attributes (f.i. feature: Payment, or component: Payment, or priority: critical, or any others).

    Then you need to add an "amount" rule with an attribute option:

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule"
    4. Choose the option "Percent"
    5. Choose option "Tests with attributes"
    6. Add a % of min allowable failure rate - N%
    7. Click on the tick
    8. The rule is added to the Quality Gate

    In this case, on the finish, the system will automatically analyze a launch and compare the failure rate of tests with a specified attribute in the analyzed launch with failure rate from the rule in the Quality Gate. If the failure rate is more than specified in the rule, the system fails the rule and Quality Gate.

    note

    How a failure rate is calculated

    Failure rate for tests with a attribute = items with type STEP with status FAILED and with a specified attribut / ALL items with type STEP in the analyzed launch and with a specified attribut

    You can add several "Tests with attribute percent" rules to the Quality Gate. But it is impossible to create duplicates.

    Not passing rate in the launch or a component/feature/etc.

    You can use the "Percent rule" in several options: Failure /Not passed.

    The failure rule is described in the previous sections.

    If you choose the "Not passed" option, the system will use another calculation method.

    note

    How a notpassed rate is calculated

    Not passed rate = items with type STEP with status FAILED and SKIPPED / ALL items with type STEP in the analyzed launch

    Not passed rate for tests with a attribute = items with type STEP with status FAILED and SKIPPED and with a specified attribut / ALL items with type STEP > in the analyzed launch and with a specified attribut

    Amount of issues in the run

    Case 1: You want to track that the regression suite run should not have a critical issue or Product bugs.

    Case 2: Regression suite contains 500 tests with critical priority. You want to track that the run should not have critical issues or Product bugs (or any other) in these 500 tests.

    Amount of issues also has 2 options "All tests" and "Tests with the attribute". The purpose of the rule is to limit the number of unwanted defects in the run. With the option "All tests", you can restrict issues for all tests in the launch.

    With the option "Test with attributes", you can limit issues in the critical features, components, etc.

    Ammount of issues in the launch

    For adding this rule Project Manager or Admin should:

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule"
    4. Choose the option "Amount of issues"
    5. Choose the option "All tests"
    6. Choose a defect type: "Total Defect Types" or "Defect Type"
    7. Add a number of min allowable issues - N%
    8. Click on the tick
    9. The rule is added to the Quality Gate

    On the finish, the system will automatically analyze a launch and compare a number of specified defects in the analyzed launch with a issues numbers in the "amount issues" rule in the Quality Gate. If the a number of issues in the launch is more than in the rule, the system fails the rule and Quality Gate.

    note

    How a number of issues is calculated

    if in the rule specified "Total Defect type"

    A number of issues in the test run = SUM of items with defect types which belong to the Defect type group

    if in the rule specified "Defect type"

    A number of issues in the test run = number of items with specified defect types

    Ammount of issues in tests with attribute

    For this rule a user can choose an option Tests with an attribute". The logic for this rule is the same as for rule "Amount of tests with an attribute".

    Allowable level of To investigate

    When you choose a rule "Amount of issues", the system automatically adds a parameter "Allowable To investigate level" to the Quality Gate.

    What does this parameter mean?

    The purpose of the rule is a check and a guarantee that the run does not contain specified issues. But if a launch includes "To investigate", the system can not make an analysis of the system and guarantee that the forbidden problems are absent in a launch.

    For this reason, we have added the parameter "Allowable To investigate level". By default, this parameter equals 0. But you can change this parameter and set your custom value.

    For this Project Manager or Admin can edit Quality Gate:

    • Open Project Settings> Quality Gates
    • Click on the pencil on the Quality Gate
    • Click on the button "Edit Details"
    • Change value in the field "Allowable TI"
    • Click on the button "Save"

    New failures in the run

    Case 1: Regression suite has 1000 tests. In the last released version, five tests failed in a regression suite. You want to track that the regression runs on the version in development should not have new failures.

    Case 2: Regression suite contains 500 tests with critical priority. In the last released version 1 test with critical priority failed. You want to track that critical tests in the regression run on the version in development should not have new failures.

    The purpose of the rule is to block a run that has new failures compared to a chosen baseline.

    New failures also have 2 options "All tests" and "Tests with an attribute". The purpose of the rule is to block a run that has new failures compared to a chosen baseline.

    1. Open Project Settings> Quality Gate
    2. Click on the pencil on the Quality Gate
    3. Click on the drop-down: "Add a new rule."
    4. Choose the option "New failure."
    5. Choose the option "All tests"/"Test with attributes."
    6. Click on the tick
    7. The rule is added to the Quality Gate

    In this case, on the finish, the system will automatically analyze a launch and compare failed tests /or failed tests with the specified attribute in the analyzed launch with tests in the baseline. It fails a rule if the system detects a new failure in the launch or in tests with specified attributes.

    How does the rule works

    For defining test uniqueness, our continuous testing platform uses Test Case ID principles.

    note

    For now, ReportPortal can not process items with the same Test Case ID correctly.

    How to choose a Baseline for the "New failures" rule

    Default Baseline

    By default, a system will use a previous launch for comparison. For example, for "Launch A #3", the system will use "Launch A #2" as a baseline. If there is no "Launch A #2" (f.e. this launch has been deleted by retention job) in the system, the system will use "Launch A #1".

    If there is no fitting launch in the system, the "New failure" rule will get the status "Undefine".

    Customized Baseline

    If you want to choose other options for a baseline, you can do it:

    • Login ReportPortal as Project Manager or Admin
    • Open Project Settings> Quality Gates
    • Click on the pencil on the Quality Gate rule
    • Click on "Edit Details."
    • Unclick a checkbox on "Choose a previous launch as a baseline."
    • The system activates fields for baseline configuration
    CaseFileds configuration
    You want to specify a static launch that should always be usedSelect launch name and add launch number in the baseline section
    You want to specify dynamic launcgSelect launch name and check a button "Latest" ❓

    ❓ When you use "latest", the system will use the latest launch with a specified launch name, which has been run before the analyzed launch. If you want to specify a baseline, you also can add launch attributes. In this case, the system will use the latest launch with specified launch name and attributes, which have been run before the analyzed launch.

    New errors in the run

    “Unique errors” functionality with a new Quality Gates rule – New Errors – was implemented in version 5.7. This feature saves your time for searching and analyzing repeated errors in launches. “New Errors” rule will help to group errors into new and known ones and, for example, fail build if there are new error not seen previously.

    To begin using this functionality, you need to create a Quality Gate and add the “New Errors” rule. Please follow the steps below:

    1) Log in to ReportPortal as Admin/PM.

    2) Go to Project Settings.

    3) Select Quality Gates section.

    4) Click Create Quality Gate button.

    5) Enter Quality Gate Name and Analyzed Launch, then click Save button.

    note

    if you want the Quality Gate not to run for all launches, you can adjust it only for the launches with specific attributes. Click Add attribute and specify value and key, e.g., browser.

    On the example in the screenshot above Quality Gate will run for launches with name “Test” with attributes Browser Chrome, Feature Reporting, Device MacBook.

    6) Click on the Add a new rule dropdown and select New Errors.

    Click the “confirm” icon.

    note

    Please, note that “New Errors” rule can be created with “All tests” condition only.

    Before running automation tests, make sure that “Quality Gates” feature is ON.

    Now everything is ready to use.

    7) Go to automation testing tool.

    8) Run autotests.

    9) Go to ReportPortal.

    10) Open the Launches section and click the Refresh button at the top.

    11) Verify the Quality Gates' status.

    Passed - there are no failures.

    Failed - there are new errors.

    N/A - appears if the quality gate was created after a launch was finished, or there is no quality gate for this launch. If the status is Not Available, click on the “N/A” and then click “Run Quality Gate” button (+ “Refresh”).

    12) To look at the failed test results, click on the Failed status and then click on the number under Current column.

    You will be redirected to the Unique errors tab with a list of all new error logs of the launch. If you want to see known issues as well, open the All Unique Errors dropdown at the top and click the Known Errors checkbox.

    By default, a previous launch execution is used as a Baseline Launch for the Quality Gate. Besides, you can as well define any other launch by specifying its name and sequence number or select Latest for the prior run of the specified launch to be used as a baseline.

    To make these changes, click Edit Details on the Quality Gate page and uncheck the Choose a previous launch as a baseline checkbox.

    Follow the steps below depending on the preferable settings for the Baseline Launch.

    In this way you can compare analyzed launch not only with its previous execution but also with another launch.

    - - + + \ No newline at end of file diff --git a/quality-gates/UploadQualityGateToReportPortal/index.html b/quality-gates/UploadQualityGateToReportPortal/index.html index 759c66663..d73d8f711 100644 --- a/quality-gates/UploadQualityGateToReportPortal/index.html +++ b/quality-gates/UploadQualityGateToReportPortal/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Upload Quality Gate to ReportPortal

    The default configuration of our continuous testing platform doesn't contain Quality Gate. For adding this feature, you need to receive a link to the .jar file from ReportPortal.

    Download the .jar file and upload it to ReportPortal. Fo that pleases perform, following actions:

    • Login ReportPortal as an Admin
    • Open Admin Page > Plugins
    • Click on the button Upload
    • Add .jar file to the modal Upload plugin
    • And click the button Upload
    • Reload page

    As soon as the plugin has been added to the ReportPortal, a new Quality Gates tab will be added to the Project Settings.

    On the All launches page, the system adds a label "N/A" to each launch. +

    Upload Quality Gate to ReportPortal

    The default configuration of our continuous testing platform doesn't contain Quality Gate. For adding this feature, you need to receive a link to the .jar file from ReportPortal.

    Download the .jar file and upload it to ReportPortal. Fo that pleases perform, following actions:

    • Login ReportPortal as an Admin
    • Open Admin Page > Plugins
    • Click on the button Upload
    • Add .jar file to the modal Upload plugin
    • And click the button Upload
    • Reload page

    As soon as the plugin has been added to the ReportPortal, a new Quality Gates tab will be added to the Project Settings.

    On the All launches page, the system adds a label "N/A" to each launch. A label "N/A" means that the Quality Gates has not been run for a launch yet.

    - - + + \ No newline at end of file diff --git a/releases/Version23.2/index.html b/releases/Version23.2/index.html index d34e6aa5f..f77560d18 100644 --- a/releases/Version23.2/index.html +++ b/releases/Version23.2/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Version v.23.2

    1. What's Changed:

    • New feature - Monitoring:

    A new Event Monitoring interface has been introduced, providing administrators with a convenient means to review all activities at the Project level through the Search & Filter functionality within the Admin panel. Events at the instance level are not visible on the UI, but they are securely stored in the database. This data can be easily transmitted to SIEM systems for future monitoring and analysis.

    More details can be found via the link.

    • Project Activity Panel Adjustments:

    The list of project activities displayed in the Project Activity Panel has been expanded.

    More details can be found via the link.

    info

    Please take into account that starting from this point forward, all events will have a new format for their storing in the database. Consequently, all events which have been stored prior to version 23.2 will be deleted.

    • New feature – Delete Account:

    Now instance administrators can empower users to delete their accounts and obfuscate associated personal data.

    More details can be found via the link.

    • New feature – Personal Data Retention policy:

    ReportPortal now offers the option to set a retention period for collected personal data during instance configuration.

    More details can be found via the link.

    note

    Please note that Features 3 and 4 are configurable, giving you the flexibility to decide whether you want to use these features or not. If you choose to utilize them, you can configure them using environmental variables. Further details can be found in the respective documentation.

    • New feature – API Key:

    You can now generate as many API Keys as you need. You also have the ability to keep track of the creation date of API Keys and revoke any that are unused. Old tokens will still continue to function. Additionally, easy identification of the purpose of API Keys is facilitated through the use of prefixes.

    More details can be found via the link.

    • Gitlab CI integration Workaround:

    More details can be found via the link.

    2. Small updates:

    • “Load current step” functionality adjustments:

    Minor refinements have been applied to the "Load current step" functionality. Now, you can access the "Load current step" feature by hovering over a step.

    • Download file name changes:

    Attachment details and download format have been revised: files are now downloaded with the real file names.

    • Configuration examples updates:

    Configuration examples on the user profile page have been updated.

    3. Technical Improvements:

    • Storage layer now supports S3 storage, allowing data consolidation into a single bucket for the entire instance.

    • We’ve added postfix for bucket names in binary storage.

    • We’ve updated dependencies with security fixes: service-auto-analyzer and service-metrics-gatherer.

    • The issue of slow Log View loading when STEP has a complex structure of the nested steps nesting and count of them has been resolved and now up to 7x faster.

    • Service-jobs stability is improved during the reporting logs with the large stack traces.

    • We’ve optimized the attachments cleaning mechanism that allows us to increase the default value of the chunk_size by 20 times: from 1000 to 20000 in the docker compose and Kubernetes deployments.

    • Content Security Policy has been extended by adding the .browserstack.com. Now you can embed videos as a markdown from BrowserStack in order to ease failed tests troubleshooting.

    • Job for Flushing Demo data works as expected thanks to sql error fix.

    • We’ve updated react to version 17 and its dependencies to reduce the number of vulnerabilities and have a smooth transition to version 18.

    • Issues arising when service-api is starting (connected to bucket structure update or the binary storage type update) while there are integrations to external services like Jira have been resolved. Old logic for migrating integration salt has been removed.

    • Launches import via API is possible with additional parameters: name, description, attributes.

    • Rename notIssue parameter for import launch : For the end-point POST/v1 /{projectName} /launch /import parameter notIssue is renamed to skippedIsNotIssue. Logic remains the same.

    4. Enhancements Based on Community Feedback:

    • #1815, #1795, #957, #1644, #1590. All ReportPortal images now support multiple platforms: linux/amd64

    • #1970. Deserialization issue has been fixed.

    5. Released versions

    Service NameRepositoryTag
    Indexreportportal/service-index5.10.0
    Authorizationreportportal/service-authorization5.10.0
    UIreportportal/service-ui5.10.0
    APIreportportal/service-api5.10.0
    Jobsreportportal/service-jobs5.10.0
    Migrationsreportportal/migrations5.10.0
    Auto Analyzerreportportal/service-auto-analyzer5.10.0
    Metrics Gathererreportportal/service-metrics-gatherer5.10.0

    Migration guide

    - - +

    Version v.23.2

    1. What's Changed:

    • New feature - Monitoring:

    A new Event Monitoring interface has been introduced, providing administrators with a convenient means to review all activities at the Project level through the Search & Filter functionality within the Admin panel. Events at the instance level are not visible on the UI, but they are securely stored in the database. This data can be easily transmitted to SIEM systems for future monitoring and analysis.

    More details can be found via the link.

    • Project Activity Panel Adjustments:

    The list of project activities displayed in the Project Activity Panel has been expanded.

    More details can be found via the link.

    info

    Please take into account that starting from this point forward, all events will have a new format for their storing in the database. Consequently, all events which have been stored prior to version 23.2 will be deleted.

    • New feature – Delete Account:

    Now instance administrators can empower users to delete their accounts and obfuscate associated personal data.

    More details can be found via the link.

    • New feature – Personal Data Retention policy:

    ReportPortal now offers the option to set a retention period for collected personal data during instance configuration.

    More details can be found via the link.

    note

    Please note that Features 3 and 4 are configurable, giving you the flexibility to decide whether you want to use these features or not. If you choose to utilize them, you can configure them using environmental variables. Further details can be found in the respective documentation.

    • New feature – API Key:

    You can now generate as many API Keys as you need. You also have the ability to keep track of the creation date of API Keys and revoke any that are unused. Old tokens will still continue to function. Additionally, easy identification of the purpose of API Keys is facilitated through the use of prefixes.

    More details can be found via the link.

    • Gitlab CI integration Workaround:

    More details can be found via the link.

    2. Small updates:

    • “Load current step” functionality adjustments:

    Minor refinements have been applied to the "Load current step" functionality. Now, you can access the "Load current step" feature by hovering over a step.

    • Download file name changes:

    Attachment details and download format have been revised: files are now downloaded with the real file names.

    • Configuration examples updates:

    Configuration examples on the user profile page have been updated.

    3. Technical Improvements:

    • Storage layer now supports S3 storage, allowing data consolidation into a single bucket for the entire instance.

    • We’ve added postfix for bucket names in binary storage.

    • We’ve updated dependencies with security fixes: service-auto-analyzer and service-metrics-gatherer.

    • The issue of slow Log View loading when STEP has a complex structure of the nested steps nesting and count of them has been resolved and now up to 7x faster.

    • Service-jobs stability is improved during the reporting logs with the large stack traces.

    • We’ve optimized the attachments cleaning mechanism that allows us to increase the default value of the chunk_size by 20 times: from 1000 to 20000 in the docker compose and Kubernetes deployments.

    • Content Security Policy has been extended by adding the .browserstack.com. Now you can embed videos as a markdown from BrowserStack in order to ease failed tests troubleshooting.

    • Job for Flushing Demo data works as expected thanks to sql error fix.

    • We’ve updated react to version 17 and its dependencies to reduce the number of vulnerabilities and have a smooth transition to version 18.

    • Issues arising when service-api is starting (connected to bucket structure update or the binary storage type update) while there are integrations to external services like Jira have been resolved. Old logic for migrating integration salt has been removed.

    • Launches import via API is possible with additional parameters: name, description, attributes.

    • Rename notIssue parameter for import launch : For the end-point POST/v1 /{projectName} /launch /import parameter notIssue is renamed to skippedIsNotIssue. Logic remains the same.

    4. Enhancements Based on Community Feedback:

    • #1815, #1795, #957, #1644, #1590. All ReportPortal images now support multiple platforms: linux/amd64

    • #1970. Deserialization issue has been fixed.

    5. Released versions

    Service NameRepositoryTag
    Indexreportportal/service-index5.10.0
    Authorizationreportportal/service-authorization5.10.0
    UIreportportal/service-ui5.10.0
    APIreportportal/service-api5.10.0
    Jobsreportportal/service-jobs5.10.0
    Migrationsreportportal/migrations5.10.0
    Auto Analyzerreportportal/service-auto-analyzer5.10.0
    Metrics Gathererreportportal/service-metrics-gatherer5.10.0

    Migration guide

    + + \ No newline at end of file diff --git a/releases/Version3.3.2-1/index.html b/releases/Version3.3.2-1/index.html index 8ed9535cb..15dbaa088 100644 --- a/releases/Version3.3.2-1/index.html +++ b/releases/Version3.3.2-1/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version3.3.2/index.html b/releases/Version3.3.2/index.html index cdd484750..61b3e1892 100644 --- a/releases/Version3.3.2/index.html +++ b/releases/Version3.3.2/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version4.0.0/index.html b/releases/Version4.0.0/index.html index 1675c2170..3930fb384 100644 --- a/releases/Version4.0.0/index.html +++ b/releases/Version4.0.0/index.html @@ -12,17 +12,17 @@ - - + +
    -

    Version 4.0.0

    Issues and features in milestone 4.0

    Migration Details

    - - + + \ No newline at end of file diff --git a/releases/Version4.1.0/index.html b/releases/Version4.1.0/index.html index ab3a3db16..98e6e7151 100644 --- a/releases/Version4.1.0/index.html +++ b/releases/Version4.1.0/index.html @@ -12,15 +12,15 @@ - - + +
    -
    - - +
    + + \ No newline at end of file diff --git a/releases/Version4.2.0/index.html b/releases/Version4.2.0/index.html index ecebbeb02..ec41d3d85 100644 --- a/releases/Version4.2.0/index.html +++ b/releases/Version4.2.0/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Version 4.2.0

    Features

    - - + + \ No newline at end of file diff --git a/releases/Version4.3/index.html b/releases/Version4.3/index.html index 18e62b47e..2dec50ebf 100644 --- a/releases/Version4.3/index.html +++ b/releases/Version4.3/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Version 4.2.0

    Features

    • #442 Added a link to the test item which have been used by Analyzer for decision on History of Actions (Log view);

    • Previous Analyzer is back (choose pre-set Classic)

    Improvements

    • #452 Added possibility to share with a quick filter on All launches by link;
    • #427 Allowed to set autoAnalyzed flag via API;
    • #375 Added option with/without methods to Most failed/ flaky tests cases widgets;
    • Performance optimization for Latest Launches;

    Bugs

    • #440 Not getting any data on widget when selecting Start Time in filter
    • #436 Jira integration: Bug priority is always Minor

    All issues and features are in milestone 4.3

    - - +

    Version 4.2.0

    Features

    • #442 Added a link to the test item which have been used by Analyzer for decision on History of Actions (Log view);

    • Previous Analyzer is back (choose pre-set Classic)

    Improvements

    • #452 Added possibility to share with a quick filter on All launches by link;
    • #427 Allowed to set autoAnalyzed flag via API;
    • #375 Added option with/without methods to Most failed/ flaky tests cases widgets;
    • Performance optimization for Latest Launches;

    Bugs

    • #440 Not getting any data on widget when selecting Start Time in filter
    • #436 Jira integration: Bug priority is always Minor

    All issues and features are in milestone 4.3

    + + \ No newline at end of file diff --git a/releases/Version5.0.0/index.html b/releases/Version5.0.0/index.html index 990e64e98..9cd0c88e6 100644 --- a/releases/Version5.0.0/index.html +++ b/releases/Version5.0.0/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Version 5.0.0

    Finally we are glad to introduce a new release of ReportPortal. +

    Version 5.0.0

    Finally we are glad to introduce a new release of ReportPortal. In this version we have:

    • Migrated to PostgreSQL
    • Migrated to React JS
    • Removed Consul
    • Introduced RabbitMQ for asynchronous reporting\
    • Introduced a plugin system
    • Improved performance x3

    Installation details

    Plugins

    Jira, Rally, SauceLabs integration now will work through the plugin functionality. You need to download latest JAR package from our Bintray repository, and drag-n-drop it ReportPortal in Administrative section -> Plugins.

    Read more here.

    Available plugins to download:

    Brand new features

    • #275 #639 Nested steps
    • #348 Integration with SauceLabs
    • #673 #486 Pattern analysis
    • #675 Auto-updated wWidget based on launch attributes (Cumulative trend chart, Component Health Check)
    • 15 sub-defects per defect type
    • #41 Sub-defects for “To investigate”
    • Replace tags with attributes (attributes = key:value)
    • #680 Implement a plugin system for integration with external systems (JIRA, Rally, SauceLabs, E-mail server)
    • A possibility to change status of test item
    • A view with a test item s list from different launch (Clickable area for Overall statistics, Component Health Check widget)

    Reporting updates

    • Reduced restriction for synchronous reporting
    • Fully asynchronous reporting with api/v2
    • #275 #639 Reporting with Nested steps (see section Agents Updates)
    • #526 #444 Logs/attachments for launch level (see section Agents Updates)
    • #571 #451 Finish launch with populated status
    • #670 Interruption children “in progress” when a parent has been finished
    • #671 #548 Reporting test code reference (see section Agents Updates)
    • #490 Reporting test into finished Parent Item
    • A possibility to report tests with Test Case ID (ID number from your test management system)

    Small and nice updates

    • #453 Launch description and attributes on the suite view
    • #606 Markdown on the Log page (no need in !!!MARKDOWN MODE!!!)
    • Possibility to configure integrations (Jira/Rally/ E-mail-server/ SauceLabs) per project and for the whole instance
    • #618 Increase limitation for step name length from 256 to 1024
    • #457 Increase password length
    • Auto launch deleting
    • Increase the number of launches for widgets from 150 to 600

    Bug fixing

    • #522 Defect comment is not updated during deleting
    • #542 Issue with History line
    • #542 Unable to create a link to the result log page - page keeps reloading
    • #563 DOM XSS in rp.epam.com
    • #564 There is no possibility to enter login/password for email settings with RU local

    Administrative page updates

    • New design
    • Possibility to filter projects and users
    • Plugin system
    • #364 Possibility to delete personal projects

    Agents update

    • Reporting with Nested steps (already updated TestNG)
    • Logs/attachments for launch level (already updated TestNG)
    • Reporting test code reference (already updated Java-based agents)
    • Reporting test case ID (already updated Java-based agents)

    Test frameworks integration

    • The majority of test framework integrations (agents) of v4 supported by ReportPortal v5.0 backward compatibility. But do not use latest features, capabilities and performance upgrades (NestedSteps, Re-run, re-tries, etc.)
    • Please take latest agents started with 5.* in order to get full support of RPv5 features (work in progress, agents will be released soon)

    Dev guides

    - - + + \ No newline at end of file diff --git a/releases/Version5.0RC/index.html b/releases/Version5.0RC/index.html index bbbb7faeb..a1cce878f 100644 --- a/releases/Version5.0RC/index.html +++ b/releases/Version5.0RC/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Version 5.0RC

    This is the Beta release.

    Brand new features

    • #275 #639 Nested steps
    • #348 Integration with SauceLabs
    • #673 #486 Pattern analysis
    • #675 Widget based on launch attributes (Cumulative trend chart)
    • 15 sub-defects per defect type
    • #41 Sub-defects for “To investigate”
    • Replace tags with attributes (attributes = key:value)
    • #680 Implement a plugin system for integration with external systems (JIRA, Rally, SauceLabs, E-mail server)

    Reporting updates

    • Reduced restriction for synchronous reporting (beta)
    • Fully asynchronous reporting (beta)
    • #275 #639 Reporting with Nested steps (see section Agents Updates)
    • #526 #444 Logs/attachments for launch level (see section Agents Updates)
    • #571 #451 Finish launch with populated status
    • #670 Interruption children “in progress” when a parent has been finished
    • #671 #548 Reporting test code reference (see section Agents Updates)
    • #490 Reporting test into finished Parent Item

    Small and nice updates

    • #453 Launch description and attributes on the suite view
    • #606 Markdown on the Log page
    • Possibility to configure integrations (Jira/Rally/ E-mail-server/ SauceLabs) per project and for the whole instance
    • #618 Increase limitation for step name length from 256 to 1024
    • #457 Increase password length
    • Auto launch deleting
    • Increase the number of launches for widgets

    Bug fixing

    • #522 Defect comment is not updated during deleting
    • #542 Issue with History line
    • #542 Unable to create a link to the result log page - page keeps reloading
    • #563 DOM XSS in rp.epam.com
    • #564 (BUG) There is no possibility to enter login/password for email settings with RU local

    Administrative page updates

    • New design
    • Possibility to filter projects and users
    • Plugin system
    • #364 Possibility to delete personal projects

    Agents update

    • Reporting with Nested steps (already updated TestNG)
    • Logs/attachments for launch level (already updated TestNG)
    • Reporting test code reference (already updated Java-based agents)

    Integration with Java Test Frameworks

    Dev guides

    - - +

    Version 5.0RC

    This is the Beta release.

    Brand new features

    • #275 #639 Nested steps
    • #348 Integration with SauceLabs
    • #673 #486 Pattern analysis
    • #675 Widget based on launch attributes (Cumulative trend chart)
    • 15 sub-defects per defect type
    • #41 Sub-defects for “To investigate”
    • Replace tags with attributes (attributes = key:value)
    • #680 Implement a plugin system for integration with external systems (JIRA, Rally, SauceLabs, E-mail server)

    Reporting updates

    • Reduced restriction for synchronous reporting (beta)
    • Fully asynchronous reporting (beta)
    • #275 #639 Reporting with Nested steps (see section Agents Updates)
    • #526 #444 Logs/attachments for launch level (see section Agents Updates)
    • #571 #451 Finish launch with populated status
    • #670 Interruption children “in progress” when a parent has been finished
    • #671 #548 Reporting test code reference (see section Agents Updates)
    • #490 Reporting test into finished Parent Item

    Small and nice updates

    • #453 Launch description and attributes on the suite view
    • #606 Markdown on the Log page
    • Possibility to configure integrations (Jira/Rally/ E-mail-server/ SauceLabs) per project and for the whole instance
    • #618 Increase limitation for step name length from 256 to 1024
    • #457 Increase password length
    • Auto launch deleting
    • Increase the number of launches for widgets

    Bug fixing

    • #522 Defect comment is not updated during deleting
    • #542 Issue with History line
    • #542 Unable to create a link to the result log page - page keeps reloading
    • #563 DOM XSS in rp.epam.com
    • #564 (BUG) There is no possibility to enter login/password for email settings with RU local

    Administrative page updates

    • New design
    • Possibility to filter projects and users
    • Plugin system
    • #364 Possibility to delete personal projects

    Agents update

    • Reporting with Nested steps (already updated TestNG)
    • Logs/attachments for launch level (already updated TestNG)
    • Reporting test code reference (already updated Java-based agents)

    Integration with Java Test Frameworks

    Dev guides

    + + \ No newline at end of file diff --git a/releases/Version5.1.0/index.html b/releases/Version5.1.0/index.html index 9bd6bf341..5fadb1fc7 100644 --- a/releases/Version5.1.0/index.html +++ b/releases/Version5.1.0/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Version 5.1.0

    Important: We are constantly improving ReportPortal. And in version 5.1 we have changed a way we encrypt your personal data. Please be aware, that for successful interaction with version 5.1 you need to change a password at the first login. +

    Version 5.1.0

    Important: We are constantly improving ReportPortal. And in version 5.1 we have changed a way we encrypt your personal data. Please be aware, that for successful interaction with version 5.1 you need to change a password at the first login. Please read instructions below.

    Thank you for being with us, ReportPortal team

    Brand new features

    • #893 Improved ML in Аuto-Autoanalysis 2.0
    • #894 History line improvements
    • #896 History table for the whole Launch/Filter
    • #899 Possibility to compare results from: Launch/Launch; Launch/Filter; Filter/Filter
    • Java 11 introduced

    Reporting updates

    • #895 Explicit declaration of Test Case ID: Possibility to report execution with Test Case ID from your Test Case Management system

    Small and nice updates

    • #586 Clickable area for widgets:
      • Overall statistics bar view
      • Failed case trend chart
      • Non-passed test cases trend chart
      • Passing rate per filter
      • Cumulative trend chart
      • Most popular pattern table (TOP-20)
    • Added a launch UUID in the modal "Edit Launch"
    • Added a possibility to resize the Cumulative trend chart widget.
    • Refactored auto-complete component
    • Introduced Java 11 for API
    • #744 Migrated to Traefik 2

    Bug fixing

    • Added a considering of nested steps logs in an auto-analysis procedure
    • #741 Added a possibility to collapse/expand additional launch info on Launches Table widget.
    • #870 Fixed a possibility to send link to BTS on an item finish
    • #447 Fixed launch inactivity scripts
    • Fixed launch/attachments/screenshots deleting scripts
    • #746 Backward compatibilities for !!!MARKDOWN!!! in logs
    • #768 Added markdown support for video links in logs
    • #740 Fixed a possibility to view a full launch name in widgets tooltips
    • #749 Fixed a scroll in full-screen mode for widgets

    Known issues

    LDAP returns Code 500 when the integration configuration is not correct

    How to migrate to the latest version 5.1

    Details can be found here

    - - + + \ No newline at end of file diff --git a/releases/Version5.2.0/index.html b/releases/Version5.2.0/index.html index 7ef3ade2a..51f3501a9 100644 --- a/releases/Version5.2.0/index.html +++ b/releases/Version5.2.0/index.html @@ -12,15 +12,15 @@ - - + +
    -
    - - +
    + + \ No newline at end of file diff --git a/releases/Version5.2.1/index.html b/releases/Version5.2.1/index.html index 50a90442b..e2783eabd 100644 --- a/releases/Version5.2.1/index.html +++ b/releases/Version5.2.1/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.2.2/index.html b/releases/Version5.2.2/index.html index bbf098bf8..636041a6e 100644 --- a/releases/Version5.2.2/index.html +++ b/releases/Version5.2.2/index.html @@ -12,17 +12,17 @@ - - + +
    -

    Version 5.2.2

    Improvements

    Added a possibility to choose a base for a History table via a docker-compose

    Bugs

    #997 History doesn't compatible after data migration from v4 to v5 +

    - - + + \ No newline at end of file diff --git a/releases/Version5.2.3/index.html b/releases/Version5.2.3/index.html index 414ac3b9a..0975e8cf6 100644 --- a/releases/Version5.2.3/index.html +++ b/releases/Version5.2.3/index.html @@ -12,17 +12,17 @@ - - + +
    -
    - - + + \ No newline at end of file diff --git a/releases/Version5.3.0/index.html b/releases/Version5.3.0/index.html index e23c9d2dd..ed2a8779d 100644 --- a/releases/Version5.3.0/index.html +++ b/releases/Version5.3.0/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Version 5.3.0

    Brand new features

    #269 Component Health Check Widget (table view) +

    Version 5.3.0

    Brand new features

    #269 Component Health Check Widget (table view) #877 SAML auth

    Small and nice updates

    • Filter by retried items on step level view
    • Purging jobs delete logs/attachments/launches by star time, not lastModified time
    • #1005 Auto-Analysis: Add a boost for items with the latest Defect Type
    • Parent line recalculation on the step view
    • Refine on the Step view: Has retries / Hasn`t retries
    • Filter description is increased to 1500

    Bug fixing

    • Github login does not work for users with private membership in the organization
    • #773 Service-API errors when the user does not have a photo
    • Wrong order during retry reporting
    • Reduced number of requests to BTS
    • Performance fixes
    - - + + \ No newline at end of file diff --git a/releases/Version5.3.1./index.html b/releases/Version5.3.1./index.html index 5fee8d911..86b6e6ca2 100644 --- a/releases/Version5.3.1./index.html +++ b/releases/Version5.3.1./index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.3.2/index.html b/releases/Version5.3.2/index.html index 2ee9a14b4..8cd60b094 100644 --- a/releases/Version5.3.2/index.html +++ b/releases/Version5.3.2/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.3.3/index.html b/releases/Version5.3.3/index.html index 52f230df1..a63da5808 100644 --- a/releases/Version5.3.3/index.html +++ b/releases/Version5.3.3/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Version 5.3.3

    New features

    • Increased number of launches for Cumulative trend chart from 600 to 10 000 launches

    Small and nice updates

    • Added expanded failed items by default. Improved an alignment of arrows and step names on Log view
    • Launches. Log view. Attachment section. Gallery improvement for reducing the number of clicks
    • Added a possibility to add attributes to refine rather than replace them
    • [UI] Show first 5 lines for defect comment instead of 2 first lines on Step view and on Log view
    • Increased a description for widgets/dashboards/filters to 1500 symbols

    Analyzer improvements

    • Analyzer. Add more options for log lines in settings
    • Added a boosting feature for the similarity between log lines with more important namespaces

    Bugfixing

    • Fixed: #867 Very poor scroll performance
    • Fixed: #1128 Wrong password in the email letter when adding a new user
    • Fixed: #1182 Year in footer copyright text is not up to date
    • Fixed #857 Total Failed count is not matched with Test cases after Merging the multiple Launches [ deep merge]
    • Fixed: #911 Widget table column width (Unique bugs table)
    • Fixed: #871 Launch duration chart label "seconds"
    • Fixed: #1050 Add UUID data to TestItem Controller when querying using filters
    • Fixed: #1184 No history of test-items with defect
    • Fixed: History. Compare functionality. The custom column has items from 1st execution instead of the latest one
    • Fixed: 'Add new widget' from Launches page in case no dashboards on the project
    • Fixed: Only one attribute is returned for the launches in 'Launches table' widget
    • Fixed: Only the first 12 attachments are displayed in 'Attachments' section
    • [Performance] Issue with DB CPU utilization of "Flaky" widget query
    • Fixed unclassified errors from inserts of issues for failed items
    - - +

    Version 5.3.3

    New features

    • Increased number of launches for Cumulative trend chart from 600 to 10 000 launches

    Small and nice updates

    • Added expanded failed items by default. Improved an alignment of arrows and step names on Log view
    • Launches. Log view. Attachment section. Gallery improvement for reducing the number of clicks
    • Added a possibility to add attributes to refine rather than replace them
    • [UI] Show first 5 lines for defect comment instead of 2 first lines on Step view and on Log view
    • Increased a description for widgets/dashboards/filters to 1500 symbols

    Analyzer improvements

    • Analyzer. Add more options for log lines in settings
    • Added a boosting feature for the similarity between log lines with more important namespaces

    Bugfixing

    • Fixed: #867 Very poor scroll performance
    • Fixed: #1128 Wrong password in the email letter when adding a new user
    • Fixed: #1182 Year in footer copyright text is not up to date
    • Fixed #857 Total Failed count is not matched with Test cases after Merging the multiple Launches [ deep merge]
    • Fixed: #911 Widget table column width (Unique bugs table)
    • Fixed: #871 Launch duration chart label "seconds"
    • Fixed: #1050 Add UUID data to TestItem Controller when querying using filters
    • Fixed: #1184 No history of test-items with defect
    • Fixed: History. Compare functionality. The custom column has items from 1st execution instead of the latest one
    • Fixed: 'Add new widget' from Launches page in case no dashboards on the project
    • Fixed: Only one attribute is returned for the launches in 'Launches table' widget
    • Fixed: Only the first 12 attachments are displayed in 'Attachments' section
    • [Performance] Issue with DB CPU utilization of "Flaky" widget query
    • Fixed unclassified errors from inserts of issues for failed items
    + + \ No newline at end of file diff --git a/releases/Version5.3.5/index.html b/releases/Version5.3.5/index.html index 92d51130b..13ef5f09f 100644 --- a/releases/Version5.3.5/index.html +++ b/releases/Version5.3.5/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.4.0/index.html b/releases/Version5.4.0/index.html index 1bbc4ab82..9a4e0f432 100644 --- a/releases/Version5.4.0/index.html +++ b/releases/Version5.4.0/index.html @@ -12,15 +12,15 @@ - - + +
    -
    - - +
    + + \ No newline at end of file diff --git a/releases/Version5.5.0/index.html b/releases/Version5.5.0/index.html index a3501f00b..8f0c178c6 100644 --- a/releases/Version5.5.0/index.html +++ b/releases/Version5.5.0/index.html @@ -12,15 +12,15 @@ - - + +
    -
    - - +
    + + \ No newline at end of file diff --git a/releases/Version5.6.0/index.html b/releases/Version5.6.0/index.html index 29dd3e230..a22a9a4f0 100644 --- a/releases/Version5.6.0/index.html +++ b/releases/Version5.6.0/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Version 5.6.0

    Migration guide

    New features

    • #1094 Filter by Attributes

    Small and nice update

    • Change status from the Log View
    • Add Test Case ID to the log view

    Analyzer updates

    • Cleaning Job for Elastic Search
    • "All big log messages should match
    • Add the to investigate group except To Investigate itself to be used in Auto-analysis and suggestions
    • Add a field with test item name while indexing logs/auto-analysis/suggestions
    • Add configuration to check strictly all log message while analysis
    • When demo data is generated, the user should click "generating index" for analyzer himself
    • Adding launch name/message info into custom retrained models
    • Add checking by Exceptions and releasing the min should match for search/cluster operations to 95%
    • Add checking by Exceptions and releasing the min should match for search/cluster operations to 95%
    • Adding launch name/message info into custom retrained models
    • Changed the logic for No defect and custom TI defect types for auto-analysis
    • Create a similar for searching by similar TI items as for AA logic for treating short/long messages
    • The users complained that some older test items still can be used by Auto-analysis, so I decided to add discounting for the ES scores in case they are farther from the start_time of the test item.

    Bugfixing

    • Performance fixes
    • Fixed issue with deadlocks by retries refactoring
    • #1474 SAML. Add "callbackUrl" field to SAML configuration
    • Failed cases trend chart. Send only "statistics$executions$failed" field in "contentFields"
    • #1502 Email configurations. Change field "Username" to "Sender email"

    What's Changed

    - - +

    Version 5.6.0

    Migration guide

    New features

    • #1094 Filter by Attributes

    Small and nice update

    • Change status from the Log View
    • Add Test Case ID to the log view

    Analyzer updates

    • Cleaning Job for Elastic Search
    • "All big log messages should match
    • Add the to investigate group except To Investigate itself to be used in Auto-analysis and suggestions
    • Add a field with test item name while indexing logs/auto-analysis/suggestions
    • Add configuration to check strictly all log message while analysis
    • When demo data is generated, the user should click "generating index" for analyzer himself
    • Adding launch name/message info into custom retrained models
    • Add checking by Exceptions and releasing the min should match for search/cluster operations to 95%
    • Add checking by Exceptions and releasing the min should match for search/cluster operations to 95%
    • Adding launch name/message info into custom retrained models
    • Changed the logic for No defect and custom TI defect types for auto-analysis
    • Create a similar for searching by similar TI items as for AA logic for treating short/long messages
    • The users complained that some older test items still can be used by Auto-analysis, so I decided to add discounting for the ES scores in case they are farther from the start_time of the test item.

    Bugfixing

    • Performance fixes
    • Fixed issue with deadlocks by retries refactoring
    • #1474 SAML. Add "callbackUrl" field to SAML configuration
    • Failed cases trend chart. Send only "statistics$executions$failed" field in "contentFields"
    • #1502 Email configurations. Change field "Username" to "Sender email"

    What's Changed

    + + \ No newline at end of file diff --git a/releases/Version5.6.1/index.html b/releases/Version5.6.1/index.html index 3e1bdc522..90821b16f 100644 --- a/releases/Version5.6.1/index.html +++ b/releases/Version5.6.1/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.6.2/index.html b/releases/Version5.6.2/index.html index c1661c304..1cac9a980 100644 --- a/releases/Version5.6.2/index.html +++ b/releases/Version5.6.2/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.6.3/index.html b/releases/Version5.6.3/index.html index ffbfd9ed7..60eef115c 100644 --- a/releases/Version5.6.3/index.html +++ b/releases/Version5.6.3/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.7.0/index.html b/releases/Version5.7.0/index.html index d8e1c53bf..d28fb1c82 100644 --- a/releases/Version5.7.0/index.html +++ b/releases/Version5.7.0/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Version 5.7.0

    New Features:

    A possibility to see all unique errors for a launch
    +

    Version 5.7.0

    New Features:

    A possibility to see all unique errors for a launch
    #1268. Support of Azure SAML authorization

    New Plugins:

    Small and Nice Updates:

    • New design for Make decision modal
    • Help & Support functionality for newly deployed instances
    • Additional configuration for Similar “To Investigate” functionality (“Min Should Match”)
    • Default State for Auto-Analysis is ON

    Bugfixing:

    • New logic for removing widget has been implemented (deleting a parent widget doesn’t delete the child widget)
    • #1603. Attributes. Error on cancel edit common attributes in "Edit items" modal
    • #1181. Most Failed Tests and Most Flaky Tests widgets: wrong time is shown
    • #1606. Component Health Check Widget not working after Upgrade
    • #1616. Component health check (table view) widget for HotProd filter does not load results and keeps spinning

    Performance Improvements:

    • 3x improved performance of project index generation for Auto-Analysis
    • Refactored and optimized retry items processing
    • Increased Auto-Analysis performance by updating the communicating interface between API and ANALYZERS
    - - + + \ No newline at end of file diff --git a/releases/Version5.7.1/index.html b/releases/Version5.7.1/index.html index 845d75697..9615e68dc 100644 --- a/releases/Version5.7.1/index.html +++ b/releases/Version5.7.1/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/releases/Version5.7.2/index.html b/releases/Version5.7.2/index.html index e8f934276..2e4c123c7 100644 --- a/releases/Version5.7.2/index.html +++ b/releases/Version5.7.2/index.html @@ -12,21 +12,21 @@ - - + +
    -

    Version 5.7.2

    What's Changed:

    ReportPortal Release 5.7.2 aimed on enabling log messages to be saved into ElasticSearch

    • We now save logs into 2 sources: DB and Elastic (via DataStreams)

    New features

    • A possibility to see all unique errors for a launch (click the launch name and see tab Unique Errors on the top
    • #1268. Support of Azure SAML authorization

    New plugins

    • Jira Cloud plugin for posting new bugs into Jira Cloud
    • Azure DevOps plugin for posting new bugs into ADO Bug tracking

    Small but nice updates

    • New design for Make decision modal (previously Edit defect modal)
    • Help & Support functionality for newly deployed instances
    • Additional configuration for Similar “To Investigate” functionality (“Min Should Match”)
    • Default State for Auto-Analysis is ON

    Technical updates

    • Performance improvements (powerful as a hell)
    • Functionality to configure virtual hosts in RabbitMQ for Analyzer

    Logs into Elastic

    With the version 5.7.2 we bring a fundamental change for ReportPortal to store and manage test logs inside Elastic (via Data Streams). +

    Version 5.7.2

    What's Changed:

    ReportPortal Release 5.7.2 aimed on enabling log messages to be saved into ElasticSearch

    • We now save logs into 2 sources: DB and Elastic (via DataStreams)

    New features

    • A possibility to see all unique errors for a launch (click the launch name and see tab Unique Errors on the top
    • #1268. Support of Azure SAML authorization

    New plugins

    • Jira Cloud plugin for posting new bugs into Jira Cloud
    • Azure DevOps plugin for posting new bugs into ADO Bug tracking

    Small but nice updates

    • New design for Make decision modal (previously Edit defect modal)
    • Help & Support functionality for newly deployed instances
    • Additional configuration for Similar “To Investigate” functionality (“Min Should Match”)
    • Default State for Auto-Analysis is ON

    Technical updates

    • Performance improvements (powerful as a hell)
    • Functionality to configure virtual hosts in RabbitMQ for Analyzer

    Logs into Elastic

    With the version 5.7.2 we bring a fundamental change for ReportPortal to store and manage test logs inside Elastic (via Data Streams). The transition of full logging to elastic will consist of 2 steps:

    • version 5.7.2 introduces double logging: both in PG Database and Elastic in parallel
    • version 5.8 switch off database logging for logs and will store logs only inside Elastic

    The release timeline between 5.7.2 and 5.8 will be about 3 months. this period will be enough for the vast of project to generate enough logs history inside elastic, and by switching to version 5.8 after 5.7.2 will eliminate the need for the data migration efforts. Which means, that if you update to version 5.7.2, use it for 3-4 months before version 5.8, and then update to version 5.8 once it available, there will no any effort required to do the migration. Since all logs will already be stored in Elastic. Along with version 5.8 we will distribute migration script and instructions for data migration. So that you can easily migration from early 5.x version. The reason of the switch and performance results will be a subject of separate article. In a few words: it reduces the DB footprint in almost x10 times, improves speed of logging, and minimizes computation power to clean-up data. And also brings Full text search capabilities.

    New Contributors

    • @raikbitters made their first contribution in #1749
    • @tsteenbe made their first contribution in #1757

    Full Changelog: 5.7.1...5.7.2

    Bugfixing:

    Bug connected to filtering by attributes with "any" and "without any" conditions was fixed

    - - + + \ No newline at end of file diff --git a/releases/Version5.7.3/index.html b/releases/Version5.7.3/index.html index 4567e552b..e99d0ed15 100644 --- a/releases/Version5.7.3/index.html +++ b/releases/Version5.7.3/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Version 5.7.3

    Features:

    - - + + \ No newline at end of file diff --git a/releases/Version5.7.4/index.html b/releases/Version5.7.4/index.html index e4d35cd3f..fd2d4f0d2 100644 --- a/releases/Version5.7.4/index.html +++ b/releases/Version5.7.4/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Version 5.7.4

    What's Changed:

    1. ReportPortal previously used MinIO Client for file storage, which offered such benefits as:
    • Easy Docker-based installation
    • Kubernetes Support
    • S3-compatible bridge which allows to delegate file storage to S3, but keep using MinIO API

    But since there have been some changes in MinIO, we have explored alternative clients for working with cloud storage.

    Changes in MinIO:

    • a licensing shift to AGPL which does not allow to have MinIO dependencies in the code anymore
    • deprecation of S3 Proxy Gateway highly utilized in client installations

    Thus, we have replaced MinIO Client with JCloud in the latest ReportPortal version. +

    Version 5.7.4

    What's Changed:

    1. ReportPortal previously used MinIO Client for file storage, which offered such benefits as:
    • Easy Docker-based installation
    • Kubernetes Support
    • S3-compatible bridge which allows to delegate file storage to S3, but keep using MinIO API

    But since there have been some changes in MinIO, we have explored alternative clients for working with cloud storage.

    Changes in MinIO:

    • a licensing shift to AGPL which does not allow to have MinIO dependencies in the code anymore
    • deprecation of S3 Proxy Gateway highly utilized in client installations

    Thus, we have replaced MinIO Client with JCloud in the latest ReportPortal version. Starting from ReportPortal 5.7.4 you can either use AWS S3 directly or continue with your existing MinIO as object storage.

    1. IMPORTANT:

    Please, don’t forget to update ElasticSearch config. We've enabled logs double entry by default. Thus, it is important to review your ElasticSearch setup. Please, read carefully through this migration guide in order to avoid performance pitfalls.

    - - + + \ No newline at end of file diff --git a/releases/Versionv23.1/index.html b/releases/Versionv23.1/index.html index 0b024f02d..da2572bee 100644 --- a/releases/Versionv23.1/index.html +++ b/releases/Versionv23.1/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Version v.23.1

    1. What's Changed:

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/ComponentsOverview/index.html b/reportportal-configuration/ComponentsOverview/index.html index 1161491b7..5f8d23a61 100644 --- a/reportportal-configuration/ComponentsOverview/index.html +++ b/reportportal-configuration/ComponentsOverview/index.html @@ -12,21 +12,21 @@ - - + +
    -

    Components Overview

    Gateway

    Gateway is a main entry point to application services. It is in-charge of routing requests to appropriate service and load balancing. +

    Components Overview

    Gateway

    Gateway is a main entry point to application services. It is in-charge of routing requests to appropriate service and load balancing. There are two options proposed:

    API Service

    The API service is the core of ReportPortal TestOps tool. It is in-charge of handling incoming requests from agents and UI.

    UAT Service

    The UAT (Unified Authorization Trap) service is module that authenticate users and creates/revokes user tokens. It supports various types of authentication mechanisms:

    • Basic Auth
    • GitHub Auth (OAuth2)
    • LDAP Auth The UAT service itself is a OAuth2 server that authenticates a user using mechanisms mentioned below and creates internal OAuth2 token which is used by UI and agents. There are two types of tokens:
    • UI (expiring token)
    • API - non-expiring token, intended to use on agent side

    Analyzer Service

    Keeps index of user logs per project and provides ability to perform search by that index. Used by auto-analysis functionality.
    Collects and processes the information, then sends it to Elasticsearch.

    Migrations Service

    Database migrations written in Go. Migrate reads migrations from sources and applies them in correct order to a database.

    Index Service

    The Index services handle requests that do not match any pattern of other services. It also aggregates some information/health data from other services to provide UI with that information.

    UI Service

    All statics for user interface.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/CreationOfProjectAndAddingUsers/index.html b/reportportal-configuration/CreationOfProjectAndAddingUsers/index.html index f1911ee44..902f0989c 100644 --- a/reportportal-configuration/CreationOfProjectAndAddingUsers/index.html +++ b/reportportal-configuration/CreationOfProjectAndAddingUsers/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Creation of project and adding users

    The main question of how you can organize your working space in ReportPortal. +

    Creation of project and adding users

    The main question of how you can organize your working space in ReportPortal. Let's see two use cases which can help you to make a decision.

    Use Case 1:

    Situation: We have a small team. Everybody can see everything. We need one dashboard which shows information about the whole project.

    Solution: Create one project. Assign all users on the created project. View all types of test cases (UI, API, Unit and so on) on this project. Divide executions by custom filters. Create a dashboard with a widget based on filters.

    Pros: You have a dashboard that can combine all results needed for your team. You need to configure only one project.

    Cons: All team members can see all results, you can not configure permissions rules.

    Use Case 2:

    Situation: We have a big team with a difficult permission structure and nested streams. Only persons with granted permissions can see results of a certain stream.

    Solution: Create separate projects for different streams. Assign users to appropriate projects. Create a dashboard with a widget based on filters for each project.

    Pros: Security, only users with granted permission will have access to the data.

    Cons: You can not see a single dashboard for several dashboards.

    If you choose a strategy, it is time to create your first project.

    Permission: Via "Administrate" section ADMINISTRATOR can create, configure, delete projects and add/invite/assign/unassign users on/to the projects.

    Create a project

    To create a project for a team:

    • Login to the ReportPortal as an ADMIN user
    • Open menu at the bottom.
    • Click the 'Administrate' link
    • Select 'Projects' from the left-hand sidebar
    • Click the 'Add New Project' button in the right top corner
    • Then enter a name of the project
    • Click the 'Add' button.

    A confirmation message in the status bar should appear.

    note

    The name of the project should contain between 3-256 symbols. It can include Latin and numeric characters, as well as underscores and dashes. @@ -44,7 +44,7 @@ Via "Administrate" section, only ADMINISTRATOR can unassign users. Via Project Space ADMINISTRATOR and PROJECT MANAGER can unassign users.

    note

    Please, do not forget to review project roles on regular basis. We recommend to do it at least quarterly.

    Depending on the project needs the assignment could be removed. To unassign the assignment for the user on the project, perform the following steps:

    1. Navigate to the "Administrate" section -> "All Users" page.
    2. Find a user and their project in the "Projects and roles" column.
    3. Click on the name of project.
    4. Click on "Cross" icon near the needed project.
    5. Confirm the action. - The user will be unassigned from the current project but will stay in the system.
    note

    Users can not be unassign from their own personal projects.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/HowToGetAnAccessTokenInReportPortal/index.html b/reportportal-configuration/HowToGetAnAccessTokenInReportPortal/index.html index b3915a60f..f90e3eb35 100644 --- a/reportportal-configuration/HowToGetAnAccessTokenInReportPortal/index.html +++ b/reportportal-configuration/HowToGetAnAccessTokenInReportPortal/index.html @@ -12,16 +12,16 @@ - - + +
    -

    How to get an access token in ReportPortal

    There are two ways to authorize in the ReportPortal API:

    1. Authorization with user’s login and password

    This is the main and recommended way to get access to ReportPortal API.

    Make the following HTTP request to get user's access token using login and password:

    POST <report_portal_url>/uat/sso/oauth/token

    BODY with parameters:
    grant_type: password
    username: <username>
    password: <password>

    Or you can use the following curl request:

    curl --header "Content-Type: application/x-www-form-urlencoded" \
    --request POST \
    --data "grant_type=password&username=<username>&password=<password>" \
    --user "ui:uiman" \
    <report_portal_url>/uat/sso/oauth/token

    Then you will receive a response with an access token:

    {
    "access_token": <access_token>,
    "token_type": "bearer",
    "expires_in": <token_lifetime_ms>,
    "refresh_token": <refresh_token>,
    ...
    }

    Now you can use “access_token” with any request to API by sending it as HTTP Authorization header:

    HTTP Header:
    Authorization: Bearer <access_token>

    2. Authorization with user's API Key (for agents)

    Another method involves using the API Key found on the user's Profile page.

    The API Key is a unique token that grants access to the ReportPortal REST API.

    To use it, log in and navigate to the Profile page, then find the API Keys tab. If you’ve previously integrated agents using UUID, it has been converted to a Legacy API Key at the moment of migration to newest version and it remains valid and operational.

    note

    It will continue to work even if you generate new API Keys.

    Thus, you can use several API keys at the same time. And revoke unused, expired or publicly exposed keys.

    To generate a new API key in the ReportPortal app, click on the "Generate API Key" button.

    You are free to assign any name to this API key, as long as it is unique and consists of 1 to 40 characters. Keep in mind that duplicate API key names are not allowed.

    The system will automatically prefix the generated API key with its assigned name for easy identification. If the API key name contains spaces or underscores, these will be replaced by hyphens in the API key prefix.

    It's crucial to understand that the API key will be visible only at the point of creation. We strongly recommend copying and securely storing it for future use, as it will be impossible to retrieve later. This practice aligns with stringent security measures and standards.

    You have the ability to create multiple API keys for various purposes, such as for automation or for integration with third-party services. However, it's important to note that all API keys generated from the user's Profile page are functionally equivalent from the permissions standpoint.

    Users can also revoke an API key at any time. Upon revocation, all related information will be removed from the database, and the revoked API key will no longer be usable.

    An API key functions similarly to a regular token. When making requests to the ReportPortal API, simply include it in the HTTP Authorization header as follows:

    HTTP Header:
    +

    How to get an access token in ReportPortal

    There are two ways to authorize in the ReportPortal API:

    1. Authorization with user’s login and password

    This is the main and recommended way to get access to ReportPortal API.

    Make the following HTTP request to get user's access token using login and password:

    POST <report_portal_url>/uat/sso/oauth/token

    BODY with parameters:
    grant_type: password
    username: <username>
    password: <password>

    Or you can use the following curl request:

    curl --header "Content-Type: application/x-www-form-urlencoded" \
    --request POST \
    --data "grant_type=password&username=<username>&password=<password>" \
    --user "ui:uiman" \
    <report_portal_url>/uat/sso/oauth/token

    Then you will receive a response with an access token:

    {
    "access_token": <access_token>,
    "token_type": "bearer",
    "expires_in": <token_lifetime_ms>,
    "refresh_token": <refresh_token>,
    ...
    }

    Now you can use “access_token” with any request to API by sending it as HTTP Authorization header:

    HTTP Header:
    Authorization: Bearer <access_token>

    2. Authorization with user's API Key (for agents)

    Another method involves using the API Key found on the user's Profile page.

    The API Key is a unique token that grants access to the ReportPortal REST API.

    To use it, log in and navigate to the Profile page, then find the API Keys tab. If you’ve previously integrated agents using UUID, it has been converted to a Legacy API Key at the moment of migration to newest version and it remains valid and operational.

    note

    It will continue to work even if you generate new API Keys.

    Thus, you can use several API keys at the same time. And revoke unused, expired or publicly exposed keys.

    To generate a new API key in the ReportPortal app, click on the "Generate API Key" button.

    You are free to assign any name to this API key, as long as it is unique and consists of 1 to 40 characters. Keep in mind that duplicate API key names are not allowed.

    The system will automatically prefix the generated API key with its assigned name for easy identification. If the API key name contains spaces or underscores, these will be replaced by hyphens in the API key prefix.

    It's crucial to understand that the API key will be visible only at the point of creation. We strongly recommend copying and securely storing it for future use, as it will be impossible to retrieve later. This practice aligns with stringent security measures and standards.

    You have the ability to create multiple API keys for various purposes, such as for automation or for integration with third-party services. However, it's important to note that all API keys generated from the user's Profile page are functionally equivalent from the permissions standpoint.

    Users can also revoke an API key at any time. Upon revocation, all related information will be removed from the database, and the revoked API key will no longer be usable.

    An API key functions similarly to a regular token. When making requests to the ReportPortal API, simply include it in the HTTP Authorization header as follows:

    HTTP Header:
    Authorization: Bearer <access_token>

    note

    Please be aware that this type of token is specifically designed for use by ReportPortal client tools (agents). We do not recommend using it to provide direct access to API endpoints.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/IntegrationViaPlugin/index.html b/reportportal-configuration/IntegrationViaPlugin/index.html index d186c727f..4f018f539 100644 --- a/reportportal-configuration/IntegrationViaPlugin/index.html +++ b/reportportal-configuration/IntegrationViaPlugin/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Integration via plugin

    Users can reinforce ReportPortal with adding additional integrations with:

    If you want to integrate ReportPortal with these external systems, and you can not find a needed tab on the Project Settings, please check the section in documentation Plugins.

    Integration configurations can be added on the global level (for all projects on the instance) in the Administrate section or the project level (only for one project) on Project Settings.

    If you have another configuration than other projects have or you want to integrate only your project with an external system, you should perform the next actions:

    1. Log in to ReportPortal as PROJECT MANAGER or ADMINISTRATOR
    2. Go to Project settings > Integrations
    3. Click on one of the integration panels
    4. And click the button "Unlink and setup manually"

    By this action, you unlink the current project from the global settings and configure your integration.

    note

    If you unlink project setting and ADMIN changes global settings for the whole instance, your project will use your project settings.

    To return global settings, you need to click a button "Reset to global settings". +

    Integration via plugin

    Users can reinforce ReportPortal with adding additional integrations with:

    If you want to integrate ReportPortal with these external systems, and you can not find a needed tab on the Project Settings, please check the section in documentation Plugins.

    Integration configurations can be added on the global level (for all projects on the instance) in the Administrate section or the project level (only for one project) on Project Settings.

    If you have another configuration than other projects have or you want to integrate only your project with an external system, you should perform the next actions:

    1. Log in to ReportPortal as PROJECT MANAGER or ADMINISTRATOR
    2. Go to Project settings > Integrations
    3. Click on one of the integration panels
    4. And click the button "Unlink and setup manually"

    By this action, you unlink the current project from the global settings and configure your integration.

    note

    If you unlink project setting and ADMIN changes global settings for the whole instance, your project will use your project settings.

    To return global settings, you need to click a button "Reset to global settings". In this case, your settings will be deleted, and integration will use global settings.

    You can always reset to the global settings.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/ProjectConfiguration/index.html b/reportportal-configuration/ProjectConfiguration/index.html index 90be5b743..c75a159c9 100644 --- a/reportportal-configuration/ProjectConfiguration/index.html +++ b/reportportal-configuration/ProjectConfiguration/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Project configuration

    To see the list of available projects and open a project, click the drop-down list in the top of the left menu.

    ReportPortal supports customization of the default settings.

    Permission: +

    Project configuration

    To see the list of available projects and open a project, click the drop-down list in the top of the left menu.

    ReportPortal supports customization of the default settings.

    Permission: Users with the Administrator role can edit project settings on the project "Settings" page in Administrate section and on the Project space. Users with the PROJECT_MANAGER role can edit the settings on the project space only. MEMBER/ OPERATOR/ CUSTOMER can only view applied project settings.

    Project settings

    To go to the project settings page, click the "Project Settings" icon in the left menu.

    The project configuration page will be opened.

    The project settings are divided into following tabs: "General", "Integrations", "Notifications", "Defect Types", "Analyzer", "Pattern Analysis", "Demo Data" and "Quality Gates" (if you have our premium feature).

    General settings

    Our test automation results dashboard allows you to control the amount of the stored data (launches, test items, logs and attachments) by removing outdated elements using Quartz jobs. @@ -44,7 +44,7 @@ MANAGER project role.

    Project role

    Every user is given a specific Project role within a specific project.

    Depends on the role, the user is able or not able to perform some actions. For more details, please see the "Permissions map".

    There are 4 possible Project roles in ReportPortal:

    • PROJECT MANAGER
    • MEMBER
    • OPERATOR
    • CUSTOMER
    note

    The ADMINISTRATOR has all privileges on the project.

    Edit project role

    To edit the project role, perform the following steps:

    1. Login into the ReportPortal as a user with PROJECT_MANAGER project role.
    2. Navigate to the "Project Members" page on the left menu.
    3. Select a new value from the "Project Role" drop-down for the user. - The new project role will be automatically saved.

    Unassign user from the project

    Depending on the project needs the assignment could be removed. To unassign the assignment for the user on the project, perform the following steps:

    1. Login into the ReportPortal as a user with PROJECT_MANAGER project role.
    2. Navigate to the "Project Members" page on the left menu.
    3. Find the required member.
    4. Click the 'Unassign' button for the user.
    5. Confirm the action in the popup.
    6. The user will be unassigned from the current project but will stay in the system.
    note

    Invite user, Assign/Unassign internal user to/from the project, change user's role on a project action can be done for a user with a similar and lower role only.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/ReportPortalJobsConfiguration/index.html b/reportportal-configuration/ReportPortalJobsConfiguration/index.html index 6d198168f..b3fdee5ac 100644 --- a/reportportal-configuration/ReportPortalJobsConfiguration/index.html +++ b/reportportal-configuration/ReportPortalJobsConfiguration/index.html @@ -12,21 +12,21 @@ - - + +
    -

    ReportPortal jobs configuration

    Currently, ReportPortal has 5 configurable jobs for data removing:

    • Clean launches
    • Clean logs
    • Clean attachments info
    • Clean attachments binaries
    • Project binary storage size recalculation

    Job execution period can be configured using environment variables, where period value should be provided as spring cron expression:

    • */30 * * * * * - every 30 seconds
    • 0 */2 * * * * - every 2 minutes
    • 0 0 */24 * * * - every 24 hours (every day)

    Job environment variables example for docker

    Clean launches job

    Clean launches job removes launches, their test items and logs. +

    ReportPortal jobs configuration

    Currently, ReportPortal has 5 configurable jobs for data removing:

    • Clean launches
    • Clean logs
    • Clean attachments info
    • Clean attachments binaries
    • Project binary storage size recalculation

    Job execution period can be configured using environment variables, where period value should be provided as spring cron expression:

    • */30 * * * * * - every 30 seconds
    • 0 */2 * * * * - every 2 minutes
    • 0 0 */24 * * * - every 24 hours (every day)

    Job environment variables example for docker

    Clean launches job

    Clean launches job removes launches, their test items and logs. Environment variables for configuration with default values:

    • RP_ENVIRONMENT_VARIABLE_CLEAN_LAUNCH_CRON=0 */10 * * * * - specifies how often job will be started (every 10 minutes)

    Clean logs job

    Clean logs job removes logs. Environment variables for configuration with default values:

    • RP_ENVIRONMENT_VARIABLE_CLEAN_LOG_CRON=0 */5 * * * * - specifies how often job will be started (every 5 minutes)

    Clean attachments info job

    Clean attachments info job removes attachments data from main database storage and puts into temporary table to remove binaries from the file storage Environment variables for configuration with default values:

    • RP_ENVIRONMENT_VARIABLE_CLEAN_ATTACHMENT_CRON=0 */2 * * * * - specifies how often job will be started (every 2 minutes)

    Clean attachments binaries job

    Clean attachments binaries job uses data from the temporary table (filled by previous job) and removes binaries from the file storage Environment variables for configuration with default values:

    • RP_ENVIRONMENT_VARIABLE_CLEAN_STORAGE_CRON=*/30 * * * * * - specifies how often job will be started (every 30 seconds)
    • RP_ENVIRONMENT_VARIABLE_CLEAN_STORAGE_CHUNKSize=1000 - specifies the size of the batch to be selected from the temporary table to be removed

    Project binary storage size recalculation job

    Project binary storage size recalculation job updates allocated storage value of the project based on the existing attachments at the moment. Environment variables for configuration with default values:

    • RP_ENVIRONMENT_VARIABLE_STORAGE_PROJECT_CRON=0 */1 * * * * - specifies how often job will be started (every minute)
    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/ActiveDirectory/index.html b/reportportal-configuration/authorization/ActiveDirectory/index.html index fa76e77b5..eb62673d1 100644 --- a/reportportal-configuration/authorization/ActiveDirectory/index.html +++ b/reportportal-configuration/authorization/ActiveDirectory/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Active Directory

    Active Directory plugin is available in ReportPortal on the Plugins page.

    To set up access with Active Directory:

    1. Log in to the ReportPortal as an ADMIN user
    2. Then open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Plugins' from the left-hand sidebar
    5. Click on the'Activate Directory' tab.
    6. Click on Add new integration
    7. The next fields should be present:
    'Domain*': text
    'URL*': text
    'Base DN*': text
    'Email attribute*': text
    'Full name attribute' : text
    'Photo attribute' : text
    'UserSearchFilter' (the same as for LDAP): text

    Mandatory fields are marked with red. +

    Active Directory

    Active Directory plugin is available in ReportPortal on the Plugins page.

    To set up access with Active Directory:

    1. Log in to the ReportPortal as an ADMIN user
    2. Then open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Plugins' from the left-hand sidebar
    5. Click on the'Activate Directory' tab.
    6. Click on Add new integration
    7. The next fields should be present:
    'Domain*': text
    'URL*': text
    'Base DN*': text
    'Email attribute*': text
    'Full name attribute' : text
    'Photo attribute' : text
    'UserSearchFilter' (the same as for LDAP): text

    Mandatory fields are marked with red. Click the 'Submit' button. All users of Active Directory will have access to the ReportPortal instance.
    For entrance to ReportPortal, the user should use their domain credentials (Login and password).

    Please find the example with configurations for Microsoft Active Directory that worked successfully provided by our user:

    Table with properties and values for LDAP Microsoft Active Directory

    PropertyValue
    Urlauth-servers.domain.org.int:3358
    Base DNOU=MAIN,DC=DOMAIN,DC=ORG,DC=INT
    Manager DNcn=Service UserBind,ou=Service Accounts,ou=Colombia,ou=America,ou=ServiceAccounts,dc=DOMAIN,dc=ORG,dc=INT
    User search filter(&(objectClass=user)(sAMAccountName={0}))
    Password encoder typeNO
    Email attributemail
    Full name attributedisplayName
    Photo attributethumbnailPhoto
    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/GitHub/index.html b/reportportal-configuration/authorization/GitHub/index.html index adf862631..587357b9e 100644 --- a/reportportal-configuration/authorization/GitHub/index.html +++ b/reportportal-configuration/authorization/GitHub/index.html @@ -12,20 +12,20 @@ - - + +
    -

    GitHub

    Our open source test reporting tool allows logging in via GitHub OAuth Web Application Flow.

    Presequences

    To enable this feature you need to register new application in Github

    Fill the following fields:

    NameValueDescription
    Application nameReport PortalJust something which allow you recognize what's this.
    Homepage URLhttps://{HOST}:{PORT}/uat/sso/userReplace with {HOST} and {PORT} with appropriate values of your instance. Naturally you can omit :{PORT} if it's default port for HTTPS protocol.
    Authorization callback URLhttps://{HOST}:{PORT}/uat/sso/login/githubAs in the previous field replace with {HOST} and {PORT} with your appropriate values.

    Once new application is created, you will have Client ID. Click on "Generate a new client secret" to get Client Secret, but do not close the window until you configure the Authorization on RP, since it will never show you the Secret again.

    ReportPortal configuration

    To setup access with GitHub auth on ReportPortal:

    1. Log in to the ReportPortal as an ADMIN user
    2. Open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Server Settings' from the left-hand sidebar
    5. Go to the 'Authorization Configuration' tab
    6. Then change the switcher position of 'Activate GitHub Authorization' to ON
    7. The Next fields should appear:
    'Client ID': <value_of_clientId>
    'Client Secret': <value_of_clientSecret>
    'Add GitHub Organization' button-link: (optional)
    note

    In case the 'Organization Name' is not added, all GitHub users will have access to the ReportPortal instance.
    +

    GitHub

    Our open source test reporting tool allows logging in via GitHub OAuth Web Application Flow.

    Presequences

    To enable this feature you need to register new application in Github

    Fill the following fields:

    NameValueDescription
    Application nameReport PortalJust something which allow you recognize what's this.
    Homepage URLhttps://{HOST}:{PORT}/uat/sso/userReplace with {HOST} and {PORT} with appropriate values of your instance. Naturally you can omit :{PORT} if it's default port for HTTPS protocol.
    Authorization callback URLhttps://{HOST}:{PORT}/uat/sso/login/githubAs in the previous field replace with {HOST} and {PORT} with your appropriate values.

    Once new application is created, you will have Client ID. Click on "Generate a new client secret" to get Client Secret, but do not close the window until you configure the Authorization on RP, since it will never show you the Secret again.

    ReportPortal configuration

    To setup access with GitHub auth on ReportPortal:

    1. Log in to the ReportPortal as an ADMIN user
    2. Open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Server Settings' from the left-hand sidebar
    5. Go to the 'Authorization Configuration' tab
    6. Then change the switcher position of 'Activate GitHub Authorization' to ON
    7. The Next fields should appear:
    'Client ID': <value_of_clientId>
    'Client Secret': <value_of_clientSecret>
    'Add GitHub Organization' button-link: (optional)
    note

    In case the 'Organization Name' is not added, all GitHub users will have access to the ReportPortal instance.
    If the 'Organization Name' is specified, only users of this organization will have an access to ReportPortal instance.
    If the Name of GitHub organization is not validated, verify that the name is correct.

    Example of GitHub auth configuration: Fill in the form:

    'Client Id': 8767988c424a0e7a2640
    'Client Secret': ef22c9f804257afaf399a2dada7c8f22dee5fd1b
    'Organization Name': reportportal

    Click on 'Submit' button. A confirmation message in status bar should be shown. A 'Login with GitHub' button will appear on login form.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/LDAP/index.html b/reportportal-configuration/authorization/LDAP/index.html index 45dc0d805..1636ff0f5 100644 --- a/reportportal-configuration/authorization/LDAP/index.html +++ b/reportportal-configuration/authorization/LDAP/index.html @@ -12,17 +12,17 @@ - - + +
    -

    LDAP

    LDAP plugin is available in ReportPortal on the Plugins page.

    To set up access with LDAP:

    1. Log in to the ReportPortal as an ADMIN user
    2. Then open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Plugins' from the left-hand sidebar
    5. Click on the'LDAP' tab.
    6. Click on Add new integration
    7. The next fields should be present:
    'URL*': text
    'Base DN*': text
    'Manager DN': text
    'Manager password': text
    'User DN pattern': text
    'User search filter': text
    'Group search base': text
    'Group search filter': text
    'Password encoder type': text
    'Email attribute*': text
    'Full name attribute' : text
    'Photo attribute' : text

    Mandatory fields are marked with red. +

    LDAP

    LDAP plugin is available in ReportPortal on the Plugins page.

    To set up access with LDAP:

    1. Log in to the ReportPortal as an ADMIN user
    2. Then open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Plugins' from the left-hand sidebar
    5. Click on the'LDAP' tab.
    6. Click on Add new integration
    7. The next fields should be present:
    'URL*': text
    'Base DN*': text
    'Manager DN': text
    'Manager password': text
    'User DN pattern': text
    'User search filter': text
    'Group search base': text
    'Group search filter': text
    'Password encoder type': text
    'Email attribute*': text
    'Full name attribute' : text
    'Photo attribute' : text

    Mandatory fields are marked with red. Click the 'Submit' button. All users of LDAP will have access to the ReportPortal instance. For access to the ReportPortal, the user should use their domain credentials (Login and password).

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/SAMLProvider/AzureSAML/index.html b/reportportal-configuration/authorization/SAMLProvider/AzureSAML/index.html index 294f917fd..8b39f5cbd 100644 --- a/reportportal-configuration/authorization/SAMLProvider/AzureSAML/index.html +++ b/reportportal-configuration/authorization/SAMLProvider/AzureSAML/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Azure SAML

    SAML plugin is available in ReportPortal on the Plugins page.

    If you have a pre-created Internal user, you can't log in by SAML using their credentials (Email or Name).

    Login to ReportPortal via Azure SAML is available starting from version 5.7 (SAML Okta was implemented in versions before 5.7).

    Azure SAML is a useful authorization method for big companies with 100+ employees, especially if this organization is already presented in Azure service. The main benefit here is no need for manual account creation. Users can log in to the ReportPortal using Azure SAML in an uncomplicated way: select login with SAML, then choose Azure, and upon login users’ data is synchronized with ReportPortal automatically.

    If your organization is using Azure SAML and some employees left, there is no need to remove their accounts from ReportPortal and from other Azure applications – just clearing their accounts in Azure will be enough.

    To configure authorization via Azure SAML we need to synchronize Azure and ReportPortal.

    Firstly, configure SAML on Azure side.

    Configure SAML on Azure side

    1. Log in to Azure portal using your organization creds.
    2. Click App Services. +

      Azure SAML

      SAML plugin is available in ReportPortal on the Plugins page.

      If you have a pre-created Internal user, you can't log in by SAML using their credentials (Email or Name).

      Login to ReportPortal via Azure SAML is available starting from version 5.7 (SAML Okta was implemented in versions before 5.7).

      Azure SAML is a useful authorization method for big companies with 100+ employees, especially if this organization is already presented in Azure service. The main benefit here is no need for manual account creation. Users can log in to the ReportPortal using Azure SAML in an uncomplicated way: select login with SAML, then choose Azure, and upon login users’ data is synchronized with ReportPortal automatically.

      If your organization is using Azure SAML and some employees left, there is no need to remove their accounts from ReportPortal and from other Azure applications – just clearing their accounts in Azure will be enough.

      To configure authorization via Azure SAML we need to synchronize Azure and ReportPortal.

      Firstly, configure SAML on Azure side.

      Configure SAML on Azure side

      1. Log in to Azure portal using your organization creds.
      2. Click App Services.
      3. Click View in the Manage Azure Active Directory section.
      4. Click Manage Tenants.

      Create organization in Azure

      1. If you haven’t configured organization in Azure yet, click Create.
        note

        if you have configured organization in Azure, please, go to step 9.

      2. Select a tenant type (Azure Active Directory) and click Next: Configuration > button. @@ -40,7 +40,7 @@
      3. Click the Add integration button.

      Synchronize Azure SAML and ReportPortal

      1. Synchronize Azure SAML and ReportPortal as follows:

      Finally, you can log in to ReportPortal using Azure SAML.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/SAMLProvider/OktaSAML/index.html b/reportportal-configuration/authorization/SAMLProvider/OktaSAML/index.html index 44b03a3e5..8ca54ab43 100644 --- a/reportportal-configuration/authorization/SAMLProvider/OktaSAML/index.html +++ b/reportportal-configuration/authorization/SAMLProvider/OktaSAML/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Okta SAML

    SAML plugin is available in ReportPortal on the Plugins page.

    If you have a pre-created Internal user, you can't log in by SAML using their credentials (Email or Name).

    To set up access with SAML:

    1. Log in to the ReportPortal as an ADMIN user
    2. Then open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Plugins' from the left-hand sidebar
    5. Click on the'SAML' tab.
    6. Click on Add new integration
    7. The next fields should be present:
    'Identity provider name ID*': text
    'Provider name*': text
    'Metadata URL*': URL
    'RP callback URL': URL - RP host/uat
    'Email attribute*': text
    'Name attributes mode' :
    'Last name attribute' text
    'First name attribute' text
    or
    'Full name attribute' : text

    Mandatory fields are marked with red. +

    Okta SAML

    SAML plugin is available in ReportPortal on the Plugins page.

    If you have a pre-created Internal user, you can't log in by SAML using their credentials (Email or Name).

    To set up access with SAML:

    1. Log in to the ReportPortal as an ADMIN user
    2. Then open the list on the right of the user's image.
    3. Click the 'Administrative' link
    4. Click the 'Plugins' from the left-hand sidebar
    5. Click on the'SAML' tab.
    6. Click on Add new integration
    7. The next fields should be present:
    'Identity provider name ID*': text
    'Provider name*': text
    'Metadata URL*': URL
    'RP callback URL': URL - RP host/uat
    'Email attribute*': text
    'Name attributes mode' :
    'Last name attribute' text
    'First name attribute' text
    or
    'Full name attribute' : text

    Mandatory fields are marked with red. Click the 'Submit' button. All users of SAML will have access to the ReportPortal instance.
    Just click on the button 'Login with SAML' and choose a needed integration from the drop-down

    On Octa side you should to specify SSO url. The format for url is the next:

    https://your domain adress/uat/saml/sp/SSO/alias/report-portal-sp

    “RP callback URL” field is an optional field to provide a redirect base path right in SAML integration settings. Fill in the field in format “RP host/uat”. The format for url is the next:

    https://reportportal.com/uat

    Once you have submitted an integration with “RP callback URL”, the URL will be applied to all SAML integrations.

    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/SAMLProvider/index.html b/reportportal-configuration/authorization/SAMLProvider/index.html index 232155d26..8c3ca87b7 100644 --- a/reportportal-configuration/authorization/SAMLProvider/index.html +++ b/reportportal-configuration/authorization/SAMLProvider/index.html @@ -12,16 +12,16 @@ - - + +
    -

    SAML provider

    If you have a pre-created Internal user, you can't log in by SAML using their credentials (Email or Name).

    This plugin allows you to configure a connection with a SAML provider.

    Integration with SAML will allow you to login into ReportPortal using SSO instead of tedious manual user creation.

    The plugin provides a mechanism to exchange information between ReportPortal and SAML provider, such as the possibility to login to ReportPortal with SAML credentials.

    SAML provider requirements

    • SAML 2.0 version
    • HTTP-POST Binding
    • URL to download SAML IdP Metadata
    • HTTPS connection for SAML Metadata
    • Support SAML attributes:
      • email
      • first name
      • last name
      • full name (instead first and last name)
    tip

    There are detailed manuals for configuration of Azure SAML and Okta SAML.

    Add integration

    ReportPortal contains the SAML Plugin by default.

    1. Go to Administration -> Plugins -> SAML
    2. Select Add integration.

    Set up connection

    Identity provider configuration

    ReportPortal SSO initial URL

    You need to provide a URL for a SAML Provider to deliver SAML data for the identity federation.

    https://<host>/uat/saml/sp/SSO/alias/report-portal-sp

    Identifier

    Set up identifier (aka Audience Restriction, aka Entity ID) for application as report.portal.sp.id. +

    SAML provider

    If you have a pre-created Internal user, you can't log in by SAML using their credentials (Email or Name).

    This plugin allows you to configure a connection with a SAML provider.

    Integration with SAML will allow you to login into ReportPortal using SSO instead of tedious manual user creation.

    The plugin provides a mechanism to exchange information between ReportPortal and SAML provider, such as the possibility to login to ReportPortal with SAML credentials.

    SAML provider requirements

    • SAML 2.0 version
    • HTTP-POST Binding
    • URL to download SAML IdP Metadata
    • HTTPS connection for SAML Metadata
    • Support SAML attributes:
      • email
      • first name
      • last name
      • full name (instead first and last name)
    tip

    There are detailed manuals for configuration of Azure SAML and Okta SAML.

    Add integration

    ReportPortal contains the SAML Plugin by default.

    1. Go to Administration -> Plugins -> SAML
    2. Select Add integration.

    Set up connection

    Identity provider configuration

    ReportPortal SSO initial URL

    You need to provide a URL for a SAML Provider to deliver SAML data for the identity federation.

    https://<host>/uat/saml/sp/SSO/alias/report-portal-sp

    Identifier

    Set up identifier (aka Audience Restriction, aka Entity ID) for application as report.portal.sp.id. You can specify personal Entity id when you deploy the Authorization service by environment variable RP_AUTH_SAML_ENTITYID.

    Custom attribute as claims in token

    The IDp app user profile must provide attributes like this:

    - user.email
    - user.firstName
    - user.lastName

    Also, Make sure there is a mapping created according to the values that you use in the ReportPortal SAML plugin like this:

    - user.email -> Email
    - user.firstName -> FirstName
    - user.lastName -> LastName

    ReportPortal configuration

    Identity provider name ID (Optional)

    Identity provider name ID (aka name identifier formats) controls how the users at identity providers are mapped to users at service providers.

    We support next formats:

    UNSPECIFIED - used by default

    urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified

    EMAIL

    urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

    PERSISTENT

    urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

    Provider name - Provider name associated with IDP.

    Metadata URL - URL that provides data with information about SAML Provider.

    Email - Attribute name from SAML metadata which contains an user email.

    <saml:Attribute Name="Email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue xsi:type="xs:string">neuromancer@cyberspace.net</saml:AttributeValue>
    </saml:Attribute>

    ReportPortal Callback URL (Optional) - This field provides a redirect base path.

    Once you have submitted an integration with “RP callback URL”, the URL will be applied to all SAML integrations.

    https://<host>/uat

    First name - Attribute name from SAML metadata which contains an user first/given name.

    <saml:Attribute Name="FirstName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue xsi:type="xs:string">William</saml:AttributeValue>
    </saml:Attribute>

    Last name - Attribute name from SAML metadata which contains an user last/family name.

    <saml:Attribute Name="LastName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue xsi:type="xs:string">Gibson</saml:AttributeValue>
    </saml:Attribute>

    Full name - Attribute name from SAML metadata which contains a full user name. You can use either two separate attributes for first name and last name or a combined first and last name attribute. This solely depends on your SAML provider.

    <saml:Attribute Name="FullName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue xsi:type="xs:string">William Gibson</saml:AttributeValue>
    </saml:Attribute>
    - - + + \ No newline at end of file diff --git a/reportportal-configuration/authorization/index.html b/reportportal-configuration/authorization/index.html index 9cc3e67cd..b909ade93 100644 --- a/reportportal-configuration/authorization/index.html +++ b/reportportal-configuration/authorization/index.html @@ -12,15 +12,15 @@ - - + + - - +
    + + \ No newline at end of file diff --git a/reportportal-glossary/index.html b/reportportal-glossary/index.html index 1abc2baea..c64bcd751 100644 --- a/reportportal-glossary/index.html +++ b/reportportal-glossary/index.html @@ -12,15 +12,15 @@ - - + +
    -

    ReportPortal Glossary

    Agent

    Agents are direct test framework integrations. If you integrate your tests with an agent then you don’t need to do anything, except adding properties and test metadata. Basically, each agent has the same naming convention: agent-{ language }-{ framework }. E.G. “agent-python-pytest”. The best way to see which agents we do have and check out the latest documentation for them is to go on ReportPortal organization page on GitHub and start searching.

    Each agent project contains a README with the latest installation instructions. Agent pages usually are being updated along with the agent code. If you found any issue with the documentation you are free to correct it with a PR or post an issue.

    Agents are complete and self-sufficient integrations, all you need is to provide correct properties and optionally test metadata (like attributes and steps).

    Client

    Clients are basically interfaces for our Rest API, like agents they have its naming convention: client-{ language }. E.G. “client-java”. And, like Agents, the best way to find the latest library version and documentation is to find it on GitHub.

    Unlike agents, Clients are not self-sufficient. They provide convenient way to call ReportPortal API, but you must do this in your code. It is also your part of responsibility which metadata you send to ReportPortal if you decided to use a Client.

    Logger

    Loggers are special type of libraries which a responsible for saving logs into ReportPortal. They can be attached to logging framework or a test tool, E.G. Selenide, to report steps and log records. Basically, you can report logs yourself with certain methods inside Clients, but Loggers do this for you.

    Here is an example of how OkHttp3 logger works:

    Like agents and clients, loggers have their own naming pattern: logger-{ language }-{ framework / tool }.

    Plugin

    Plugins are co-applications which add additional functionality to ReportPortal. We have separate examples and development guide for our users. You are free to extend our test automation results dashboard as you wish, we don’t limit or obligate our users with any clauses. ReportPortal provides some plugins for free like Jira and Rally integrations but also has closed plugins, which we provide only with our paid plans, e.g., “Quality Gates” plugin:

    Launch

    The first reporting-related word in our list. The Launch is a collection of all reported tests which were run at single test execution. Launches allows you to monitor your application-under-test state. The idea is that you take certain number of tests and test suites and run them periodically on different environments and our widgets draws you the picture of your application health from launch to launch. You are not obligated to stop adding new test reports into a launch after the launch finish, you are free to add more data. Or, for example, you can create several Launches and merge them into one. Or run your tests in a distributed way and report everything into a single Launch. The key concept here is that Launch is the biggest data point on our widgets, everything else is up to you.

    Suite

    For the convenience of locating and navigating data, you can put your tests into test suites. Features, Stories, Suites, Test Classes, Test (sic!), etc., they are all Suites from ReportPortal view, just with different names. Suites are hierarchical, to put one Suite inside another you should specify Parent Suite UUID. Also, as a limitation, child Suite and Items start time should not be earlier than Parent Suite start time due to Database limitations, please keep that in mind.

    Step

    Step is the only entity with statistics in our centralized test automation tool. Every time you report a step, ReportPortal adds 1 to test count and every time a Step fails it counts it as a test failure.

    Nested step

    Nested steps are like suites but located as child step elements. They are like containers for test logs and represented as dropdown lists inside Log View. On the screen below Nested step is the first entity.

    Log

    Logs are textual data necessary for debugging and problem solving. Our Analyzer uses them in the same way. Logs should be neat and informative, but not too much verbose. Tons of logs usually the same problem as their full absence.

    Test Case ID

    The ID which is used along with Steps. It is unique signature of tests by which we build test history. In general, you don’t need to manipulate these IDs, since every agent usually generates them with Code reference and parameters. But if you want to customize your history view this is the first point where to look. Agents usually generate Test Case IDs based on code reference and have a way to customize it.

    - - +

    ReportPortal Glossary

    Agent

    Agents are direct test framework integrations. If you integrate your tests with an agent then you don’t need to do anything, except adding properties and test metadata. Basically, each agent has the same naming convention: agent-{ language }-{ framework }. E.G. “agent-python-pytest”. The best way to see which agents we do have and check out the latest documentation for them is to go on ReportPortal organization page on GitHub and start searching.

    Each agent project contains a README with the latest installation instructions. Agent pages usually are being updated along with the agent code. If you found any issue with the documentation you are free to correct it with a PR or post an issue.

    Agents are complete and self-sufficient integrations, all you need is to provide correct properties and optionally test metadata (like attributes and steps).

    Client

    Clients are basically interfaces for our Rest API, like agents they have its naming convention: client-{ language }. E.G. “client-java”. And, like Agents, the best way to find the latest library version and documentation is to find it on GitHub.

    Unlike agents, Clients are not self-sufficient. They provide convenient way to call ReportPortal API, but you must do this in your code. It is also your part of responsibility which metadata you send to ReportPortal if you decided to use a Client.

    Logger

    Loggers are special type of libraries which a responsible for saving logs into ReportPortal. They can be attached to logging framework or a test tool, E.G. Selenide, to report steps and log records. Basically, you can report logs yourself with certain methods inside Clients, but Loggers do this for you.

    Here is an example of how OkHttp3 logger works:

    Like agents and clients, loggers have their own naming pattern: logger-{ language }-{ framework / tool }.

    Plugin

    Plugins are co-applications which add additional functionality to ReportPortal. We have separate examples and development guide for our users. You are free to extend our test automation results dashboard as you wish, we don’t limit or obligate our users with any clauses. ReportPortal provides some plugins for free like Jira and Rally integrations but also has closed plugins, which we provide only with our paid plans, e.g., “Quality Gates” plugin:

    Launch

    The first reporting-related word in our list. The Launch is a collection of all reported tests which were run at single test execution. Launches allows you to monitor your application-under-test state. The idea is that you take certain number of tests and test suites and run them periodically on different environments and our widgets draws you the picture of your application health from launch to launch. You are not obligated to stop adding new test reports into a launch after the launch finish, you are free to add more data. Or, for example, you can create several Launches and merge them into one. Or run your tests in a distributed way and report everything into a single Launch. The key concept here is that Launch is the biggest data point on our widgets, everything else is up to you.

    Suite

    For the convenience of locating and navigating data, you can put your tests into test suites. Features, Stories, Suites, Test Classes, Test (sic!), etc., they are all Suites from ReportPortal view, just with different names. Suites are hierarchical, to put one Suite inside another you should specify Parent Suite UUID. Also, as a limitation, child Suite and Items start time should not be earlier than Parent Suite start time due to Database limitations, please keep that in mind.

    Step

    Step is the only entity with statistics in our centralized test automation tool. Every time you report a step, ReportPortal adds 1 to test count and every time a Step fails it counts it as a test failure.

    Nested step

    Nested steps are like suites but located as child step elements. They are like containers for test logs and represented as dropdown lists inside Log View. On the screen below Nested step is the first entity.

    Log

    Logs are textual data necessary for debugging and problem solving. Our Analyzer uses them in the same way. Logs should be neat and informative, but not too much verbose. Tons of logs usually the same problem as their full absence.

    Test Case ID

    The ID which is used along with Steps. It is unique signature of tests by which we build test history. In general, you don’t need to manipulate these IDs, since every agent usually generates them with Code reference and parameters. But if you want to customize your history view this is the first point where to look. Agents usually generate Test Case IDs based on code reference and have a way to customize it.

    + + \ No newline at end of file diff --git a/reportportal-tutorial/index.html b/reportportal-tutorial/index.html index 505c4528e..db8aa3ba4 100644 --- a/reportportal-tutorial/index.html +++ b/reportportal-tutorial/index.html @@ -12,16 +12,16 @@ - - + +
    -

    ReportPortal Tutorial

    Overview

    The goal of this tutorial is to introduce all ReportPortal capabilities. Along the way, you'll learn how to use ReportPortal features and how to get the most out of them, as well as expert tips for using our test automation results dashboard.

    How to explore ReportPortal without installation

    One day you found ReportPortal which promises to simplify the analysis of failed tests and bring many more benefits.

    “Really? I don’t believe it”, – your first reaction.

    Do you just want to see how ReportPortal works to make sure you need it? It is easy! Just visit our Demo instance and use default credentials for login:

    login: default

    password: 1q2w3e

    Or you can use a button "Login with GitHub" to login.

    How to deploy ReportPortal instance

    You tried the demo session. You are impressed with ReportPortal features / possibilities and decided to install a ReportPortal. Excellent! Visit our detailed documentation on how deploy ReportPortal:

    Please also check the technical requirements for your system

    If you don’t want to deal with technical details, we will be happy to assist you.

    How to invite Team to ReportPortal

    Finally, you logged into ReportPortal. And you see just empty tabs... Looks confusing for the first step. What can we do to get started?

    Let’s start by inviting your team members. You can also do it as a final step, but it would be nice to investigate ReportPortal together.

    In order to add other users to ReportPortal you can send invitations via email. To make sure that the Email service is configured, please follow the next steps (as an admin user): E-mail server configuration. Once emailing is configured, you can either invite new users or create a new user in the project.

    After this step you will have emailing capabilities enabled, and several more users invited to ReportPortal.

    How to generate first data in ReportPortal

    The main section for work with ReportPortal is Launches tab in the left menu. But Launches table is empty and it’s hard to understand what ReportPortal can do and what to do next.

    Generate demo data feature can help you with this, by generating a set of demo launches (test executions), filters and dashboards.

    Once generated, you will see 5 launches (each Launch is equivalent to a testing session, or testing execution, or one Jenkins job). On the Filters tab you will find 1 filter. And Dashboards will have a Demo dashboard with visualizations/widgets built on top of the data from launches.

    Let’s understand how ReportPortal works based on demo data, and later we can return to the upload of your actual data from your testing frameworks. You can navigate to this section right now if you wish.

    How to triage test failures with ReportPortal

    So far you have Demo launches in ReportPortal. You see the list of test executions on the Launches page with Total/Passed/Failed/Skipped numbers of test cases, and some of the issues are already sorted: Product Bug, Auto Bug, System Issue. But some issues required the attention of engineers, and they are marked with the “To Investigate” flag.

    The next step and the main goal for QA engineers is defect triage. This means opening each test case, identifying the root of the failure reason, and categorizing/associating it with a particular defect type. We call this action “Make decision”.

    Based on test results, you can make decisions on further steps to improve your product. For example, you can arrange a call with a Development Team Leader to discuss bug fixing, if you have a lot of Product Bugs.

    In case of a large number of System Issues, you can ask a DevOps engineer to fix the environment or to review the testing infrastructure. Thus, you won‘t waste your team's effort and time by receiving failed reports due to an inconsistent environment.

    If you have a lot of Automation Bugs, put more effort into the test cases stabilization, and convert test automation (flaky) fails into valuable test cases, which will test your application for real.

    Moreover, you can post and link issues in just a few clicks using Bug Tracking System plugins:

    Atlassian Jira Server

    Atlassian Jira Cloud

    Azure DevOps

    Rally

    How to filter test executions in ReportPortal

    To distinguish executions by type and focus only on required or related to your team today, you can use filters. Filters have “tab” capabilities, so you can easily navigate between different selections. You can filter by different criteria like launch name, description, number of failed or passed test cases, attributes, etc.

    How to add more attributes for filtering launches in ReportPortal

    There is also a possibility to filter by attributes. You can find an example of setting attributes in your profile. You can include them in the parameters of automation, then additional attributes will appear under the Launch name, and you can filter test executions by these attributes as well.

    How to visualize test results in ReportPortal

    So, you’ve separated your own test data from others. Now let’s visualize our test results. Navigate to the Dashboards tab and open the Demo Dashboard. Here you can see basic visualizations that will help you understand the state of the product.

    You can also create new Dashboards. Since managers love charts, let’s practice building some self-updated charts! And let them see the actual statistics and value of your test automation along with you, at any given moment of the time, since dashboards and widgets will be updated in real-time. +

    ReportPortal Tutorial

    Overview

    The goal of this tutorial is to introduce all ReportPortal capabilities. Along the way, you'll learn how to use ReportPortal features and how to get the most out of them, as well as expert tips for using our test automation results dashboard.

    How to explore ReportPortal without installation

    One day you found ReportPortal which promises to simplify the analysis of failed tests and bring many more benefits.

    “Really? I don’t believe it”, – your first reaction.

    Do you just want to see how ReportPortal works to make sure you need it? It is easy! Just visit our Demo instance and use default credentials for login:

    login: default

    password: 1q2w3e

    Or you can use a button "Login with GitHub" to login.

    How to deploy ReportPortal instance

    You tried the demo session. You are impressed with ReportPortal features / possibilities and decided to install a ReportPortal. Excellent! Visit our detailed documentation on how deploy ReportPortal:

    Please also check the technical requirements for your system

    If you don’t want to deal with technical details, we will be happy to assist you.

    How to invite Team to ReportPortal

    Finally, you logged into ReportPortal. And you see just empty tabs... Looks confusing for the first step. What can we do to get started?

    Let’s start by inviting your team members. You can also do it as a final step, but it would be nice to investigate ReportPortal together.

    In order to add other users to ReportPortal you can send invitations via email. To make sure that the Email service is configured, please follow the next steps (as an admin user): E-mail server configuration. Once emailing is configured, you can either invite new users or create a new user in the project.

    After this step you will have emailing capabilities enabled, and several more users invited to ReportPortal.

    How to generate first data in ReportPortal

    The main section for work with ReportPortal is Launches tab in the left menu. But Launches table is empty and it’s hard to understand what ReportPortal can do and what to do next.

    Generate demo data feature can help you with this, by generating a set of demo launches (test executions), filters and dashboards.

    Once generated, you will see 5 launches (each Launch is equivalent to a testing session, or testing execution, or one Jenkins job). On the Filters tab you will find 1 filter. And Dashboards will have a Demo dashboard with visualizations/widgets built on top of the data from launches.

    Let’s understand how ReportPortal works based on demo data, and later we can return to the upload of your actual data from your testing frameworks. You can navigate to this section right now if you wish.

    How to triage test failures with ReportPortal

    So far you have Demo launches in ReportPortal. You see the list of test executions on the Launches page with Total/Passed/Failed/Skipped numbers of test cases, and some of the issues are already sorted: Product Bug, Auto Bug, System Issue. But some issues required the attention of engineers, and they are marked with the “To Investigate” flag.

    The next step and the main goal for QA engineers is defect triage. This means opening each test case, identifying the root of the failure reason, and categorizing/associating it with a particular defect type. We call this action “Make decision”.

    Based on test results, you can make decisions on further steps to improve your product. For example, you can arrange a call with a Development Team Leader to discuss bug fixing, if you have a lot of Product Bugs.

    In case of a large number of System Issues, you can ask a DevOps engineer to fix the environment or to review the testing infrastructure. Thus, you won‘t waste your team's effort and time by receiving failed reports due to an inconsistent environment.

    If you have a lot of Automation Bugs, put more effort into the test cases stabilization, and convert test automation (flaky) fails into valuable test cases, which will test your application for real.

    Moreover, you can post and link issues in just a few clicks using Bug Tracking System plugins:

    Atlassian Jira Server

    Atlassian Jira Cloud

    Azure DevOps

    Rally

    How to filter test executions in ReportPortal

    To distinguish executions by type and focus only on required or related to your team today, you can use filters. Filters have “tab” capabilities, so you can easily navigate between different selections. You can filter by different criteria like launch name, description, number of failed or passed test cases, attributes, etc.

    How to add more attributes for filtering launches in ReportPortal

    There is also a possibility to filter by attributes. You can find an example of setting attributes in your profile. You can include them in the parameters of automation, then additional attributes will appear under the Launch name, and you can filter test executions by these attributes as well.

    How to visualize test results in ReportPortal

    So, you’ve separated your own test data from others. Now let’s visualize our test results. Navigate to the Dashboards tab and open the Demo Dashboard. Here you can see basic visualizations that will help you understand the state of the product.

    You can also create new Dashboards. Since managers love charts, let’s practice building some self-updated charts! And let them see the actual statistics and value of your test automation along with you, at any given moment of the time, since dashboards and widgets will be updated in real-time. The best widget to start from is Investigated percentage of launches which shows how well the QA team analyzes failures.

    Once QA team categorized all issues, we can understand why automation tests fail. Create Launch statistics chart widget for that. It shows the reasons of failures, for example, broken environment, outdated tests, product bugs.

    The next step can be creating the Overall statistics chart to define the Total test cases number and how many of them are Passed/Failed/Skipped. This widget can be applied for all launches or for the latest launches only.

    We've reviewed basic widgets. How can I get some insights from launches? Our suggestion is to create a Flaky test cases table to find tests that often change status from passed to failed in different launches. These unstable tests do not give any confidence. The widget allows you to identify them so that you can pay special attention to them and fix them faster.

    Next, you might want to understand how long it takes to pass each test case. Most time-consuming test cases widget helps to find the longest scenarios.

    How to use ML power of ReportPortal

    ML suggestions feature prompts similar tests and defect types they have. In this way we don’t waste time re-reading the log but use ML hints instead.

    ML suggestions analysis is running every time you enter "Make decision" editor. ML suggestions are executed for all test items no matter what defect type they currently have.

    How to use Pattern Analysis

    Pattern Analysis feature helps to find static repeating patterns within automation. For example, you know that a 404 error in your application might be caused by a specific product bug. Create the rule with a problem phrase, launch a test run, and Pattern Analysis will find all failed items which have known patterns in error logs. This allows you to draw a quick conclusion.

    How to run Auto-Analysis in ReportPortal

    ReportPortal has Auto-Analysis feature which makes it possible for the application to independently check and perform some of the routine tasks.

    When you have test executions on the Launches page, you might need to analyze them automatically using ML. You can switch ON Auto-Analysis in the settings – then it will start as soon as any launch finishes. Auto-Analysis takes a part of your routine work and defines the reason for the test item failure based on the previous launches and sets: a defect type; a link to BTS (in case it exists); comment (in case it exists). As a result, you save time, and you can create new test cases instead of analyzing test results.

    You can run Auto-Analysis manually as well.

    When the test item is analyzed by ReportPortal, a label “AA” is set on the test item on a Step Level.

    How to see the historical trend of the causes of falls

    And now let's build a more detailed “Launch statistics chart” widget with the historical changes in tests results. So, I can see how the results of my launches have changed over time.

    Use case

    Goal: Create a widget to show historical changes in Passed/Failed test cases in my API tests.

    Follow the instructions below to create this Launch statistics chart.

    Here you can see the historical distribution of your test results: there are Passed or Failed tests.

    Instead of just Failed tests, you can see the dynamics of the total number of Product bugs, Automation bugs, System issues and No Defect.

    In this way, you see the historical trend of the causes of falls.

    How to make automated test results part of my pipeline

    ReportPortal supports Continuous Testing with built-in functionality – Quality Gates (premium feature). Quality Gate is a set of predefined criteria that should be met in order launch run to be considered as successful.

    Firstly, navigate to Project settings and create a Quality Gate with the rules which will be applied to a specific launch that matches the conditions.

    Finally, configure integration with CI/CD to send results to the pipeline.

    How to use nested steps and attributes in ReportPortal

    Usually, you see the results of automation as a carpet of error logs, and only an automation engineer can understand what is happening inside. Adding nested steps (Java, Python) allows applying a one-time change in the test code to make a logical grouping of steps and make these error logs more readable for the whole team.

    You can also use attributes on any level (launch/suite/test/step) to provide more contextual information.

    How to evaluate product health with ReportPortal

    You can create a “Component health check” widget based on attributes to understand which components do not work well, and which areas we need to pay more attention to.

    Use case 1

    Goal: define which features are affected by failed scenarios.

    You can see scenarios on the first screenshot.

    Select failed scenario to see which features were affected.

    Finally, let’s see what is the priority of the failed test cases.

    Use case 2

    Goal: define the priority of failed test cases.

    You can see that failures occurred in test cases with critical priority.

    Select Critical to understand which operating system is having problems.

    Next, select Android to see the list of features that need more attention.

    Use case 3

    Goal: define state of test cases on mobile devices.

    On the screenshot below you can see that our trouble spot is Android.

    You can go to the test cases level and see what problems they had.

    How to add test results to ReportPortal

    You have checked demo test results, dashboards and widgets. And now you want to see your real data in ReportPortal.

    ReportPortal is a TestOps service that integrates with your Test Framework, listens to events and visualizes test results. You cannot execute results right from ReportPortal, but you can integrate ReportPortal with a Test Framework or Implement own integration.

    - - + + \ No newline at end of file diff --git a/saved-searches-filters/CreateFilters/index.html b/saved-searches-filters/CreateFilters/index.html index 86352ef4a..4a7366558 100644 --- a/saved-searches-filters/CreateFilters/index.html +++ b/saved-searches-filters/CreateFilters/index.html @@ -12,16 +12,16 @@ - - + +
    -

    Create filters

    Filters in the our test automation reporting dashboard are saved searches of the launches.

    Filters could be used as an independent object and for creating widgets as well.

    Permission: all users of the project despite their role.

    To create a filter, perform the following steps:

    1. Navigate to the "Launches" page.

    2. Click on the "Add Filter" button.

    3. The new tab will be opened. Now you can configure your filter. The unsaved filter is marked with an asterisk (*).

    4. Add filtering parameters to have the relevant data.

    5. Click 'Save' button.

    6. 'ADD FILTER' popup will appear.

    7. Enter a new filter name (3-55 symbols long) and click "Add" button.

    Your new filter will be saved and shown on the "Filters" page.

    note

    ReportPortal allows saving a filter on the "Launches" mode only. It's +

    Create filters

    Filters in the our test automation reporting dashboard are saved searches of the launches.

    Filters could be used as an independent object and for creating widgets as well.

    Permission: all users of the project despite their role.

    To create a filter, perform the following steps:

    1. Navigate to the "Launches" page.

    2. Click on the "Add Filter" button.

    3. The new tab will be opened. Now you can configure your filter. The unsaved filter is marked with an asterisk (*).

    4. Add filtering parameters to have the relevant data.

    5. Click 'Save' button.

    6. 'ADD FILTER' popup will appear.

    7. Enter a new filter name (3-55 symbols long) and click "Add" button.

    Your new filter will be saved and shown on the "Filters" page.

    note

    ReportPortal allows saving a filter on the "Launches" mode only. It's impossible to save filters on the "Debug" tab.

    - - + + \ No newline at end of file diff --git a/saved-searches-filters/FiltersPage/index.html b/saved-searches-filters/FiltersPage/index.html index b323bb965..18b9ef043 100644 --- a/saved-searches-filters/FiltersPage/index.html +++ b/saved-searches-filters/FiltersPage/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Filters page

    You can see the list of your saved searches and filters created by other team members on the "Filters" page.

    The following information is present on the "Filters" page:

    • Filter name and description
    • Options: criteria of search
    • Owner: the user who created the filter
    • Display on launches: ON/OFF switcher
    • Delete option

    To open launches based on saved filter, click the link of filter's name. The filter will be opened as a tab on the "Launches" page.

    It is the only place where it is possible to delete the filter from our test report&analytics dashboard.

    To do this, click the 'delete' icon of your filter and confirm the action. The filter will be deleted but not launches in it.

    - - +

    Filters page

    You can see the list of your saved searches and filters created by other team members on the "Filters" page.

    The following information is present on the "Filters" page:

    • Filter name and description
    • Options: criteria of search
    • Owner: the user who created the filter
    • Display on launches: ON/OFF switcher
    • Delete option

    To open launches based on saved filter, click the link of filter's name. The filter will be opened as a tab on the "Launches" page.

    It is the only place where it is possible to delete the filter from our test report&analytics dashboard.

    To do this, click the 'delete' icon of your filter and confirm the action. The filter will be deleted but not launches in it.

    + + \ No newline at end of file diff --git a/saved-searches-filters/ManageFilters/index.html b/saved-searches-filters/ManageFilters/index.html index 5a28016cc..d6fe0c53f 100644 --- a/saved-searches-filters/ManageFilters/index.html +++ b/saved-searches-filters/ManageFilters/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Manage filters

    Filters feature is a base for data visualization in test automation because widgets are built on their basis.

    OPERATIONS WITH FILTERS

    After the filter is saved, there are some options to manage them.

    EDIT FILTER

    This option allows edit filter name and description.

    To edit a filter, perform the following steps:

    1. Open your filter from the tab on the "Launches" page.

    2. Click the "Edit" option on the tab menu.

    3. The Edit filter popup window will appear.

    4. Make changes.

    5. To save the updates, select the "Save" option from the filter context menu.

    Your changes for the filter will be saved.

    CLONE

    This option allows you to create a new tab with the same criteria.

    To clone an already existed filter, perform the following steps:

    1. Open any filter on the "Launches" page.

    2. Click the "Clone" option on the tab menu.

    3. Enter the unique name, description and submit.

    4. The content of filter will be the same as in original filter.

    DISCARD

    This option helps to reset unsaved filter changes.

    To discard unsaved changes, perform the following steps:

    1. Open any filter on the "Launches" page.

    2. Add new criteria to the filter options.

    3. Asterisk mark appears for the filter.

    4. Click 'Discard' to remove most recent changes.

    5. All unsaved changes are removed.

    6. Asterisk mark removed for the filter tab.

    CLOSE

    This option allows to close filter tab with all selected criteria. The option is available on the filter tab.

    DELETE option is available from 'Filters' page only.

    - - +

    Manage filters

    Filters feature is a base for data visualization in test automation because widgets are built on their basis.

    OPERATIONS WITH FILTERS

    After the filter is saved, there are some options to manage them.

    EDIT FILTER

    This option allows edit filter name and description.

    To edit a filter, perform the following steps:

    1. Open your filter from the tab on the "Launches" page.

    2. Click the "Edit" option on the tab menu.

    3. The Edit filter popup window will appear.

    4. Make changes.

    5. To save the updates, select the "Save" option from the filter context menu.

    Your changes for the filter will be saved.

    CLONE

    This option allows you to create a new tab with the same criteria.

    To clone an already existed filter, perform the following steps:

    1. Open any filter on the "Launches" page.

    2. Click the "Clone" option on the tab menu.

    3. Enter the unique name, description and submit.

    4. The content of filter will be the same as in original filter.

    DISCARD

    This option helps to reset unsaved filter changes.

    To discard unsaved changes, perform the following steps:

    1. Open any filter on the "Launches" page.

    2. Add new criteria to the filter options.

    3. Asterisk mark appears for the filter.

    4. Click 'Discard' to remove most recent changes.

    5. All unsaved changes are removed.

    6. Asterisk mark removed for the filter tab.

    CLOSE

    This option allows to close filter tab with all selected criteria. The option is available on the filter tab.

    DELETE option is available from 'Filters' page only.

    + + \ No newline at end of file diff --git a/search/index.html b/search/index.html index 3f2c57acb..8d9d752f7 100644 --- a/search/index.html +++ b/search/index.html @@ -12,15 +12,15 @@ - - + +

    Search the documentation

    - - + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 36a711308..c5687228f 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://reportportal.io/docs/searchweekly0.5https://reportportal.io/docs/weekly0.5https://reportportal.io/docs/admin-panel/AllProjectsPageweekly0.5https://reportportal.io/docs/admin-panel/AllUsersPageweekly0.5https://reportportal.io/docs/admin-panel/EventMonitoringweekly0.5https://reportportal.io/docs/analysis/AutoAnalysisOfLaunchesweekly0.5https://reportportal.io/docs/analysis/HowModelsAreRetrainedweekly0.5https://reportportal.io/docs/analysis/ManualAnalysisweekly0.5https://reportportal.io/docs/analysis/MLSuggestionsweekly0.5https://reportportal.io/docs/analysis/PatternAnalysisweekly0.5https://reportportal.io/docs/analysis/SearchForTheSimilarToInvestigateItemsweekly0.5https://reportportal.io/docs/analysis/UniqueErrorAnalysisweekly0.5https://reportportal.io/docs/case-studies/ImprovingTestAutomationStabilityweekly0.5https://reportportal.io/docs/case-studies/IncreasingTestAutomationStabilityAndVisibilityweekly0.5https://reportportal.io/docs/case-studies/ReducingRegressionAnalysisEffortsweekly0.5https://reportportal.io/docs/case-studies/ReducingRegressionTimeBy50weekly0.5https://reportportal.io/docs/category/admin-panelweekly0.5https://reportportal.io/docs/category/analysisweekly0.5https://reportportal.io/docs/category/case-studiesweekly0.5https://reportportal.io/docs/category/dashboards-and-widgetsweekly0.5https://reportportal.io/docs/category/developers-guidesweekly0.5https://reportportal.io/docs/category/featuresweekly0.5https://reportportal.io/docs/category/installation-stepsweekly0.5https://reportportal.io/docs/category/issues-troubleshootingweekly0.5https://reportportal.io/docs/category/log-data-in-reportportalweekly0.5https://reportportal.io/docs/category/loggersweekly0.5https://reportportal.io/docs/category/loggers-1weekly0.5https://reportportal.io/docs/category/pluginsweekly0.5https://reportportal.io/docs/category/quality-gatesweekly0.5https://reportportal.io/docs/category/releasesweekly0.5https://reportportal.io/docs/category/reportportal-configurationweekly0.5https://reportportal.io/docs/category/saved-searches-filtersweekly0.5https://reportportal.io/docs/category/terms--conditionsweekly0.5https://reportportal.io/docs/category/user-accountweekly0.5https://reportportal.io/docs/category/work-with-reportsweekly0.5https://reportportal.io/docs/dashboards-and-widgets/ComponentHealthCheckweekly0.5https://reportportal.io/docs/dashboards-and-widgets/CumulativeTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/DifferentLaunchesComparisonChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/FailedCasesTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/FlakyTestCasesTableTop20weekly0.5https://reportportal.io/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunchesweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchesDurationChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchesTableweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatisticweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchStatisticsChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/ManageWidgetsweekly0.5https://reportportal.io/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50weekly0.5https://reportportal.io/docs/dashboards-and-widgets/MostPopularPatternTableTop20weekly0.5https://reportportal.io/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20weekly0.5https://reportportal.io/docs/dashboards-and-widgets/NonPassedTestCasesTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/OverallStatisticsweekly0.5https://reportportal.io/docs/dashboards-and-widgets/PassingRatePerLaunchweekly0.5https://reportportal.io/docs/dashboards-and-widgets/PassingRateSummaryweekly0.5https://reportportal.io/docs/dashboards-and-widgets/PossibleDashboardsInReportPortalweekly0.5https://reportportal.io/docs/dashboards-and-widgets/ProjectActivityPanelweekly0.5https://reportportal.io/docs/dashboards-and-widgets/TableComponentHealthCheckweekly0.5https://reportportal.io/docs/dashboards-and-widgets/TestCasesGrowthTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/UniqueBugsTableweekly0.5https://reportportal.io/docs/dashboards-and-widgets/WidgetCreationweekly0.5https://reportportal.io/docs/dashboards-and-widgets/WorkWithDashboardsweekly0.5https://reportportal.io/docs/dev-guides/APIDifferencesBetweenV4AndV5weekly0.5https://reportportal.io/docs/dev-guides/AsynchronousReportingweekly0.5https://reportportal.io/docs/dev-guides/AttachmentsGuideweekly0.5https://reportportal.io/docs/dev-guides/BackEndJavaContributionGuideweekly0.5https://reportportal.io/docs/dev-guides/InteractionsBetweenAPIAndAnalyzerweekly0.5https://reportportal.io/docs/dev-guides/PluginDevelopersGuideweekly0.5https://reportportal.io/docs/dev-guides/ReportingDevelopersGuideweekly0.5https://reportportal.io/docs/dev-guides/ReportPortalAPIweekly0.5https://reportportal.io/docs/dev-guides/RerunDevelopersGuideweekly0.5https://reportportal.io/docs/dev-guides/RetriesReportingweekly0.5https://reportportal.io/docs/FAQ/weekly0.5https://reportportal.io/docs/features/AIFailureReasonDetectionweekly0.5https://reportportal.io/docs/features/CategorisationOfFailuresweekly0.5https://reportportal.io/docs/features/QualityGatesweekly0.5https://reportportal.io/docs/features/RealTimeReportingweekly0.5https://reportportal.io/docs/features/RESTAPIweekly0.5https://reportportal.io/docs/features/RichArtifactsInTestReportsweekly0.5https://reportportal.io/docs/features/UnifiedTestReportingweekly0.5https://reportportal.io/docs/features/VisualisationOfTestResultsweekly0.5https://reportportal.io/docs/installation-steps/AdditionalConfigurationParametersweekly0.5https://reportportal.io/docs/installation-steps/BasicMonitoringConfigurationweekly0.5https://reportportal.io/docs/installation-steps/DeployOnUbuntuOSweekly0.5https://reportportal.io/docs/installation-steps/DeployWithAWSECSFargateweekly0.5https://reportportal.io/docs/installation-steps/DeployWithDockerOnLinuxMacweekly0.5https://reportportal.io/docs/installation-steps/DeployWithDockerOnWindowsweekly0.5https://reportportal.io/docs/installation-steps/DeployWithKubernetesweekly0.5https://reportportal.io/docs/installation-steps/DeployWithoutDockerweekly0.5https://reportportal.io/docs/installation-steps/MaintainCommandsCheatSheetweekly0.5https://reportportal.io/docs/installation-steps/OptimalPerformanceHardwareSetupweekly0.5https://reportportal.io/docs/installation-steps/ReportPortal23.1FileStorageOptionsweekly0.5https://reportportal.io/docs/installation-steps/ScalingUpReportPortalAPIServiceweekly0.5https://reportportal.io/docs/installation-steps/SetupTSLSSLInTraefik2.0.xweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomaticallyweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpaceweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToCheckLDAPConnectionweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepackweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFullweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersionweekly0.5https://reportportal.io/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolveweekly0.5https://reportportal.io/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolveweekly0.5https://reportportal.io/docs/issues-troubleshooting/ResolveAnalyzerKnownIssuesweekly0.5https://reportportal.io/docs/issues-troubleshooting/TuningCIToolweekly0.5https://reportportal.io/docs/log-data-in-reportportal/HowToRunYourTestsweekly0.5https://reportportal.io/docs/log-data-in-reportportal/ImplementOwnIntegrationweekly0.5https://reportportal.io/docs/log-data-in-reportportal/ImportDataToReportPortalweekly0.5https://reportportal.io/docs/log-data-in-reportportal/ReportingSDKweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumberweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/JBehaveweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponentsweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4Jweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logbackweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssuredweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenideweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUIweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Spockweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/TestNGweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codeceptweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJSweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypressweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmineweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jestweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mochaweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatchweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwrightweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postmanweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafeweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIOweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Netweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLogweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilogweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListenerweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/NUnitweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlowweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/VSTestweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/xUnitweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Other/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/Behatweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeceptionweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnitweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/behaveweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/nosetestsweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/pytestweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFrameworkweekly0.5https://reportportal.io/docs/plugins/AtlassianJiraCloudweekly0.5https://reportportal.io/docs/plugins/AtlassianJiraServerweekly0.5https://reportportal.io/docs/plugins/AzureDevOpsBTSweekly0.5https://reportportal.io/docs/plugins/EmailServerweekly0.5https://reportportal.io/docs/plugins/ManagePluginsweekly0.5https://reportportal.io/docs/plugins/Rallyweekly0.5https://reportportal.io/docs/plugins/SauceLabsweekly0.5https://reportportal.io/docs/quality-gates/AssessmentOfTestResultsUsingQualityGatesweekly0.5https://reportportal.io/docs/quality-gates/DeleteQualityGatesweekly0.5https://reportportal.io/docs/quality-gates/FeatureOverviewweekly0.5https://reportportal.io/docs/quality-gates/HowToInstallQualityGatesweekly0.5https://reportportal.io/docs/quality-gates/IntegrationWithCICD/weekly0.5https://reportportal.io/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCIweekly0.5https://reportportal.io/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkinsweekly0.5https://reportportal.io/docs/quality-gates/QualityGateEditweekly0.5https://reportportal.io/docs/quality-gates/QualityGatePurposeweekly0.5https://reportportal.io/docs/quality-gates/QualityRulesConfigurationweekly0.5https://reportportal.io/docs/quality-gates/UploadQualityGateToReportPortalweekly0.5https://reportportal.io/docs/releases/Version23.2weekly0.5https://reportportal.io/docs/releases/Version3.3.2weekly0.5https://reportportal.io/docs/releases/Version3.3.2-1weekly0.5https://reportportal.io/docs/releases/Version4.0.0weekly0.5https://reportportal.io/docs/releases/Version4.1.0weekly0.5https://reportportal.io/docs/releases/Version4.2.0weekly0.5https://reportportal.io/docs/releases/Version4.3weekly0.5https://reportportal.io/docs/releases/Version5.0.0weekly0.5https://reportportal.io/docs/releases/Version5.0RCweekly0.5https://reportportal.io/docs/releases/Version5.1.0weekly0.5https://reportportal.io/docs/releases/Version5.2.0weekly0.5https://reportportal.io/docs/releases/Version5.2.1weekly0.5https://reportportal.io/docs/releases/Version5.2.2weekly0.5https://reportportal.io/docs/releases/Version5.2.3weekly0.5https://reportportal.io/docs/releases/Version5.3.0weekly0.5https://reportportal.io/docs/releases/Version5.3.1.weekly0.5https://reportportal.io/docs/releases/Version5.3.2weekly0.5https://reportportal.io/docs/releases/Version5.3.3weekly0.5https://reportportal.io/docs/releases/Version5.3.5weekly0.5https://reportportal.io/docs/releases/Version5.4.0weekly0.5https://reportportal.io/docs/releases/Version5.5.0weekly0.5https://reportportal.io/docs/releases/Version5.6.0weekly0.5https://reportportal.io/docs/releases/Version5.6.1weekly0.5https://reportportal.io/docs/releases/Version5.6.2weekly0.5https://reportportal.io/docs/releases/Version5.6.3weekly0.5https://reportportal.io/docs/releases/Version5.7.0weekly0.5https://reportportal.io/docs/releases/Version5.7.1weekly0.5https://reportportal.io/docs/releases/Version5.7.2weekly0.5https://reportportal.io/docs/releases/Version5.7.3weekly0.5https://reportportal.io/docs/releases/Version5.7.4weekly0.5https://reportportal.io/docs/releases/Versionv23.1weekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/weekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/ActiveDirectoryweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/GitHubweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/LDAPweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/SAMLProvider/weekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAMLweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAMLweekly0.5https://reportportal.io/docs/reportportal-configuration/ComponentsOverviewweekly0.5https://reportportal.io/docs/reportportal-configuration/CreationOfProjectAndAddingUsersweekly0.5https://reportportal.io/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortalweekly0.5https://reportportal.io/docs/reportportal-configuration/IntegrationViaPluginweekly0.5https://reportportal.io/docs/reportportal-configuration/ProjectConfigurationweekly0.5https://reportportal.io/docs/reportportal-configuration/ReportPortalJobsConfigurationweekly0.5https://reportportal.io/docs/reportportal-glossary/weekly0.5https://reportportal.io/docs/reportportal-tutorial/weekly0.5https://reportportal.io/docs/saved-searches-filters/CreateFiltersweekly0.5https://reportportal.io/docs/saved-searches-filters/FiltersPageweekly0.5https://reportportal.io/docs/saved-searches-filters/ManageFiltersweekly0.5https://reportportal.io/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortalweekly0.5https://reportportal.io/docs/terms-and-conditions/PremiumFeaturesweekly0.5https://reportportal.io/docs/user-account/DataRetentionProcedureweekly0.5https://reportportal.io/docs/user-account/DeleteAccountweekly0.5https://reportportal.io/docs/user-account/EditPersonalInformationweekly0.5https://reportportal.io/docs/user-account/RestoreAPasswordweekly0.5https://reportportal.io/docs/user-role-guides/weekly0.5https://reportportal.io/docs/work-with-reports/FilteringLaunchesweekly0.5https://reportportal.io/docs/work-with-reports/HistoryOfLaunchesweekly0.5https://reportportal.io/docs/work-with-reports/InvestigationOfFailureweekly0.5https://reportportal.io/docs/work-with-reports/OperationsUnderLaunchesweekly0.5https://reportportal.io/docs/work-with-reports/TestCaseIdweekly0.5https://reportportal.io/docs/work-with-reports/UniqueIdweekly0.5https://reportportal.io/docs/work-with-reports/ViewLaunchesweekly0.5 \ No newline at end of file +https://reportportal.io/docs/searchweekly0.5https://reportportal.io/docs/weekly0.5https://reportportal.io/docs/admin-panel/AllProjectsPageweekly0.5https://reportportal.io/docs/admin-panel/AllUsersPageweekly0.5https://reportportal.io/docs/admin-panel/EventMonitoringweekly0.5https://reportportal.io/docs/analysis/AutoAnalysisOfLaunchesweekly0.5https://reportportal.io/docs/analysis/HowModelsAreRetrainedweekly0.5https://reportportal.io/docs/analysis/ManualAnalysisweekly0.5https://reportportal.io/docs/analysis/MLSuggestionsweekly0.5https://reportportal.io/docs/analysis/PatternAnalysisweekly0.5https://reportportal.io/docs/analysis/SearchForTheSimilarToInvestigateItemsweekly0.5https://reportportal.io/docs/analysis/UniqueErrorAnalysisweekly0.5https://reportportal.io/docs/case-studies/ImprovingTestAutomationStabilityweekly0.5https://reportportal.io/docs/case-studies/IncreasingTestAutomationStabilityAndVisibilityweekly0.5https://reportportal.io/docs/case-studies/ReducingRegressionAnalysisEffortsweekly0.5https://reportportal.io/docs/case-studies/ReducingRegressionTimeBy50weekly0.5https://reportportal.io/docs/category/admin-panelweekly0.5https://reportportal.io/docs/category/analysisweekly0.5https://reportportal.io/docs/category/case-studiesweekly0.5https://reportportal.io/docs/category/dashboards-and-widgetsweekly0.5https://reportportal.io/docs/category/developers-guidesweekly0.5https://reportportal.io/docs/category/featuresweekly0.5https://reportportal.io/docs/category/installation-stepsweekly0.5https://reportportal.io/docs/category/issues-troubleshootingweekly0.5https://reportportal.io/docs/category/loggersweekly0.5https://reportportal.io/docs/category/loggers-1weekly0.5https://reportportal.io/docs/category/pluginsweekly0.5https://reportportal.io/docs/category/quality-gatesweekly0.5https://reportportal.io/docs/category/releasesweekly0.5https://reportportal.io/docs/category/reportportal-configurationweekly0.5https://reportportal.io/docs/category/saved-searches-filtersweekly0.5https://reportportal.io/docs/category/terms--conditionsweekly0.5https://reportportal.io/docs/category/user-accountweekly0.5https://reportportal.io/docs/category/work-with-reportsweekly0.5https://reportportal.io/docs/dashboards-and-widgets/ComponentHealthCheckweekly0.5https://reportportal.io/docs/dashboards-and-widgets/CumulativeTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/DifferentLaunchesComparisonChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/FailedCasesTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/FlakyTestCasesTableTop20weekly0.5https://reportportal.io/docs/dashboards-and-widgets/InvestigatedPercentageOfLaunchesweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchesDurationChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchesTableweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchExecutionAndIssueStatisticweekly0.5https://reportportal.io/docs/dashboards-and-widgets/LaunchStatisticsChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/ManageWidgetsweekly0.5https://reportportal.io/docs/dashboards-and-widgets/MostFailedTestCasesTableTop50weekly0.5https://reportportal.io/docs/dashboards-and-widgets/MostPopularPatternTableTop20weekly0.5https://reportportal.io/docs/dashboards-and-widgets/MostTimeConsumingTestCasesWidgetTop20weekly0.5https://reportportal.io/docs/dashboards-and-widgets/NonPassedTestCasesTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/OverallStatisticsweekly0.5https://reportportal.io/docs/dashboards-and-widgets/PassingRatePerLaunchweekly0.5https://reportportal.io/docs/dashboards-and-widgets/PassingRateSummaryweekly0.5https://reportportal.io/docs/dashboards-and-widgets/PossibleDashboardsInReportPortalweekly0.5https://reportportal.io/docs/dashboards-and-widgets/ProjectActivityPanelweekly0.5https://reportportal.io/docs/dashboards-and-widgets/TableComponentHealthCheckweekly0.5https://reportportal.io/docs/dashboards-and-widgets/TestCasesGrowthTrendChartweekly0.5https://reportportal.io/docs/dashboards-and-widgets/UniqueBugsTableweekly0.5https://reportportal.io/docs/dashboards-and-widgets/WidgetCreationweekly0.5https://reportportal.io/docs/dashboards-and-widgets/WorkWithDashboardsweekly0.5https://reportportal.io/docs/dev-guides/APIDifferencesBetweenV4AndV5weekly0.5https://reportportal.io/docs/dev-guides/AsynchronousReportingweekly0.5https://reportportal.io/docs/dev-guides/AttachmentsGuideweekly0.5https://reportportal.io/docs/dev-guides/BackEndJavaContributionGuideweekly0.5https://reportportal.io/docs/dev-guides/InteractionsBetweenAPIAndAnalyzerweekly0.5https://reportportal.io/docs/dev-guides/PluginDevelopersGuideweekly0.5https://reportportal.io/docs/dev-guides/ReportingDevelopersGuideweekly0.5https://reportportal.io/docs/dev-guides/ReportPortalAPIweekly0.5https://reportportal.io/docs/dev-guides/RerunDevelopersGuideweekly0.5https://reportportal.io/docs/dev-guides/RetriesReportingweekly0.5https://reportportal.io/docs/FAQ/weekly0.5https://reportportal.io/docs/features/AIFailureReasonDetectionweekly0.5https://reportportal.io/docs/features/CategorisationOfFailuresweekly0.5https://reportportal.io/docs/features/QualityGatesweekly0.5https://reportportal.io/docs/features/RealTimeReportingweekly0.5https://reportportal.io/docs/features/RESTAPIweekly0.5https://reportportal.io/docs/features/RichArtifactsInTestReportsweekly0.5https://reportportal.io/docs/features/UnifiedTestReportingweekly0.5https://reportportal.io/docs/features/VisualisationOfTestResultsweekly0.5https://reportportal.io/docs/installation-steps/AdditionalConfigurationParametersweekly0.5https://reportportal.io/docs/installation-steps/BasicMonitoringConfigurationweekly0.5https://reportportal.io/docs/installation-steps/DeployOnUbuntuOSweekly0.5https://reportportal.io/docs/installation-steps/DeployWithAWSECSFargateweekly0.5https://reportportal.io/docs/installation-steps/DeployWithDockerOnLinuxMacweekly0.5https://reportportal.io/docs/installation-steps/DeployWithDockerOnWindowsweekly0.5https://reportportal.io/docs/installation-steps/DeployWithKubernetesweekly0.5https://reportportal.io/docs/installation-steps/DeployWithoutDockerweekly0.5https://reportportal.io/docs/installation-steps/MaintainCommandsCheatSheetweekly0.5https://reportportal.io/docs/installation-steps/OptimalPerformanceHardwareSetupweekly0.5https://reportportal.io/docs/installation-steps/ReportPortal23.1FileStorageOptionsweekly0.5https://reportportal.io/docs/installation-steps/ScalingUpReportPortalAPIServiceweekly0.5https://reportportal.io/docs/installation-steps/SetupTSLSSLInTraefik2.0.xweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToAddATestStackTraceToADescriptionAutomaticallyweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToAvoidLocalExecutionReportedIntoProjectSpaceweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToCheckLDAPConnectionweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingPGRepackweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToCleanUpTheReportPortalDatabaseUsingVacuumFullweekly0.5https://reportportal.io/docs/issues-troubleshooting/HowToResolveIssuesWithMigrationToTheNewVersionweekly0.5https://reportportal.io/docs/issues-troubleshooting/IssuesWithJIRABugTrackingSystemHowToResolveweekly0.5https://reportportal.io/docs/issues-troubleshooting/IssuesWithLDAPSHowToResolveweekly0.5https://reportportal.io/docs/issues-troubleshooting/ResolveAnalyzerKnownIssuesweekly0.5https://reportportal.io/docs/issues-troubleshooting/TuningCIToolweekly0.5https://reportportal.io/docs/log-data-in-reportportal/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/HowToRunYourTestsweekly0.5https://reportportal.io/docs/log-data-in-reportportal/ImplementOwnIntegrationweekly0.5https://reportportal.io/docs/log-data-in-reportportal/ImportDataToReportPortalweekly0.5https://reportportal.io/docs/log-data-in-reportportal/ReportingSDKweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Cucumberweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/JBehaveweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit4weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/JUnit5weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/ApacheHttpComponentsweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Log4Jweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Logbackweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/OkHttp3weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/RestAssuredweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Loggers/Selenideweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/SoapUIweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/Spockweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Java/TestNGweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Codeceptweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/CucumberJSweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Cypressweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jasmineweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Jestweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Mochaweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Nightwatchweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Playwrightweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/Postmanweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/TestCafeweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/JavaScript/WebdriverIOweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Log4Netweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/NLogweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/Serilogweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/Loggers/TraceListenerweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/NUnitweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/SpecFlowweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/VSTestweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Net/xUnitweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Other/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/Behatweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/Codeceptionweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/PHP/PHPUnitweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/weekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/behaveweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/nosetestsweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/pytestweekly0.5https://reportportal.io/docs/log-data-in-reportportal/test-framework-integration/Python/RobotFrameworkweekly0.5https://reportportal.io/docs/plugins/AtlassianJiraCloudweekly0.5https://reportportal.io/docs/plugins/AtlassianJiraServerweekly0.5https://reportportal.io/docs/plugins/AzureDevOpsBTSweekly0.5https://reportportal.io/docs/plugins/EmailServerweekly0.5https://reportportal.io/docs/plugins/ManagePluginsweekly0.5https://reportportal.io/docs/plugins/Rallyweekly0.5https://reportportal.io/docs/plugins/SauceLabsweekly0.5https://reportportal.io/docs/quality-gates/AssessmentOfTestResultsUsingQualityGatesweekly0.5https://reportportal.io/docs/quality-gates/DeleteQualityGatesweekly0.5https://reportportal.io/docs/quality-gates/FeatureOverviewweekly0.5https://reportportal.io/docs/quality-gates/HowToInstallQualityGatesweekly0.5https://reportportal.io/docs/quality-gates/IntegrationWithCICD/weekly0.5https://reportportal.io/docs/quality-gates/IntegrationWithCICD/IntegrationWithGitLabCIweekly0.5https://reportportal.io/docs/quality-gates/IntegrationWithCICD/IntegrationWithJenkinsweekly0.5https://reportportal.io/docs/quality-gates/QualityGateEditweekly0.5https://reportportal.io/docs/quality-gates/QualityGatePurposeweekly0.5https://reportportal.io/docs/quality-gates/QualityRulesConfigurationweekly0.5https://reportportal.io/docs/quality-gates/UploadQualityGateToReportPortalweekly0.5https://reportportal.io/docs/releases/Version23.2weekly0.5https://reportportal.io/docs/releases/Version3.3.2weekly0.5https://reportportal.io/docs/releases/Version3.3.2-1weekly0.5https://reportportal.io/docs/releases/Version4.0.0weekly0.5https://reportportal.io/docs/releases/Version4.1.0weekly0.5https://reportportal.io/docs/releases/Version4.2.0weekly0.5https://reportportal.io/docs/releases/Version4.3weekly0.5https://reportportal.io/docs/releases/Version5.0.0weekly0.5https://reportportal.io/docs/releases/Version5.0RCweekly0.5https://reportportal.io/docs/releases/Version5.1.0weekly0.5https://reportportal.io/docs/releases/Version5.2.0weekly0.5https://reportportal.io/docs/releases/Version5.2.1weekly0.5https://reportportal.io/docs/releases/Version5.2.2weekly0.5https://reportportal.io/docs/releases/Version5.2.3weekly0.5https://reportportal.io/docs/releases/Version5.3.0weekly0.5https://reportportal.io/docs/releases/Version5.3.1.weekly0.5https://reportportal.io/docs/releases/Version5.3.2weekly0.5https://reportportal.io/docs/releases/Version5.3.3weekly0.5https://reportportal.io/docs/releases/Version5.3.5weekly0.5https://reportportal.io/docs/releases/Version5.4.0weekly0.5https://reportportal.io/docs/releases/Version5.5.0weekly0.5https://reportportal.io/docs/releases/Version5.6.0weekly0.5https://reportportal.io/docs/releases/Version5.6.1weekly0.5https://reportportal.io/docs/releases/Version5.6.2weekly0.5https://reportportal.io/docs/releases/Version5.6.3weekly0.5https://reportportal.io/docs/releases/Version5.7.0weekly0.5https://reportportal.io/docs/releases/Version5.7.1weekly0.5https://reportportal.io/docs/releases/Version5.7.2weekly0.5https://reportportal.io/docs/releases/Version5.7.3weekly0.5https://reportportal.io/docs/releases/Version5.7.4weekly0.5https://reportportal.io/docs/releases/Versionv23.1weekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/weekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/ActiveDirectoryweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/GitHubweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/LDAPweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/SAMLProvider/weekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/SAMLProvider/AzureSAMLweekly0.5https://reportportal.io/docs/reportportal-configuration/authorization/SAMLProvider/OktaSAMLweekly0.5https://reportportal.io/docs/reportportal-configuration/ComponentsOverviewweekly0.5https://reportportal.io/docs/reportportal-configuration/CreationOfProjectAndAddingUsersweekly0.5https://reportportal.io/docs/reportportal-configuration/HowToGetAnAccessTokenInReportPortalweekly0.5https://reportportal.io/docs/reportportal-configuration/IntegrationViaPluginweekly0.5https://reportportal.io/docs/reportportal-configuration/ProjectConfigurationweekly0.5https://reportportal.io/docs/reportportal-configuration/ReportPortalJobsConfigurationweekly0.5https://reportportal.io/docs/reportportal-glossary/weekly0.5https://reportportal.io/docs/reportportal-tutorial/weekly0.5https://reportportal.io/docs/saved-searches-filters/CreateFiltersweekly0.5https://reportportal.io/docs/saved-searches-filters/FiltersPageweekly0.5https://reportportal.io/docs/saved-searches-filters/ManageFiltersweekly0.5https://reportportal.io/docs/terms-and-conditions/GoogleAnalyticsUsageByReportPortalweekly0.5https://reportportal.io/docs/terms-and-conditions/PremiumFeaturesweekly0.5https://reportportal.io/docs/user-account/DataRetentionProcedureweekly0.5https://reportportal.io/docs/user-account/DeleteAccountweekly0.5https://reportportal.io/docs/user-account/EditPersonalInformationweekly0.5https://reportportal.io/docs/user-account/RestoreAPasswordweekly0.5https://reportportal.io/docs/user-role-guides/weekly0.5https://reportportal.io/docs/work-with-reports/FilteringLaunchesweekly0.5https://reportportal.io/docs/work-with-reports/HistoryOfLaunchesweekly0.5https://reportportal.io/docs/work-with-reports/InvestigationOfFailureweekly0.5https://reportportal.io/docs/work-with-reports/OperationsUnderLaunchesweekly0.5https://reportportal.io/docs/work-with-reports/TestCaseIdweekly0.5https://reportportal.io/docs/work-with-reports/UniqueIdweekly0.5https://reportportal.io/docs/work-with-reports/ViewLaunchesweekly0.5 \ No newline at end of file diff --git a/terms-and-conditions/GoogleAnalyticsUsageByReportPortal/index.html b/terms-and-conditions/GoogleAnalyticsUsageByReportPortal/index.html index 0090e1a38..04eee4b9e 100644 --- a/terms-and-conditions/GoogleAnalyticsUsageByReportPortal/index.html +++ b/terms-and-conditions/GoogleAnalyticsUsageByReportPortal/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Google Analytics usage by ReportPortal

    ReportPortal uses Google Analytics (GA) for web analytics capabilities. GA helps the ReportPortal Team to understand product usage and make ReportPortal more convenient and useful for our users. To address any concerns about the data we collect, we want to be transparent about which data is sent to GA, and assure you that no personal or confidential data is transferred. To be clear, we do not gather personal information at all through GA. In this article, we explain how Google Analytics works on ReportPortal, its benefits, and how you can turn it off if you want.

    Google Analytics usage on ReportPortal UI

    We collect only the following data by using Google Analytics on ReportPortal UI:

    1. Device information: hardware model, operating system version, screen resolution, browser version.

    2. Behavior information: how user interacts with ReportPortal, where user clicks, what actions he or she does, app usage time.

    These analytics helps us to improve performance and user-friendliness. Based on analytics, for example, we can decide to write a new documentation or optimize our features and app navigation.

    note

    We do not collect information that personally identifies you. We follow privacy policy in all cases.

    How to disable Google Analytics on ReportPortal UI

    You can turn off Google Analytics on ReportPortal UI as well.

    1. Log in to ReportPortal as Admin.

    2. Open Menu at the bottom and select “Administrate” section.

    1. Select “Server Settings”.
    1. Open “Analytics” tab.

    2. Uncheck “Help make ReportPortal better by automatically sending analytics to us” checkbox.

    note

    You can enable Google Analytics if you check “Help make ReportPortal better by automatically sending analytics to us” checkbox.

    Google Analytics usage on ReportPortal agents

    We collect only the following data by using Google Analytics on ReportPortal agents:

    1. Start of the Launch, and the calendar date of this event.

    2. ReportPortal SDK library name and it’s version, e.g., reportportal 5.0.6.

    3. ReportPortal Integration library (agent name), e.g., pytest-reportportal, version 5.0.11.

    4. Code Interpreter name, e.g., Python 3.6.9.

    We need this data to know what libraries and development platforms our users prefer. So, we can prioritize our work on agents in accordance to its actual usage.

    How to disable Google Analytics gathering on ReportPortal agents

    Basics

    At the nutshell you need to set AGENT_NO_ANALYTICS environment variable with any non-empty value. In Unix or Linux you +

    Google Analytics usage by ReportPortal

    ReportPortal uses Google Analytics (GA) for web analytics capabilities. GA helps the ReportPortal Team to understand product usage and make ReportPortal more convenient and useful for our users. To address any concerns about the data we collect, we want to be transparent about which data is sent to GA, and assure you that no personal or confidential data is transferred. To be clear, we do not gather personal information at all through GA. In this article, we explain how Google Analytics works on ReportPortal, its benefits, and how you can turn it off if you want.

    Google Analytics usage on ReportPortal UI

    We collect only the following data by using Google Analytics on ReportPortal UI:

    1. Device information: hardware model, operating system version, screen resolution, browser version.

    2. Behavior information: how user interacts with ReportPortal, where user clicks, what actions he or she does, app usage time.

    These analytics helps us to improve performance and user-friendliness. Based on analytics, for example, we can decide to write a new documentation or optimize our features and app navigation.

    note

    We do not collect information that personally identifies you. We follow privacy policy in all cases.

    How to disable Google Analytics on ReportPortal UI

    You can turn off Google Analytics on ReportPortal UI as well.

    1. Log in to ReportPortal as Admin.

    2. Open Menu at the bottom and select “Administrate” section.

    1. Select “Server Settings”.
    1. Open “Analytics” tab.

    2. Uncheck “Help make ReportPortal better by automatically sending analytics to us” checkbox.

    note

    You can enable Google Analytics if you check “Help make ReportPortal better by automatically sending analytics to us” checkbox.

    Google Analytics usage on ReportPortal agents

    We collect only the following data by using Google Analytics on ReportPortal agents:

    1. Start of the Launch, and the calendar date of this event.

    2. ReportPortal SDK library name and it’s version, e.g., reportportal 5.0.6.

    3. ReportPortal Integration library (agent name), e.g., pytest-reportportal, version 5.0.11.

    4. Code Interpreter name, e.g., Python 3.6.9.

    We need this data to know what libraries and development platforms our users prefer. So, we can prioritize our work on agents in accordance to its actual usage.

    How to disable Google Analytics gathering on ReportPortal agents

    Basics

    At the nutshell you need to set AGENT_NO_ANALYTICS environment variable with any non-empty value. In Unix or Linux you can use export command for that:

    export AGENT_NO_ANALYTICS=1

    For Windows systems there is analogue command set:

    set AGENT_NO_ANALYTICS=1

    Then you can run your tests in the same shell and analytics gathering will be disabled.

    To test that you actually have set the variable you can use echo command.

    Linux:

    echo "${AGENT_NO_ANALYTICS}"

    Windows:

    echo %AGENT_NO_ANALYTICS%

    If you don't want to set that variable each time you start a shell, there are several technics you can use.

    Constantly disabling analytics

    Unix/Linux

    Everything what you export in .bash_profile file in your test user's home directory will be automatically set each time you log in into console. To edit the file you can use nano - a simple text editor:

    nano ~/.bash_profile

    Put export line somewhere in the file and hit Ctrl+O to save it and Ctrl+X to close.

    Windows

    To set environment variable on Windows 10 family systems right-click on it icon in taskbar and choose System. In opened window hit Advanced system settings in the right menu and then Environment variables button in opened @@ -27,7 +27,7 @@ everything with OK button. The changes will be applied after the system restart.

    Build systems

    Some build systems can set environment variables on their own we can use this feature to set the variable.

    Gradle

    Gradle has environment keyword which sets variables for child processes, so all you need to do is to set it in test task:

    test {
    environment "AGENT_NO_ANALYTICS", "1"
    }

    Maven

    maven-surefire-plugin has option to set environment variables for forked processes, so you can configure the plugin accordingly:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.epam.reportportal.example</groupId>
    <artifactId>example-mute</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
    <plugins>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
    <forkMode>once</forkMode>
    <environmentVariables>
    <AGENT_NO_ANALYTICS>1</AGENT_NO_ANALYTICS>
    </environmentVariables>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>

    tox

    Python's tox automation tool also provides a way to set necessary variables with setenv parameter in tox.ini file:

    [testenv]
    setenv =
    AGENT_NO_ANALYTICS = 1

    Docker

    If your tests are wrapped in a docker container you need to bypass this variable through command-line with -e flag:

    docker run --rm -it \
    -e "AGENT_NO_ANALYTICS=1"
    selenium/standalone-chrome:103.0

    Or you can use ENV keyword in your Dockerfile when building the image:

    ENV AGENT_NO_ANALYTICS=1

    Thanks to Google Analytics, we can deliver interesting and helpful features to ReportPortal. As a result, you will have effective working instruments and better customer support.

    - - + + \ No newline at end of file diff --git a/terms-and-conditions/PremiumFeatures/index.html b/terms-and-conditions/PremiumFeatures/index.html index 14b11aa58..1dc2e43ec 100644 --- a/terms-and-conditions/PremiumFeatures/index.html +++ b/terms-and-conditions/PremiumFeatures/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Premium Features

    At ReportPortal, we understand that every enterprise's testing environment is unique, requiring tailored solutions that address specific needs. To cater to this demand, we've introduced our Premium Features, exclusively available to our Managed Services and SaaS subscription clients.

    Our Premium Features have been meticulously designed and developed with large-scale, enterprise-level needs in mind. They are the cornerstone for organizations seeking to establish true continuous testing within their operational setup. Whether it's the ability to navigate the complexities of testing at scale, or the demand for more granular insights to drive decision-making, these premium options are equipped to handle it all.

    We invite you to explore our Premium Features, understanding their objectives and benefits in detail on our documentation page. We are confident that you'll find the value they add to be well worth the investment. As always, we're here to answer any questions and assist you in getting the most out of your ReportPortal experience.

    Available Premium Features:

    - - +

    Premium Features

    At ReportPortal, we understand that every enterprise's testing environment is unique, requiring tailored solutions that address specific needs. To cater to this demand, we've introduced our Premium Features, exclusively available to our Managed Services and SaaS subscription clients.

    Our Premium Features have been meticulously designed and developed with large-scale, enterprise-level needs in mind. They are the cornerstone for organizations seeking to establish true continuous testing within their operational setup. Whether it's the ability to navigate the complexities of testing at scale, or the demand for more granular insights to drive decision-making, these premium options are equipped to handle it all.

    We invite you to explore our Premium Features, understanding their objectives and benefits in detail on our documentation page. We are confident that you'll find the value they add to be well worth the investment. As always, we're here to answer any questions and assist you in getting the most out of your ReportPortal experience.

    Available Premium Features:

    + + \ No newline at end of file diff --git a/user-account/DataRetentionProcedure/index.html b/user-account/DataRetentionProcedure/index.html index 58884dcab..02cc81a71 100644 --- a/user-account/DataRetentionProcedure/index.html +++ b/user-account/DataRetentionProcedure/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Data retention procedure

    Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days.

    Docker

    To activate data retention, add the following environment variables to Service Jobs:

    # Int (days)
    RP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_RETENTIONPERIOD:

    # CRON
    RP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_CRON:
    RP_ENVIRONMENT_VARIABLE_NOTIFICATION_EXPIREDUSER_CRON:

    Kubernetes

    Fill in Service Jobs values in the values.yaml

    servicejobs:
    coreJobs:
    # Int (days)
    notifyExpiredUserCron:

    # CRON
    cleanExpiredUserCron:
    cleanExpiredUserRetention:

    If the data retention option is enabled but a specific number of days for deleting inactive users is not specified, no deletions will occur. In the case of specifying 0 or a negative value, an error will be displayed in the logs.

    When the data retention option is activated, the job will run daily to identify inactive users and obfuscate their data.

    Inactive users are defined as follows:

    1. Users who have not logged in for N days.

    2. Users who have not reported testing data for N days.

    Users are only classified as inactive if both conditions are satisfied.

    In cases where a user logs in but doesn’t submit any reports, they are not deleted as the second condition isn’t fulfilled. Similarly, if a user has not logged in but has submitted reports, they are still considered active.

    Before performing deletions, the system sends out email notifications as follows: notification №1 is dispatched to inactive users N-60 days before deletion, notification №2 is sent N-30 days prior, and notification №3 is sent 1 day before obfuscation. Notifications about account deletion are also sent by the system.

    Users will be able to return whenever they are invited to the project.

    In summary, a data retention policy optimizes resources and helps create a more efficient, secure, and effective environment for data management, which fosters business success.

    - - +

    Data retention procedure

    Starting from version 23.2, ReportPortal introduces an option to establish a retention period for collected Personally Identifiable Information (PII) data during instance configuration. This configuration allows for setting an individual retention duration for the instance in days, such as N=90, 180, 540 or any other number of days.

    Docker

    To activate data retention, add the following environment variables to Service Jobs:

    # Int (days)
    RP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_RETENTIONPERIOD:

    # CRON
    RP_ENVIRONMENT_VARIABLE_CLEAN_EXPIREDUSER_CRON:
    RP_ENVIRONMENT_VARIABLE_NOTIFICATION_EXPIREDUSER_CRON:

    Kubernetes

    Fill in Service Jobs values in the values.yaml

    servicejobs:
    coreJobs:
    # Int (days)
    notifyExpiredUserCron:

    # CRON
    cleanExpiredUserCron:
    cleanExpiredUserRetention:

    If the data retention option is enabled but a specific number of days for deleting inactive users is not specified, no deletions will occur. In the case of specifying 0 or a negative value, an error will be displayed in the logs.

    When the data retention option is activated, the job will run daily to identify inactive users and obfuscate their data.

    Inactive users are defined as follows:

    1. Users who have not logged in for N days.

    2. Users who have not reported testing data for N days.

    Users are only classified as inactive if both conditions are satisfied.

    In cases where a user logs in but doesn’t submit any reports, they are not deleted as the second condition isn’t fulfilled. Similarly, if a user has not logged in but has submitted reports, they are still considered active.

    Before performing deletions, the system sends out email notifications as follows: notification №1 is dispatched to inactive users N-60 days before deletion, notification №2 is sent N-30 days prior, and notification №3 is sent 1 day before obfuscation. Notifications about account deletion are also sent by the system.

    Users will be able to return whenever they are invited to the project.

    In summary, a data retention policy optimizes resources and helps create a more efficient, secure, and effective environment for data management, which fosters business success.

    + + \ No newline at end of file diff --git a/user-account/DeleteAccount/index.html b/user-account/DeleteAccount/index.html index 955b4398d..bc329e9dd 100644 --- a/user-account/DeleteAccount/index.html +++ b/user-account/DeleteAccount/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Delete account

    Starting from version 23.2, ReportPortal users can delete their accounts along with their personal data.

    During the instance setup, the DevOps engineer (or whoever is deploying the instance) can use a variable to decide whether the "Delete account" button will appear in each user's profile or not. This setting is specific to each instance.

    RP_ENVIRONMENT_VARIABLE_ALLOW_DELETE_ACCOUNT: true

    When a user clicks on the "Delete account" button, a modal window with feedback options appears. The user can select from predefined options or choose "Other" and provide a specific reason for deleting their account. Alternatively, they can simply select "Other" without leaving any comments.

    To prevent accidental deletions, the user must enter "Delete" in capital letters to confirm their intention to delete the account. This extra step ensures that the user genuinely wants to proceed with the account deletion. Once the user clicks the "Delete" button, all personal information related to their account, including account name, email, and photo, will be removed from our test automation reporting platform. However, any data created or reported by the user in ReportPortal, such as launches, filters, widgets, and dashboards, will still be retained in the application but will no longer be accessible to the user. Additionally, the user will receive an email notification confirming the account deletion.

    In summary, allowing users to delete their accounts and personal data from our automated testing tool is a critical measure to protect user privacy. ReportPortal is committed to adhering to data protection regulations and staying up to date with industry trends to ensure compliance.

    - - +

    Delete account

    Starting from version 23.2, ReportPortal users can delete their accounts along with their personal data.

    During the instance setup, the DevOps engineer (or whoever is deploying the instance) can use a variable to decide whether the "Delete account" button will appear in each user's profile or not. This setting is specific to each instance.

    RP_ENVIRONMENT_VARIABLE_ALLOW_DELETE_ACCOUNT: true

    When a user clicks on the "Delete account" button, a modal window with feedback options appears. The user can select from predefined options or choose "Other" and provide a specific reason for deleting their account. Alternatively, they can simply select "Other" without leaving any comments.

    To prevent accidental deletions, the user must enter "Delete" in capital letters to confirm their intention to delete the account. This extra step ensures that the user genuinely wants to proceed with the account deletion. Once the user clicks the "Delete" button, all personal information related to their account, including account name, email, and photo, will be removed from our test automation reporting platform. However, any data created or reported by the user in ReportPortal, such as launches, filters, widgets, and dashboards, will still be retained in the application but will no longer be accessible to the user. Additionally, the user will receive an email notification confirming the account deletion.

    In summary, allowing users to delete their accounts and personal data from our automated testing tool is a critical measure to protect user privacy. ReportPortal is committed to adhering to data protection regulations and staying up to date with industry trends to ensure compliance.

    + + \ No newline at end of file diff --git a/user-account/EditPersonalInformation/index.html b/user-account/EditPersonalInformation/index.html index a53d8b3ef..a0e2dfb5b 100644 --- a/user-account/EditPersonalInformation/index.html +++ b/user-account/EditPersonalInformation/index.html @@ -12,20 +12,20 @@ - - + +
    -

    Edit personal information

    To navigate to the User Profile page, open menu at the bottom of the page and select "Profile" option.

    The User Profile page consists of the following elements:

    - - + + \ No newline at end of file diff --git a/user-account/RestoreAPassword/index.html b/user-account/RestoreAPassword/index.html index ae8e9c459..8764ba4f2 100644 --- a/user-account/RestoreAPassword/index.html +++ b/user-account/RestoreAPassword/index.html @@ -12,17 +12,17 @@ - - + +
    -

    Restore a password

    If you forgot your password, you can restore it on the login page. To do that, perform the following steps:

    1. Click the "Forgot your password?" link on the login page.

    2. Enter your email in the form that appears and click the "Change Password" +

      Restore a password

      If you forgot your password, you can restore it on the login page. To do that, perform the following steps:

      1. Click the "Forgot your password?" link on the login page.

      2. Enter your email in the form that appears and click the "Change Password" button. The password recovery instructions will be sent to your email.

      3. Follow the link from the email. The Restore Password form will appear.

      4. Fill in the restore password form and click the "Change Password" button. Now you can log in ReportPortal with the new credentials.

      note

      GitHub user cannot restore the password on ReportPortal.

    - - + + \ No newline at end of file diff --git a/user-role-guides/index.html b/user-role-guides/index.html index 8a9ad0cd2..f054c0f6e 100644 --- a/user-role-guides/index.html +++ b/user-role-guides/index.html @@ -12,17 +12,17 @@ - - + +
    -
    - - + + \ No newline at end of file diff --git a/work-with-reports/FilteringLaunches/index.html b/work-with-reports/FilteringLaunches/index.html index ec92be869..a9bb8bedf 100644 --- a/work-with-reports/FilteringLaunches/index.html +++ b/work-with-reports/FilteringLaunches/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Filtering launches

    The data tables for the "Launches" and the "Debug" modes can be filtered with +

    Filtering launches

    The data tables for the "Launches" and the "Debug" modes can be filtered with a filtering block. Filters may be applied at all test item levels: Launch/Suite/Test/Step. The "Launches" mode allows saving a filter (a particular combination of filtering criteria) to the "Filters" tab. The @@ -47,7 +47,7 @@ Defect Comments "abcd", "zabc", "zabcd", "abc".

    • contains - shown all test items that contain specified combination in the defect comment;
    • not contains - shown all test items that don't contain specified combination in the defect comment;
    • equals - shown all test items which defect comment is absolutely equal to the specified combination;
    • not equals - shown all test items without items which defect comment is absolutely equal to the specified combination;
    • Attributes - 1 symbol is enough for this search. The system searches for the items with or without a specified Attribute(s). Multiple Attributes may be specified at once. The following filtering conditions are available: ALL/ANY and WITHOUT ALL/WITHOUT ANY.
    • all ( in API: 'filter.has.attributes') - shown all test items which contain all specified Attributess;
    • without all( in API:'filter.!in.attributes') - shown all test items without specified Attributess in any combinations;
    • any ( in API:filter.in.attributes) - shown all test items which contain any combinations of specified attributes;
    • without any ( in API:'filter.!has.attributes') - shown all test items without all specified attributes in case, when both of attributes present in the test item;
    • Analysed by RP (AA) - there are two options: With AA mark, Without AA mark.

    • Ignored in AA - there are two options: With Ignore mark, Without ignoring mark.

    • Issue in BTS - there are two options: 1 symbol is enough for autocomplete. The system searches for the items with or without a specified Issue in BTS. Multiple Issues may be specified at once. The following filtering conditions are available: ALL/ANY and WITHOUT ALL/WITHOUT ANY.

    • all (has) - shown all test items which contain all specified Issues;
    • without all(!has) - shown test items without all specified Issies in any combinations;
    • any (in) - shown all test items which contain any combinations of specified Issues;
    • without any (!in) - shown all test items without any specified Issues
    • Pattern name - all patterns names, which a PM creates on Project Settings

    • Has retries/Hasn't retries - there are two options: Has retries/ No retries.

    - - + + \ No newline at end of file diff --git a/work-with-reports/HistoryOfLaunches/index.html b/work-with-reports/HistoryOfLaunches/index.html index eb599892f..5a6981a3a 100644 --- a/work-with-reports/HistoryOfLaunches/index.html +++ b/work-with-reports/HistoryOfLaunches/index.html @@ -12,14 +12,14 @@ - - + +
    -

    History of launches

    Historical trend of executions

    The historical trend of executions represents your history view for the list of test items in our test execution dashboard. This feature can help you to find +

    History of launches

    Historical trend of executions

    The historical trend of executions represents your history view for the list of test items in our test execution dashboard. This feature can help you to find the most unstable test cases in your suites/ launches/ builds.

    To see a table of the historical trend of executions, navigate to the "Launches" page and drill down to launch structure/ or launch statistics.

    History table based on Test Case Hash

    Test case hash is a parameter that is automatically generated based on the Test Case ID (if specified) or the full path to the test.

    You can read about the Test Case ID here.

    Unique ID history

    (deprecated)

    1. Take the ReportPortal release version 5.2.2 or higher. docker-compose.yml

    2. Add an environment variable to the service-API service:

    RP_ENVIRONMENT_VARIABLE_HISTORY_OLD=true
    1. Redeploy ReportPortal

    Test Case Hash history

    Run ReportPortal without env variable.

    History table

    Where you can find History table.

    Drill down to the Step view (test executions list).

    Click the "History" button.

    You will see a historical trend in a table.

    History trends have the following color scheme:

    • Red - indicates the launches with failed or interrupted cases

    • Green - indicates passed launches

    • Yellow – indicates the launches with several equal test items present within a required level

    • Grey - indicates the test item with no descendants in this run.

    • Animated - still without state [in progress]

    You can select the depth of history: 3, 5, 10, 15, 20, 25 or 30 launches from the "History Depth" drop-down menu.

    There are two options for a History table:

    • history for all launches
    • history for launches with the same name

    If your are using History table based on Test Case Hash, you will be able to use both of this options. In case you use a history table based on UID, a history table will show you results in mode: "History for launches with the same name".

    History for all launches

    If you have configured ReportPortal with TestCase History table. @@ -43,7 +43,7 @@ above the item.

    Also on a History line, you can see an "i" label, it means that the item with this label has a defect comment or/and a link to the Bug Tracking System.

    History across All launches

    By default system shows history across Launches with the same name.

    But you can choose option "History across All Launches" and system will show you executions of the test cases which have been executed in launches with different names.

    On hover user can find launch name of test and all launch attributes.

    Duration fluctuation

    If test execution has duration growth in comparison with previous run, the system marks such items with red triangles:

    No duration growth - 0 triangles

    duration growh from 0 to 20% - 1 triangles

    duration growh from 21% - 50% - 2 trianges

    duration growh from 51% - 100% - 3 trianges

    duration growh from 101% and higher - 4 trianges

    Load more History

    By default the system shows 12 latest executions. If you need more history you can click on the button "Load more 9 items and the system loaded more executions on history line. Max number of items on History line is 30 executions.

    User can move on History line using horizontal scroll.

    Test Item actions history

    Test Item actions history will show you the history of actions, which have been made to a certain test item. You can see the kind of activity, and who performed it.

    The following actions are shown on the history of actions:

    user changed defect type of test item

    user posted a comment to the test item

    user posted a bug to the Bug Tracking System or added a link to the existing in Bug Tracking System issue.

    analyzer changed defect type of test item based on the item (where "item" is a link to a log view of an item which has been chosen by Analyzer as the most relevant result)

    analyzer posted a comment to the test item

    analyzer posted a bug to the Bug Tracking System or added a link to the existing in the Bug Tracking System issue.

    To see the history of actions, navigate to a certain child item. By default you will see the last action in one line.

    Use spoiler to maximize actions history:

    - - + + \ No newline at end of file diff --git a/work-with-reports/InvestigationOfFailure/index.html b/work-with-reports/InvestigationOfFailure/index.html index 069537ca8..d102f595f 100644 --- a/work-with-reports/InvestigationOfFailure/index.html +++ b/work-with-reports/InvestigationOfFailure/index.html @@ -12,15 +12,15 @@ - - + +
    -

    Investigation of failure

    Set defect type

    ReportPortal provides the possibility for test failure analysis of your runs. The investigation includes setting the appropriate defect type of failed items, posting a defect for them or linking the ID of a defect that is already created in the bug tracking system.

    Using “Make decision” modal, you can choose the real reason of your failure and provide a comment for this fail.

    When a defect is found in a test, the bug triage should be performed and proper defect type should be assigned to it, in order to have accurate test runs statistics. You will be able to change a defect type for a test and mark it as a Product Bug/Automation Bug/System Issue/No Defect at any time.

    The available defect types are described below:

    “To investigate” means that no investigation has been made on this defect yet.

    “Product bug” means that the defect was investigated and a production bug found as the reason for the failure of this test.

    “Automation bug” means that the defect was investigated and the automation test is not correct.

    “System issue” means that the defect was investigated and it turns out that a system-level issue, like an app crash, caused the test to fail.

    “No defect” means that the defect was investigated and was defined to be not a defect.

    Post bug to Bug Tracking System

    ReportPortal allows to connect some popular bug tracking systems with our test automation reporting platform and post a bug to them or link the ticket ID of the already posted defect to the test item in ReportPortal.

    Before posting/linking a bug, make sure that the bug tracking systems are connected to the project on the project settings page. To check it, please, find the user guides below:

    - - +

    Investigation of failure

    Set defect type

    ReportPortal provides the possibility for test failure analysis of your runs. The investigation includes setting the appropriate defect type of failed items, posting a defect for them or linking the ID of a defect that is already created in the bug tracking system.

    Using “Make decision” modal, you can choose the real reason of your failure and provide a comment for this fail.

    When a defect is found in a test, the bug triage should be performed and proper defect type should be assigned to it, in order to have accurate test runs statistics. You will be able to change a defect type for a test and mark it as a Product Bug/Automation Bug/System Issue/No Defect at any time.

    The available defect types are described below:

    “To investigate” means that no investigation has been made on this defect yet.

    “Product bug” means that the defect was investigated and a production bug found as the reason for the failure of this test.

    “Automation bug” means that the defect was investigated and the automation test is not correct.

    “System issue” means that the defect was investigated and it turns out that a system-level issue, like an app crash, caused the test to fail.

    “No defect” means that the defect was investigated and was defined to be not a defect.

    Post bug to Bug Tracking System

    ReportPortal allows to connect some popular bug tracking systems with our test automation reporting platform and post a bug to them or link the ticket ID of the already posted defect to the test item in ReportPortal.

    Before posting/linking a bug, make sure that the bug tracking systems are connected to the project on the project settings page. To check it, please, find the user guides below:

    + + \ No newline at end of file diff --git a/work-with-reports/OperationsUnderLaunches/index.html b/work-with-reports/OperationsUnderLaunches/index.html index 649918f1f..072cc9164 100644 --- a/work-with-reports/OperationsUnderLaunches/index.html +++ b/work-with-reports/OperationsUnderLaunches/index.html @@ -12,14 +12,14 @@ - - + +
    -

    Operations under launches

    There are several ways of how launches could be modified and managed in our test automation reporting dashboard.

    Edit launch attributes and description

    The system allows editing attributes and descriptions for the launch on the "Launches" and "Debug" modes.

    Permission: next users are able to modify launches:

    • Administrator

    • User with PROJECT MANAGER Project Role

    • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

    In order to edit a launch, perform the following steps:

    1. Navigate to the "Launches" page.

    2. Select "Edit" option ('pencil' icon) to the selected launch.

    3. The launch editor will be opened with the following options.

    4. Make the required changes and click the "Save" button.

    Edit test item attributes and description

    The system allows to edit attributes and description for the test items on the "Launches" and "Debug" pages.

    Permission: next users are able to modify test items:

    • Administrator

    • User with PROJECT MANAGER Project Role

    • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

    In order to edit a test item, perform the following steps:

    1. Navigate to the "Launches" page.

    2. Drill down to the test level of any item.

    3. Select the "Edit" option ('pencil' icon) to the selected test item.

    4. The test item editor will be opened with the following options.

    5. Make the required changes and click the "Save" button.

    Merge launches

    Merge launches feature can help you to merge the existing launches into one. +

    Operations under launches

    There are several ways of how launches could be modified and managed in our test automation reporting dashboard.

    Edit launch attributes and description

    The system allows editing attributes and descriptions for the launch on the "Launches" and "Debug" modes.

    Permission: next users are able to modify launches:

    • Administrator

    • User with PROJECT MANAGER Project Role

    • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

    In order to edit a launch, perform the following steps:

    1. Navigate to the "Launches" page.

    2. Select "Edit" option ('pencil' icon) to the selected launch.

    3. The launch editor will be opened with the following options.

    4. Make the required changes and click the "Save" button.

    Edit test item attributes and description

    The system allows to edit attributes and description for the test items on the "Launches" and "Debug" pages.

    Permission: next users are able to modify test items:

    • Administrator

    • User with PROJECT MANAGER Project Role

    • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

    In order to edit a test item, perform the following steps:

    1. Navigate to the "Launches" page.

    2. Drill down to the test level of any item.

    3. Select the "Edit" option ('pencil' icon) to the selected test item.

    4. The test item editor will be opened with the following options.

    5. Make the required changes and click the "Save" button.

    Merge launches

    Merge launches feature can help you to merge the existing launches into one. If your project has a really huge number of regression suites and they cannot be in one particular launch, so, they divided into parts. As soon as they completed, they could be merged in one separate launch to represent this data on dashboards and create reports.

    ReportPortal provides two options for merge: Linear and Deep. The difference in merge options is described below.

    Basically, the merge models distinguished by the way of how the launches elements are collected in a resulting launch as shown on a picture:

    Linear merge

    In case the user selects the "Linear merge" option, the new launch is created. The new launch contains elements of merging launches. Levels of elements stay the same as in origin launches. Status and issues statistics are calculated as the sum of statistics of all merged launches. The origin launches are deleted from the system.

    Deep merge

    In case the user selects the "Deep merge" option, the system creates a new launch and check items with the following conditions simultaneously:

    • test items with the same names
    • test items have the same type (SUITE or TEST)
    • test items are on the same path (number of parents)
    • test items with descendants. @@ -36,7 +36,7 @@ and select "Move to All Launches" from the 'Actions' list.

      Force finish launches

      The system allows finishing launches on the "Launches" and the "Debug" pages manually.

      Permission: Next users are able to stop launches:

      • Administrator

      • User with PROJECT MANAGER Project Role

      • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

      In order to finish a launch that is in progress now, perform the following steps:

      1. Navigate to the "Launches" page.

      2. Select the "Force Finish" option in the context menu on the left hand of the launch name.

      3. The warning popup will be opened.

      4. Click the "Finish" button.

      5. The launch will be stopped and shown in the launches table with the "stopped" tag and the "stopped" description. All the statistics collected by this time will be displayed.

      In order to finish some launches simultaneously those are in progress now, perform the following steps:

      1. Navigate to the "Launches" page.

      2. Select required launches that are in progress by click on their checkboxes

      3. Open 'Actions' list

      4. Select "Force Finish" from the list

      5. The warning popup will be opened.

      6. Confirm the action

      7. All selected launches will be stopped and shown in the launches table with the "stopped" tag and the "stopped" description. All the statistics collected by this time will be displayed.

      Export launches reports

      The system allows exporting launches reports on the "Launches" and the "Debug" modes. You can export the launch report in the following formats: PDF, XML, HTML.

      In order to export a launch, perform the following steps:

      1. Navigate to the "Launches" page.

      2. Select the required format from the "Export" option in the context menu on the left hand of the launch name.

      3. The launch report in the selected format will be opened.

      note

      The export operation works for a separate launch only. No multiple actions for the export of launches.

      Delete launches

      The system allows deleting launches on the "Launches" and "Debug" pages.

      Permission: next users are able to delete launches:

      • Administrator

      • User with PROJECT MANAGER Project Role

      • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

      There are two ways how the launch/es can be deleted

      In order to delete a launch, perform the following steps:

      1. Navigate to the "Launches" page.

      2. Select the "Delete" option in the context menu on the left hand of the launch name.

      3. The warning popup will be opened.

      4. Click the "Delete" button.

      5. The launch will be deleted from ReportPortal. All related content will be deleted: test items, logs, screenshots.

      In order to delete more than one launch simultaneously, perform the following steps:

      1. Navigate to the "Launches" page

      2. Select required launches by click on their checkboxes

      3. Open 'Actions' list

      4. Click 'Delete' option

      5. The warning popup will be opened.

      6. Confirm the action

      7. The launches will be deleted from ReportPortal. All related content will be deleted: test items, logs, screenshots.

      note

      It is impossible to delete launches IN PROGRESS - "Delete" launch option will be disabled.

      Delete test item

      The system allows deleting test items in all levels of launch in the "Launches" and "Debug" pages.

      Permission: Next users are able to delete the test item:

      • Administrator

      • User with PROJECT MANAGER Project Role

      • User with one of Project Role {MEMBER, CUSTOMER} on the project - Launch Owner

      In order to delete a test item, perform the following steps:

      1. Navigate to the "Launches" page

      2. Drill down to the test level of any item

      3. Select the "Delete" option in the context menu next to the selected test item.

      4. The warning popup will be opened.

      5. Click the "Delete" button.

      6. The test item will be deleted from ReportPortal with all related content (logs, screenshots).

      In order to delete some test items simultaneously, perform the following steps:

      1. Navigate to the "Launches" page

      2. Drill down to the test level of any item

      3. Select required test items by click on their checkboxes

      4. If you are on SUITE or TEST view, click 'Delete' button from the header

        If you are on STEP view, open 'Actions' list and select "Delete" option

      5. The warning popup will be opened.

      6. Confirm the action

      7. Test items will be deleted from ReportPortal with all related content (logs, screenshots).

      note

      It is impossible to delete test items in launches IN PROGRESS - "Delete" test item option is disabled for test items in launches IN PROGRESS.

    - - + + \ No newline at end of file diff --git a/work-with-reports/TestCaseId/index.html b/work-with-reports/TestCaseId/index.html index 73a9debc0..74af87bdd 100644 --- a/work-with-reports/TestCaseId/index.html +++ b/work-with-reports/TestCaseId/index.html @@ -12,18 +12,18 @@ - - + +
    -

    Test case ID

    What is it: Test case ID

    If you are using any of the Test Management System (such as TestRail, Jira, ALM, and any others), you have a unique identification of test cases in it.

    Starts from version 5.1 you can report test cases with TestCase ID from your TMS. That gives you an ability to link a source of the test case in TMS and its executions in ReportPortal.

    The benefit of this feature is that you will be able to see the real history of your test cases.

    Definition: Test Case ID: +

    Test case ID

    What is it: Test case ID

    If you are using any of the Test Management System (such as TestRail, Jira, ALM, and any others), you have a unique identification of test cases in it.

    Starts from version 5.1 you can report test cases with TestCase ID from your TMS. That gives you an ability to link a source of the test case in TMS and its executions in ReportPortal.

    The benefit of this feature is that you will be able to see the real history of your test cases.

    Definition: Test Case ID: It is a unique identifier from your source test management system which help ReportPortal.io to identify the uniqueness of a test case

    Where Test Case ID is using?

    Test case id is using for:

    • The history line
    • The history table

    You can find a test case ID in the 'Edit' modal.

    How you can report items with Test case ID?

    You can report test case id via agents. All details you can find in the dev guide https://github.com/reportportal/client-java/wiki/Test-case-ID

    If the test execution has test parameters, a test case ID will be generated on the base of:

    Test case id in ReportPortal = reported 'TestCaseID + all test parameters

    What does happen if you do not report items with Test case ID?

    In case a user doesn't report tests with Test Case ID, the system generates it automatically:

    • Auto-generation based on 'Code reference' and 'Parameters' If users do not report test case ID, it is generated automatically on the base of:

    Test case id in ReportPortal = 'Code reference' + all test parameters

    • Automatically based on Test Execution name, All parents name, Parameters If users do not report Test Case ID and Code reference, then test case ID is generated on the base of:

    Test case id in ReportPortal = Test Case Name + All parents Name (except Launch name) + All parameters

    - - + + \ No newline at end of file diff --git a/work-with-reports/UniqueId/index.html b/work-with-reports/UniqueId/index.html index 4dea58f55..fb0233de5 100644 --- a/work-with-reports/UniqueId/index.html +++ b/work-with-reports/UniqueId/index.html @@ -12,17 +12,17 @@ - - + +
    -

    Unique ID

    (deprecated/ will be replaced by Test Case ID gradually)

    ReportPortal generates an ID automatically for all test items by default. +

    Unique ID

    (deprecated/ will be replaced by Test Case ID gradually)

    ReportPortal generates an ID automatically for all test items by default. The UniqueID generation is based on:

    • A test item name;
    • A project name;
    • A launch name;
    • Names of all parents;
    • All parameters of the item;
    note

    Unique ID deprecated/will be replaced by Test Case ID gradually.

    All this information becomes part of a test item in the form of the MD5 hash. After that, a UID becomes a part of the item. It allows defining the item's uniqueness with no possibility of doubt. ReportPortal uses this functionality in a process of building widgets ( f.e.:'Most failed test cases', 'Flacky tests'), 'Retry' and 'Rerun'and, etc.

    - - + + \ No newline at end of file diff --git a/work-with-reports/ViewLaunches/index.html b/work-with-reports/ViewLaunches/index.html index 3041ad20e..bbbd36db0 100644 --- a/work-with-reports/ViewLaunches/index.html +++ b/work-with-reports/ViewLaunches/index.html @@ -12,14 +12,14 @@ - - + +
    -

    View launches

    Viewing information about all launches

    A launch is an object in our test automation reporting platform, which contains your data for certain execution. Inside the launches, we have test items, structured in the same way as you have it in your automation.

    Launches are present in two modes – the Default mode on the "Launches" tab +

    View launches

    Viewing information about all launches

    A launch is an object in our test automation reporting platform, which contains your data for certain execution. Inside the launches, we have test items, structured in the same way as you have it in your automation.

    Launches are present in two modes – the Default mode on the "Launches" tab and the Debug mode on the "Debug" tab.

    "Debug" tab

    Although both modes share almost the same set of features, the "Debug" mode is considered to be a more private one: it is not visible to the user with the CUSTOMER role and all the filters created there cannot be saved to @@ -50,7 +50,7 @@ than 5 lines. You can expand the log message clicking on the special "Expand" icon.

    You can use a filter to specify the level.

    Also, you can use the logs sorting by time, and filtering logs to find a certain message in logs.

    Stack trace

    On the Log view for the fast redirection to the last 5 error log messages, please click on the tab Stack trace, in this section you can find *5 last error logs".

    Attachments

    In case you are interested in logs with attachments only, check the corresponding checkbox.

    Click on the file in log opens the preview of the attachment.

    The attachments could be rotated on a preview screen if needed.

    ReportPortal provides the possibility of preview for such types of attachments as:

    • 'xml',
    • 'javascript',
    • 'json',
    • 'css',
    • 'php'

    Other types of attachments will be opened in a new browser tab or downloaded.

    The alternative way to view these files is by using the Attachments.

    To view data via the Attachments section, perform the following steps:

    1. Open Log view of launch for test items with attachments available

    2. Click 'Attachments' tab

    3. Select the required file by clicking on its thumbnail.

    4. To expand the area, click the view on the main box.

    Items details

    In the section Items details, you can find information about test case such as:

    • Test Case name
    • Test case status
    • Test case start time
    • Duration and duration fluctuation
    • Description
    • Parameters
    • Attributes
    • Code location (that can be easily copied by a user)

    History of actions

    In this section, you can find all activities which were performed under the test case such as:

    • user changed defect type of test item
    • user posted a comment to the test item
    • user posted a bug to the Bug Tracking System
    • user-added link to the existing in Bug Tracking System bug.
    • analyzer changed defect type of test item based on the item (where "item" is a link to a log view of an item which has been chosen by the analyzer as the most relevant result)
    • analyzer posted a comment to the test item
    • analyzer posted a bug to the Bug Tracking System or added a link to the existing in Bug Tracking System issue.
    • pattern analysis add a found pattern

    History of actions is not shown if nobody performed actions with the item. By default, you will see the last action in one line.

    Markdown mode on Logs view

    You can view logs in Markdown mode or in the Console view.

    To enable Markdown mode, please perform actions:

    • Click on "M" button on the log level

    To disable Markdown mode, please perform actions:

    • Click on "M" button on log level one more time

    The same logic applies to the Console view.

    Log view for containers (for a launch or a suite)

    A user can report logs not only to the test execution but also to containers:

    • Launch
    • Suite

    If user want to view attached logs:

    • Login ReportPortal
    • Click on a launch name, or a suite name
    • Click on Log tab

    Nested Steps

    Retried test case (retry)

    How can I report retry items In case you implemented a retry logic for your tests in a test framework, ReportPortal will reflect it by adding a special retry structure. If there were a few invocations of the one test case, all these invocations will be shown as the one test case in ReportPortal.

    On a long view, you can see all logs and all information about all invocations. But in statistics and auto-analysis the ReportPortal will take into account only the last invocation. So that launch statistics will be more accurate.

    The defect type can be set for the last invocation only.

    On a Launch view, you can see a label, which means that the launch includes retries.

    On a step view, you can see the number of invocations and stack trace of each invocation.

    On a log view, you can see the number of invocations and logs, attachments of each invocation.

    - - + + \ No newline at end of file