allure-framework / allure-framework/allure-python
Implement Allure listeners
- Dominant language
- Python
- Stars
- 814
- Forks
- 260
- PR merge metrics
- No merged PRs in 30d
Description
### Context
People often need to somehow post-process Allure results according to their needs. Examples would be:
- filtering data they don't want in the report (parameters/labels/fixtures)
- customizing the default names, existing parameters, etc
- sending the results somewhere on the fly
Many such requirements are user-specific, and there is no point in implementing them here. Often, it's not even possible because many such requirements contradict each other.
Instead, it would be reasonable to have an easy-to-use extension mechanism that users may utilize for their purposes.
### Existing solution
Currently, users can register custom plugins in `allure_commons.plugin_manager`. For example:
```python
from allure_commons import hookimpl
from allure_commons import plugin_manager
class MyListener:
@hookimpl(tryfirst=True)
def report_result(self, result):
# post-process the result here
...
def pytest_configure(config):
def cleanup():
name = plugin_manager.get_name(listener)
plugin_manager.unregister(name=name)
listener = MyListener()
plugin_manager.register(listener)
config.add_cleanup(cleanup)
```
While covering many cases, the solution has some drawbacks:
- Verbose API:
- `tryfirst` is necessary to make sure the hook implementation is called after the default logger's one.
- The cleanup needs to be added separately.
- Limited hook spec:
- No steps and fixtures post-processing (only at the test result level, which complicates the processing).
- Limited support for attachments post-processing.
- No hooks for pre-processing.
### Implementation
Lifecycle listeners can be implemented with [pluggy](https://pluggy.readthedocs.io/en/stable/) as a plugin manager + hook specs + user-friendly API on top of this. We already use pluggy to implement the Allure API, so it's just a matter of defining one or more hook specs, calling them via the existing `allure_commons.plugin_manager` or a separate one.
Contributor guide
Research direction
Start by reviewing the existing allure_commons.plugin_manager and the pluggy-based Allure API implementation. Define the listener scope and lifecycle around the hook specs and user-facing API described here; done means users can register listeners without manual ordering or cleanup and can process results, steps, fixtures, and attachments before or after processing.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- testing, tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100