Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 1 addition & 16 deletions allure-pytest-bdd/features/background.feature
Original file line number Diff line number Diff line change
@@ -1,16 +1 @@
Feature: Scenario
Scenario: Default labels
Given feature file aaa with content:
"""
Feature: Scenario example
Background:
Given passed step1
Scenario: Scenario example
Given passed step
When failed step
Then passed step
"""
And dummy steps in conftest.py
And test file with "Scenario example" scenario in example
When run pytest-bdd with allure
Then it has result for example scenario
# ToDo ...
60 changes: 46 additions & 14 deletions allure-pytest-bdd/features/outline.feature
Original file line number Diff line number Diff line change
@@ -1,19 +1,51 @@
Feature: Scenario
Scenario: Default labels
Given feature file aaa with content:
Feature: Scenario outline
Scenario: Scenario outline
Given example.feature with content:
"""
Feature: Scenario example
Scenario Outline: Scenario example
Given passed step
When <status> step
Then passed step
Feature: Scenario outline
Scenario Outline: Outline example
Given <first> step
When do nothing
Then step with <second> param

Examples:
| status |
| passed |
| failed |
| first | second |
| Alpha | 1 |
| Bravo | 2 |
"""
And example_test.py with content:
"""
from pytest_bdd import scenario
from pytest_bdd import given, then, when

@given("<first> step")
def given_step(first):
pass

@when("do nothing")
def nope_step():
pass

@then("step with <second> param")
def then_step(second):
pass

@scenario("example.feature", "Outline example")
def test_scenario_outline_example():
pass
"""
And dummy steps in conftest.py
And test file with "Scenario example" scenario in example
When run pytest-bdd with allure
Then it has result for example scenario

Then allure report has result for "Outline example" scenario
Then this scenario has parameter "first" with value "Alpha"
Then this scenario has parameter "second" with value "1"
Then this scenario contains "Given <Alpha> step" step
Then this scenario contains "Then step with <1> param" step

Then allure report has result for "Outline example" scenario
Then this scenario has parameter "first" with value "Bravo"
Then this scenario has parameter "second" with value "2"
Then this scenario contains "Given <Bravo> step" step
Then this scenario contains "Then step with <2> param" step


33 changes: 25 additions & 8 deletions allure-pytest-bdd/features/scenario.feature
Original file line number Diff line number Diff line change
@@ -1,14 +1,31 @@
Feature: Scenario
Scenario: Default labels
Given feature file aaa with content:
Scenario: Simple passed scenario
Given example.feature with content:
"""
Feature: Scenario example
Scenario: Scenario example
Feature: Scenario
Scenario: Simple passed example
Given passed step
When failed step
When passed step
Then passed step
"""
And dummy steps in conftest.py
And test file with "Scenario example" scenario in example
And example_test.py with content:
"""
from pytest_bdd import scenario
from pytest_bdd import given, then, when

@given("passed step")
def given_passed_step():
pass

@when("passed step")
@then("passed step")
def passed_step():
pass

@scenario("example.feature", "Simple passed example")
def test_scenario_example():
pass
"""
When run pytest-bdd with allure
Then it has result for example scenario
Then allure report has result for "Simple passed example" scenario
Then this scenario has passed status
7 changes: 5 additions & 2 deletions allure-pytest-bdd/src/pytest_bdd_listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from allure_commons.model2 import StatusDetails
from functools import partial
from allure_commons.lifecycle import AllureLifecycle
from .utils import get_full_name
from .utils import get_full_name, get_name, get_params


class PytestBDDListener(object):
Expand All @@ -36,14 +36,17 @@ def _scenario_finalizer(self, scenario):
def pytest_bdd_before_scenario(self, request, feature, scenario):
uuid = get_uuid(request.node.nodeid)
full_name = get_full_name(feature, scenario)
name = get_name(request.node, scenario)
with self.lifecycle.schedule_test_case(uuid=uuid) as test_result:
test_result.fullName = full_name
test_result.name = name
test_result.start = now()
test_result.labels.append(Label(name=LabelType.HOST, value=self.host))
test_result.labels.append(Label(name=LabelType.THREAD, value=self.thread))
test_result.labels.append(Label(name=LabelType.FRAMEWORK, value="pytest-bdd"))
test_result.labels.append(Label(name=LabelType.LANGUAGE, value=platform_label()))
test_result.labels.append(Label(name=LabelType.FEATURE, value=feature.name))
test_result.parameters = get_params(request.node)

