allure-framework / allure-python

Allure integrations for Python test frameworks
https://allurereport.org/
Apache License 2.0
713 stars 233 forks source link

The "excluded" and "mode" parameters of the allure.dynamic.parameter function are ignored for the pytest parameters #822

Open RealMaxos opened 3 weeks ago

RealMaxos commented 3 weeks ago

[//]: # ( . Note: for support questions, please use Stackoverflow or Gitter. . This repository's issues are reserved for feature requests and bug reports. . . In case of any problems with Allure Jenkins plugin please use the following repository . to create an issue: https://github.com/jenkinsci/allure-plugin/issues . . Make sure you have a clear name for your issue. The name should start with a capital . letter and no dot is required in the end of the sentence. An example of good issue names: . . - The report is broken in IE11 . - Add an ability to disable default plugins . - Support emoji in test descriptions )

I'm submitting a ...

What is the current behavior?

The "excluded" and "mode" parameters of the allure.dynamic.parameter function do not affect the display of the pytest parameter in the TestOps report.

If the current behavior is a bug, please provide the steps to reproduce and if possible a minimal demo of the problem

My test looks something like this:

@pytest.mark.parametrize('login, password', [('admin', 'secret')])
def test_authorization(login, password):
    allure.dynamic.parameter('password', password, mode=allure.parameter_mode.MASKED)
    ...

In this case, the parameters of the test function are passed using pytest.mark.parametrize.

The output of the report file looks like this:

{"name": "test_authorization[admin-secret]", "status": "passed", "parameters": [{"name": "login", "value": "'admin'"}, {"name": "password", "value": "'secret'"}], "start": 1718844940592, "stop": 1718844940592, "uuid": "1f59becc-6d3a-4be3-be5b-0ffbd257ec5b", "historyId": "36ae0f9494e1ff5a9b8153a55ab15428", "testCaseId": "2334cf5fc2f37123d71eab12c56f1a15", "fullName": "test_main#test_authorization", "labels": [{"name": "suite", "value": "test_main"}, {"name": "host", "value": "MYHOST"}, {"name": "thread", "value": "12440-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "test_main"}]}

What is the expected behavior?

The value of the "password" parameter is expected to be masked in the report.

What is the motivation / use case for changing the behavior?


Please tell us about your environment:

Other information

The solution method:

Change the method of the AllureListener class to allure_pytest/listener.py

Current code:

@allure_commons.hookimpl
def add_parameter(self, name, value, excluded, mode: ParameterMode):
    test_result: TestResult = self.allure_logger.get_test(None)
    existing_param = next(filter(lambda x: x.name == name, test_result.parameters), None)
    if existing_param:
        existing_param.value = represent(value)
    else:
        test_result.parameters.append(
            Parameter(
                name=name,
                value=represent(value),
                excluded=excluded or None,
                mode=mode.value if mode else None
            )
        )

Proposal for a change:

@allure_commons.hookimpl
def add_parameter(self, name, value, excluded, mode: ParameterMode):
    test_result: TestResult = self.allure_logger.get_test(None)
    existing_param = next(filter(lambda x: x.name == name, test_result.parameters), None)
    if existing_param:
        existing_param.value = represent(value)
        existing_param.excluded = excluded or None
        existing_param.mode = mode.value if mode else None
    else:
        test_result.parameters.append(
            Parameter(
                name=name,
                value=represent(value),
                excluded=excluded or None,
                mode=mode.value if mode else None
            )
        )

With this implementation, the result file will look like this:

{"name": "test_authorization[admin-secret]", "status": "passed", "parameters": [{"name": "login", "value": "'admin'"}, {"name": "password", "value": "'secret'", "mode": "masked"}], "start": 1718845042635, "stop": 1718845042635, "uuid": "88fa5ba0-faf1-40b0-a380-32c51a5f8907", "historyId": "36ae0f9494e1ff5a9b8153a55ab15428", "testCaseId": "2334cf5fc2f37123d71eab12c56f1a15", "fullName": "test_main#test_authorization", "labels": [{"name": "suite", "value": "test_main"}, {"name": "host", "value": "MYHOST"}, {"name": "thread", "value": "4536-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "test_main"}]}

[//]: # ( . e.g. detailed explanation, stacktraces, related issues, suggestions . how to fix, links for us to have more context, eg. Stackoverflow, Gitter etc )