From b6786a01024d7eb37031664239f9f69d97fe5165 Mon Sep 17 00:00:00 2001 From: Vitalii Buriak Date: Mon, 20 Apr 2020 22:58:26 +0200 Subject: [PATCH] Possible to relax Gherkin validation for simple steps generator. --- README.rst | 10 ++++++++++ pytest_bdd/generation.py | 4 ++-- pytest_bdd/scripts.py | 20 +++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index d33ad27..39f2b4b 100644 --- a/README.rst +++ b/README.rst @@ -1175,6 +1175,16 @@ It will print the generated code to the standard output so you can easily redire pytest-bdd generate features/some.feature > tests/functional/test_some.py +If your scenarios are not written in `proper` Gherkin language, e.g. they are more like textual scripts, then +you might find it hard to use `pytest-bdd generate` as by default it validates the order of step types (given-when-then). +To relax that validation, just pass ``--strict-gherkin=False`` to the ``scenario`` steps generator: + + +:: + + pytest-bdd generate --strict-gherkin=False .. + + Advanced code generation ------------------------ diff --git a/pytest_bdd/generation.py b/pytest_bdd/generation.py index d7ed9e1..6f7e637 100644 --- a/pytest_bdd/generation.py +++ b/pytest_bdd/generation.py @@ -126,7 +126,7 @@ def _find_step_fixturedef(fixturemanager, item, name, type_, encoding="utf-8"): return fixturedefs -def parse_feature_files(paths): +def parse_feature_files(paths, **kwargs): """Parse feature files of given paths. :param paths: `list` of paths (file or dirs) @@ -134,7 +134,7 @@ def parse_feature_files(paths): :return: `list` of `tuple` in form: (`list` of `Feature` objects, `list` of `Scenario` objects, `list` of `Step` objects). """ - features = get_features(paths) + features = get_features(paths, **kwargs) scenarios = sorted( itertools.chain.from_iterable(feature.scenarios.values() for feature in features), key=lambda scenario: (scenario.feature.name or scenario.feature.filename, scenario.name), diff --git a/pytest_bdd/scripts.py b/pytest_bdd/scripts.py index 156a863..358ef2d 100644 --- a/pytest_bdd/scripts.py +++ b/pytest_bdd/scripts.py @@ -47,7 +47,7 @@ def check_existense(file_name): def print_generated_code(args): """Print generated test code for the given filenames.""" - features, scenarios, steps = parse_feature_files(args.files) + features, scenarios, steps = parse_feature_files(args.files, strict_gherkin=args.strict_gherkin) code = generate_code(features, scenarios, steps) if six.PY2: print(code.encode("utf-8")) @@ -55,12 +55,30 @@ def print_generated_code(args): print(code) +def str2bool(val): + """Convert string to boolean.""" + if "True" == val: + return True + elif "False" == val: + return False + else: + return val + + def main(): """Main entry point.""" parser = argparse.ArgumentParser(prog="pytest-bdd") subparsers = parser.add_subparsers(help="sub-command help", dest="command") subparsers.required = True parser_generate = subparsers.add_parser("generate", help="generate help") + parser_generate.add_argument( + "--strict-gherkin", + default=True, + choices=[True, False], + type=str2bool, + metavar="[True|False]", + help="To strict or relax the validation (given-when-then)", + ) parser_generate.add_argument( "files", metavar="FEATURE_FILE",