finalizer = partial(self._scenario_finalizer, scenario)
request.node.addfinalizer(finalizer)
Expand All @@ -59,7 +62,7 @@ def pytest_bdd_before_step_call(self, request, feature, scenario, step, step_fun
parent_uuid = get_uuid(request.node.nodeid)
uuid = get_uuid(str(id(step)))
with self.lifecycle.start_step(parent_uuid=parent_uuid, uuid=uuid) as step_result:
step_result.name = get_step_name(step)
step_result.name = get_step_name(request.node, step)

@pytest.hookimpl
def pytest_bdd_after_step(self, request, feature, scenario, step, step_func, step_func_args):
Expand Down
23 changes: 21 additions & 2 deletions allure-pytest-bdd/src/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,24 @@
from allure_commons.utils import md5
from allure_commons.model2 import StatusDetails
from allure_commons.model2 import Status
from allure_commons.model2 import Parameter
from allure_commons.utils import format_exception


def get_step_name(step):
return "{step_keyword} {step_name}".format(step_keyword=step.keyword, step_name=step.name)
def get_step_name(node, step):
name = "{step_keyword} {step_name}".format(step_keyword=step.keyword, step_name=step.name)
if hasattr(node, 'callspec'):
for key, value in node.callspec.params.items():
name = name.replace("<{key}>".format(key=key), "<{{{key}}}>".format(key=key))
name = name.format(**node.callspec.params)
return name


def get_name(node, scenario):
if hasattr(node, 'callspec'):
parts = node.nodeid.rsplit("[")
return "{name} [{params}".format(name=scenario.name, params=parts[-1])
return scenario.name


def get_full_name(feature, scenario):
Expand All @@ -31,3 +44,9 @@ def get_pytest_report_status(pytest_report):
for pytest_status, status in zip(pytest_statuses, statuses):
if getattr(pytest_report, pytest_status):
return status


def get_params(node):
if hasattr(node, 'callspec'):
params = node.callspec.params
return [Parameter(name=name, value=value) for name, value in params.items()]
30 changes: 25 additions & 5 deletions allure-pytest-bdd/test/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import allure_commons
from allure_commons_test.report import AllureReport
from allure_commons.logger import AllureFileLogger
from .pytest_bdd_steps import * # noqa F401 F403
from .report_steps import * # noqa F401 F403
from .steps import * # noqa F401 F403
from pytest_bdd import given, when, parsers


@contextmanager
Expand All @@ -32,12 +32,32 @@ def __init__(self, testdir, request):
def run_with_allure(self):
logger = AllureFileLogger(self.testdir.tmpdir.strpath)
with fake_logger("allure_pytest_bdd.plugin.AllureFileLogger", logger):
a = self.testdir.runpytest("-s", "-v", "--alluredir", self.testdir.tmpdir)
print(a.stdout.lines)
print(a.stderr.lines)
self.testdir.runpytest("-s", "-v", "--alluredir", self.testdir.tmpdir)
# print(a.stdout.lines)
# print(a.stderr.lines)
self.allure_report = AllureReport(self.testdir.tmpdir.strpath)


@pytest.fixture
def allured_testdir(testdir, request):
return AlluredTestdir(testdir, request)


@pytest.fixture
def context():
return dict()


@pytest.fixture
def allure_report(allured_testdir, context):
return allured_testdir.allure_report


@given(parsers.re("(?P<name>\\w+)(?P<extension>\\.\\w+) with content:(?:\n)(?P<content>[\\S|\\s]*)"))
def feature_definition(name, extension, content, testdir):
testdir.makefile(extension, **dict([(name, content)]))


@when("run pytest-bdd with allure")
def run(allured_testdir):
allured_testdir.run_with_allure()
58 changes: 0 additions & 58 deletions allure-pytest-bdd/test/dummy_steps.py

This file was deleted.

6 changes: 6 additions & 0 deletions allure-pytest-bdd/test/outline_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from pytest_bdd import scenario


@scenario("../features/outline.feature", "Scenario outline")
def test_scenario_outline():
pass
33 changes: 0 additions & 33 deletions allure-pytest-bdd/test/pytest_bdd_steps.py

This file was deleted.

13 changes: 0 additions & 13 deletions allure-pytest-bdd/test/pytest_bdd_test.py

This file was deleted.

7 changes: 0 additions & 7 deletions allure-pytest-bdd/test/report_steps.py

This file was deleted.

6 changes: 6 additions & 0 deletions allure-pytest-bdd/test/scenario_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from pytest_bdd import scenario


@scenario("../features/scenario.feature", "Simple passed scenario")
def test_simple_passed_scenario():
pass
Loading