Skip to main content

pytest-glamor-allure

pytest plugin extending allure behavior


codecov

PyPI - Python Version PyPI PyPI - Status Downloads PyPI Downloads Ruff

  1. Why has it been created?
  2. What is it?
  3. Why is it named "glamor"?
  4. How to install?
  5. What does it can?
  6. Pleasant bonus 🎁
  7. How can I help?

Why has it been created?

Just because allure-python plugin accepts PRs very slowly. Sad but true.

I want to inject more functionality into it. That's why I've decided to create this plugin.

What is it?

As been said it is pytest plugin (tnx captain 😄). Consider this plugin just as some extension for allure-pytest.

Hopefully, they'll see this code and add some of this functionality later.

Why is it named "glamor"?

Because "glamor" is a synonym for "allure". Glamor does the same thing as allure-pytest does but a little more.

The main idea is to just replace imports in you project: instead of import allure you type import glamor as allure and everything works as before.

How to install?

pip install pytest-glamor-allure

That's it.

What does it can?

It's the most interesting part of the ReadMe.

Fancy names for setups and teardowns

allure-python provides possibility to set title for fixture with @allure.title decorator.

But there is no chance to set different titles for setup and teardown. Glamor does can this!

import pytest
import glamor as allure

@pytest.fixture
@allure.title.setup('Fancy setup name')
@allure.title.teardown('Fancy teardown name')
def fixture():
    yield

@allure.title('Test Title')
def test_test(fixture):
    with allure.step('test step'):
        pass

image

And moreover. You can dynamically change setup and teardown titles for fixtures.

Only one restriction: dynamic hook must be used inside the fixture's body.

import pytest
import glamor as allure


@pytest.fixture
def fixture():
    yield
    allure.dynamic.title.setup('Fancy dynamic setup name')
    allure.dynamic.title.teardown('Fancy dynamic teardown name')


@allure.title('Test Title')
def test_test(fixture):
    with allure.step('test step'):
        pass

image

Hide setup and teardown

Have you ever wanted to conceal setup and/or teardown from 'allure' report?

Well, now you can.

import pytest
import glamor as allure


@pytest.fixture
@allure.title.setup(hidden=True)
@allure.title.teardown('Teardown ONE')
def fixture():
    yield


@pytest.fixture
@allure.title.setup('Setup TWO')
def fixture2():
    yield

    if True:
        allure.dynamic.title.teardown(hidden=True)


@allure.title('Test Title')
def test_test(fixture, fixture2):
    with allure.step('test step'):
        pass

image

But! If any exception (including Skipped) is raised, then hidden setups and teardowns are shown forcefully.

import pytest
import glamor as allure


@pytest.fixture
@allure.title.setup('Setup is displayed in case of failure', hidden=True)
@allure.title.teardown('Teardown ONE')
def fixture():
    with allure.step('fail step'):
        assert False, 'some exception in setup'
    yield


@pytest.fixture
@allure.title.setup('Setup TWO')
def fixture2():
    yield

    if True:
        allure.dynamic.title.teardown(hidden=True)
    pytest.skip('we decided to skip')


@allure.title('Test Title')
def test_test(fixture2, fixture):
    with allure.step('test step'):
        pass

image

Display 'scope' and 'autouse' fixture parameters in fixture title

Sometimes it is useful to know which scope this fixture is, and was it called manually or autoused.

Just call the function once per runtime include_scope_in_title before pytest starts execution of any hook (during modules initialization).

import pytest
import glamor as allure

allure.include_scope_in_title('before', autouse=True)


@pytest.fixture(scope='session', autouse=True)
@allure.title.setup('Fancy setup name')
def fixture():
    yield


@pytest.fixture
@allure.title.setup('Setup TWO')
def fixture2():
    yield


@allure.title('Test Title')
def test_test(fixture2):
    with allure.step('test step'):
        pass

image

The big letter is the first letter of the scope name (one of 'function', 'class', 'module', 'package', 'session'). The lower letter 'a' says that fixture was autoused.

If you want to put this information to the end of the title, then just call the function as allure.include_scope_in_title('after', autouse=True) and you get:

image

No more '::0' in teardown title

Have you noticed '::0' in raw teardown titles? No? That's because glamor strips such ending if fixture has not more than one finalizer.

Add allure.step titles into logging

Have you ever tried to understand when the particular allure step started looking at tests' logs? Of course, you have!

With "glamor" you can register you own logger, which is considered to print steps' titles into output.

import logging
import sys
import glamor as allure


# Create logger
logger = logging.getLogger('MyLogger')
logger.setLevel(logging.INFO)

fmt = logging.Formatter('[%(levelname)s] %(message)s')

handler = logging.StreamHandler(stream=sys.stdout)
handler.setLevel(logging.INFO)
handler.setFormatter(fmt)

logger.addHandler(handler)

# Register logger in allure
allure.logging_allure_steps(logger)


# Execute tests' code
logger.info("start message")

with allure.step("step message"):
    pass

logger.error("end message")
[INFO] start message
[STEP] step message
[ERROR] end message

logging_allure_steps should be called only once - during modules initialization. But who am I to restrict you?

If you need you can turn off this behavior by calling the function with None instead of logging.Logger instance.

What else?

import glamor as allure

allure.listener  # access to AllureListener plugin instance
allure.reporter  # alias for allure.listener.allure_logger
allure.pytest_config  # access to pytest.Config instance. alias for allure.listener.config

Also via 'glamor' module you get direct access to many objects from:

  • allure_commons
  • allure_commons._allure
  • allure_commons.model2
  • allure_commons.types
  • allure_commons.utils
  • allure_pytest.utils

Pleasant bonus 🎁

Use import pitest as pytest instead of import pytest and get direct access to a bunch of objects from pytest and _pytest modules.

How can I help?

Your contribution is highly appreciated. Please read CONTRIBUTING.md before you start.

Metadata

Release files for pytest-glamor-allure 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-glamor-allure 1.0.1
File Size Uploaded Provenance Actions
pytest_glamor_allure-1.0.1.tar.gz 11.8 kB Without provenance Details for pytest_glamor_allure-1.0.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pytest-glamor-allure 1.0.1
File Interpreter ABI Platform Actions
pytest_glamor_allure-1.0.1-py3-none-any.whl Python 3 none any Details for pytest_glamor_allure-1.0.1-py3-none-any.whl

Total release size: 25.0 kB

Release files / pytest_glamor_allure-1.0.1.tar.gz

Download URL pytest_glamor_allure-1.0.1.tar.gz
Size 11.8 kB
Tags Source
SHA-256 checksum
How to use checksums
1c542890caeec06434485fd7d9a7564dd5977b15b10fd53ed3365c21d552c42e
BLAKE2b-256 checksum
How to use checksums
272027c724fe26eb01e81b611104e8c6262b85dc631d314898ea6c8475423488
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / pytest_glamor_allure-1.0.1-py3-none-any.whl

Download URL pytest_glamor_allure-1.0.1-py3-none-any.whl
Size 13.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c1917dcdc7f7d14cddbcd8e0f7156e3958d3cbcd8ff5f7038c37c4ca657bf678
BLAKE2b-256 checksum
How to use checksums
4b4370c90b044314922957cbc8e96656643ad8c905ba1e167391e6467badd971
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for pytest-glamor-allure 1.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page