From 4d889205f80a65b33b10e3fe52252bc39fe41f4b Mon Sep 17 00:00:00 2001 From: Denis Bautin Date: Fri, 8 Jan 2021 19:25:17 +0500 Subject: [PATCH 1/7] Add to coftest.py reference on pytester plugin --- allure-pytest-bdd/test/conftest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/allure-pytest-bdd/test/conftest.py b/allure-pytest-bdd/test/conftest.py index b925ac4d..7a9f79a8 100644 --- a/allure-pytest-bdd/test/conftest.py +++ b/allure-pytest-bdd/test/conftest.py @@ -8,6 +8,9 @@ from pytest_bdd import given, when, parsers +pytest_plugins = "pytester" + + @contextmanager def fake_logger(path, logger): blocked_plugins = [] From 0719d641a1ed47a789ed2bcb2ce94e73029a93cc Mon Sep 17 00:00:00 2001 From: Denis Bautin Date: Fri, 8 Jan 2021 19:28:21 +0500 Subject: [PATCH 2/7] Move feature directory to allure-pytest-bdd\test\ --- allure-pytest-bdd/{ => test}/features/background.feature | 0 allure-pytest-bdd/{ => test}/features/outline.feature | 0 allure-pytest-bdd/{ => test}/features/scenario.feature | 0 allure-pytest-bdd/test/outline_test.py | 2 +- allure-pytest-bdd/test/scenario_test.py | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) rename allure-pytest-bdd/{ => test}/features/background.feature (100%) rename allure-pytest-bdd/{ => test}/features/outline.feature (100%) rename allure-pytest-bdd/{ => test}/features/scenario.feature (100%) diff --git a/allure-pytest-bdd/features/background.feature b/allure-pytest-bdd/test/features/background.feature similarity index 100% rename from allure-pytest-bdd/features/background.feature rename to allure-pytest-bdd/test/features/background.feature diff --git a/allure-pytest-bdd/features/outline.feature b/allure-pytest-bdd/test/features/outline.feature similarity index 100% rename from allure-pytest-bdd/features/outline.feature rename to allure-pytest-bdd/test/features/outline.feature diff --git a/allure-pytest-bdd/features/scenario.feature b/allure-pytest-bdd/test/features/scenario.feature similarity index 100% rename from allure-pytest-bdd/features/scenario.feature rename to allure-pytest-bdd/test/features/scenario.feature diff --git a/allure-pytest-bdd/test/outline_test.py b/allure-pytest-bdd/test/outline_test.py index d176148a..43361d3b 100644 --- a/allure-pytest-bdd/test/outline_test.py +++ b/allure-pytest-bdd/test/outline_test.py @@ -1,6 +1,6 @@ from pytest_bdd import scenario -@scenario("../features/outline.feature", "Scenario outline") +@scenario("features/outline.feature", "Scenario outline") def test_scenario_outline(): pass diff --git a/allure-pytest-bdd/test/scenario_test.py b/allure-pytest-bdd/test/scenario_test.py index 18362409..b8a19582 100644 --- a/allure-pytest-bdd/test/scenario_test.py +++ b/allure-pytest-bdd/test/scenario_test.py @@ -1,6 +1,6 @@ from pytest_bdd import scenario -@scenario("../features/scenario.feature", "Simple passed scenario") +@scenario("features/scenario.feature", "Simple passed scenario") def test_simple_passed_scenario(): pass From cd590eabd785a0bcbe70dafa81f94676a4bf6f17 Mon Sep 17 00:00:00 2001 From: Denis Bautin Date: Tue, 12 Jan 2021 00:25:17 +0500 Subject: [PATCH 3/7] Create directory tests and move outline_test.py, scenario_test.py to there --- allure-pytest-bdd/test/{ => tests}/outline_test.py | 2 +- allure-pytest-bdd/test/{ => tests}/scenario_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename allure-pytest-bdd/test/{ => tests}/outline_test.py (54%) rename allure-pytest-bdd/test/{ => tests}/scenario_test.py (53%) diff --git a/allure-pytest-bdd/test/outline_test.py b/allure-pytest-bdd/test/tests/outline_test.py similarity index 54% rename from allure-pytest-bdd/test/outline_test.py rename to allure-pytest-bdd/test/tests/outline_test.py index 43361d3b..d176148a 100644 --- a/allure-pytest-bdd/test/outline_test.py +++ b/allure-pytest-bdd/test/tests/outline_test.py @@ -1,6 +1,6 @@ from pytest_bdd import scenario -@scenario("features/outline.feature", "Scenario outline") +@scenario("../features/outline.feature", "Scenario outline") def test_scenario_outline(): pass diff --git a/allure-pytest-bdd/test/scenario_test.py b/allure-pytest-bdd/test/tests/scenario_test.py similarity index 53% rename from allure-pytest-bdd/test/scenario_test.py rename to allure-pytest-bdd/test/tests/scenario_test.py index b8a19582..18362409 100644 --- a/allure-pytest-bdd/test/scenario_test.py +++ b/allure-pytest-bdd/test/tests/scenario_test.py @@ -1,6 +1,6 @@ from pytest_bdd import scenario -@scenario("features/scenario.feature", "Simple passed scenario") +@scenario("../features/scenario.feature", "Simple passed scenario") def test_simple_passed_scenario(): pass From aec2b58ae26cdd6d1122f083d5476bad0e8e867e Mon Sep 17 00:00:00 2001 From: Denis Bautin Date: Tue, 12 Jan 2021 00:28:31 +0500 Subject: [PATCH 4/7] Create basis for PyFileBuilder, and acceptance.feature --- allure-pytest-bdd/test/acceptance.feature | 14 ++++++++++++++ allure-pytest-bdd/test/py_file_builder.py | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 allure-pytest-bdd/test/acceptance.feature create mode 100644 allure-pytest-bdd/test/py_file_builder.py diff --git a/allure-pytest-bdd/test/acceptance.feature b/allure-pytest-bdd/test/acceptance.feature new file mode 100644 index 00000000..06a9330e --- /dev/null +++ b/allure-pytest-bdd/test/acceptance.feature @@ -0,0 +1,14 @@ +# Created by denis at 11.01.2021 +Feature: test + # Enter feature description here + + Scenario: scenario + Given py file with imports: pytest, pytest_bdd, allure + + And func: + """ + @given("given_step") + def my_func(): + allure.attach("blah", ...) + raise Exception("message") + """ diff --git a/allure-pytest-bdd/test/py_file_builder.py b/allure-pytest-bdd/test/py_file_builder.py new file mode 100644 index 00000000..207f083d --- /dev/null +++ b/allure-pytest-bdd/test/py_file_builder.py @@ -0,0 +1,16 @@ + +class PyFileBuilder: + + def __init__(self): + self._import_line = None + self._file_funcs = [] + + def add_imports(self, *modules_names): + """ Ex: module_names = ("pytest", ...)""" + pass + + def add_func(self, str_func): + pass + + def create_file_content(self): + pass From 7e396b50aa5769daffede0976683e111509c02f2 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Tue, 12 Jan 2021 02:37:17 +0500 Subject: [PATCH 5/7] Make a PyFileBuilder class and add a tests --- allure-pytest-bdd/test/py_file_builder.py | 24 +++-- .../test/py_file_builder_test.py | 94 +++++++++++++++++++ 2 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 allure-pytest-bdd/test/py_file_builder_test.py diff --git a/allure-pytest-bdd/test/py_file_builder.py b/allure-pytest-bdd/test/py_file_builder.py index 207f083d..2f1cd00a 100644 --- a/allure-pytest-bdd/test/py_file_builder.py +++ b/allure-pytest-bdd/test/py_file_builder.py @@ -1,16 +1,26 @@ - class PyFileBuilder: - def __init__(self): + def __init__(self, name): self._import_line = None self._file_funcs = [] + self.name = name def add_imports(self, *modules_names): - """ Ex: module_names = ("pytest", ...)""" - pass + import_list = [] + + for module in modules_names: + import_list.append("import " + module) + + if len(import_list) != 0: + self._import_line = "\n".join(import_list) def add_func(self, str_func): - pass + self._file_funcs.append(str_func) + + def get_content(self): + content = "\n\n\n".join(self._file_funcs) + + if self._import_line is not None: + content = self._import_line + "\n\n\n" + content - def create_file_content(self): - pass + return content diff --git a/allure-pytest-bdd/test/py_file_builder_test.py b/allure-pytest-bdd/test/py_file_builder_test.py new file mode 100644 index 00000000..9be371dd --- /dev/null +++ b/allure-pytest-bdd/test/py_file_builder_test.py @@ -0,0 +1,94 @@ +from .py_file_builder import PyFileBuilder +import pytest + + +def test_common_func(): + imports = ["pytest", "pytest_bdd", "allure"] + funcs = [ + """@given("given_step") +def given_func(): + allure.attach("blah", ...) + raise Exception("message")""", + """@when("when_step") +def when_func(): + allure.attach("blah", ...) + raise Exception("message")""", + """@then("then_step") +def then_func(): + allure.attach("blah", ...) + raise Exception("message")""" + ] + + expected_answer = """import pytest +import pytest_bdd +import allure + + +@given("given_step") +def given_func(): + allure.attach("blah", ...) + raise Exception("message") + + +@when("when_step") +def when_func(): + allure.attach("blah", ...) + raise Exception("message") + + +@then("then_step") +def then_func(): + allure.attach("blah", ...) + raise Exception("message")""" + + file_builder = PyFileBuilder("test") + + file_builder.add_imports(*imports) + + for func in funcs: + file_builder.add_func(func) + + assert file_builder.get_content() == expected_answer + + +def test_without_imports_func(): + funcs = [ + """@given("given_step") +def given_func(): + allure.attach("blah", ...) + raise Exception("message")""", + """@when("when_step") +def when_func(): + allure.attach("blah", ...) + raise Exception("message")""", + """@then("then_step") +def then_func(): + allure.attach("blah", ...) + raise Exception("message")""" + ] + + expected_answer = """@given("given_step") +def given_func(): + allure.attach("blah", ...) + raise Exception("message") + + +@when("when_step") +def when_func(): + allure.attach("blah", ...) + raise Exception("message") + + +@then("then_step") +def then_func(): + allure.attach("blah", ...) + raise Exception("message")""" + + file_builder = PyFileBuilder("test") + + file_builder.add_imports() + + for func in funcs: + file_builder.add_func(func) + + assert file_builder.get_content() == expected_answer From aa1f176bf7497e5d91ee14ab33e559345d876e0f Mon Sep 17 00:00:00 2001 From: Ruslan Date: Tue, 12 Jan 2021 03:02:04 +0500 Subject: [PATCH 6/7] Add a valid reactions on unexpected cases and expand tests --- allure-pytest-bdd/test/py_file_builder.py | 3 ++ .../test/py_file_builder_test.py | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/allure-pytest-bdd/test/py_file_builder.py b/allure-pytest-bdd/test/py_file_builder.py index 2f1cd00a..570bedd8 100644 --- a/allure-pytest-bdd/test/py_file_builder.py +++ b/allure-pytest-bdd/test/py_file_builder.py @@ -18,6 +18,9 @@ def add_func(self, str_func): self._file_funcs.append(str_func) def get_content(self): + if len(self._file_funcs) == 0: + raise Exception("There are no functions in this file") + content = "\n\n\n".join(self._file_funcs) if self._import_line is not None: diff --git a/allure-pytest-bdd/test/py_file_builder_test.py b/allure-pytest-bdd/test/py_file_builder_test.py index 9be371dd..a2154939 100644 --- a/allure-pytest-bdd/test/py_file_builder_test.py +++ b/allure-pytest-bdd/test/py_file_builder_test.py @@ -92,3 +92,55 @@ def then_func(): file_builder.add_func(func) assert file_builder.get_content() == expected_answer + + +def test_empty_func_str(): + funcs = [ + "", + """@when("when_step") +def when_func(): + allure.attach("blah", ...) + raise Exception("message")""", + """@then("then_step") +def then_func(): + allure.attach("blah", ...) + raise Exception("message")""" + ] + + expected_answer = """ + + +@when("when_step") +def when_func(): + allure.attach("blah", ...) + raise Exception("message") + + +@then("then_step") +def then_func(): + allure.attach("blah", ...) + raise Exception("message")""" + + file_builder = PyFileBuilder("test") + + file_builder.add_imports() + + for func in funcs: + file_builder.add_func(func) + + assert file_builder.get_content() == expected_answer + + +def test_have_no_added_funcs(): + imports = ["pytest", "pytest_bdd", "allure"] + funcs = [] + + file_builder = PyFileBuilder("test") + + file_builder.add_imports(*imports) + + for func in funcs: + file_builder.add_func(func) + + with pytest.raises(Exception): + file_builder.get_content() From c802bb90382162da577197d53313e01a43b23815 Mon Sep 17 00:00:00 2001 From: Denis Bautin Date: Tue, 12 Jan 2021 04:39:45 +0500 Subject: [PATCH 7/7] Add common steps for testing Update acceptance.feature --- allure-pytest-bdd/test/acceptance.feature | 10 +++-- allure-pytest-bdd/test/conftest.py | 49 ++++++++++++++++++++++- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/allure-pytest-bdd/test/acceptance.feature b/allure-pytest-bdd/test/acceptance.feature index 06a9330e..382af5e1 100644 --- a/allure-pytest-bdd/test/acceptance.feature +++ b/allure-pytest-bdd/test/acceptance.feature @@ -3,12 +3,14 @@ Feature: test # Enter feature description here Scenario: scenario - Given py file with imports: pytest, pytest_bdd, allure - - And func: + Given py file with name: example + And with imports: pytest, pytest_bdd, allure + And with func: """ - @given("given_step") + @pytest_bdd.given("given_step") def my_func(): allure.attach("blah", ...) raise Exception("message") """ + And test for scenario_name from file.feature + And py file saved diff --git a/allure-pytest-bdd/test/conftest.py b/allure-pytest-bdd/test/conftest.py index 7a9f79a8..319da993 100644 --- a/allure-pytest-bdd/test/conftest.py +++ b/allure-pytest-bdd/test/conftest.py @@ -4,9 +4,10 @@ import allure_commons from allure_commons_test.report import AllureReport from allure_commons.logger import AllureFileLogger -from .steps import * # noqa F401 F403 +from .steps import * # noqa F401 F403 from pytest_bdd import given, when, parsers +from .py_file_builder import PyFileBuilder pytest_plugins = "pytester" @@ -64,3 +65,49 @@ def feature_definition(name, extension, content, testdir): @when("run pytest-bdd with allure") def run(allured_testdir): allured_testdir.run_with_allure() + + +@pytest.fixture() +@given(parsers.parse("py file with name: {name}")) +def current_py_file_builder(name): + return PyFileBuilder(name) + + +@given(parsers.parse("with imports: {modules}")) +def add_imports_in_builder(modules, current_py_file_builder): + modules_names = [module.strip() for module in modules.split(",")] + current_py_file_builder.add_imports(*modules_names) + + +@given(parsers.re("with func:(?:\n)(?P[\\S|\\s]*)")) +def add_func_in_builder(content, current_py_file_builder): + current_py_file_builder.add_func(content) + + +@given("with passed steps") +def add_passed_steps(current_py_file_builder): + + passed_steps = '@pytest_bdd.given("passed step")\n' \ + '@pytest_bdd.when("passed step")\n' \ + '@pytest_bdd.then("passed step")\n' \ + 'def step_impl():\n' \ + ' pass' + + current_py_file_builder.add_func(passed_steps) + + +@given(parsers.parse("test for {scenario_name} from {feature_file}")) +def add_scenario_step(scenario_name, feature_file, current_py_file_builder): + + scenario_func = f'@pytest_bdd.scenario("{feature_file}", "{scenario_name}")\n' \ + 'def test_scenario():\n' \ + ' pass' + + current_py_file_builder.add_func(scenario_func) + + +@given(parsers.parse("py file saved")) +def save_py_file(current_py_file_builder, testdir): + testdir.makefile( + ".py", + **dict([(current_py_file_builder.name, current_py_file_builder.get_content())]))