busser-behave 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.cane +0 -0
- data/.gitignore +17 -0
- data/.tailor +4 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +3 -0
- data/LICENSE +15 -0
- data/README.md +41 -0
- data/Rakefile +68 -0
- data/busser-behave.gemspec +30 -0
- data/features/plugin_install_command.feature +11 -0
- data/features/plugin_list_command.feature +8 -0
- data/features/support/env.rb +13 -0
- data/features/test_command.feature +31 -0
- data/lib/busser/behave/version.rb +26 -0
- data/lib/busser/runner_plugin/behave.rb +37 -0
- data/vendor/behave/CHANGES.rst +483 -0
- data/vendor/behave/LICENSE +23 -0
- data/vendor/behave/MANIFEST.in +37 -0
- data/vendor/behave/PROJECT_INFO.rst +21 -0
- data/vendor/behave/README.rst +112 -0
- data/vendor/behave/VERSION.txt +1 -0
- data/vendor/behave/behave.ini +22 -0
- data/vendor/behave/behave/__init__.py +30 -0
- data/vendor/behave/behave/__main__.py +187 -0
- data/vendor/behave/behave/_stepimport.py +185 -0
- data/vendor/behave/behave/_types.py +134 -0
- data/vendor/behave/behave/api/__init__.py +7 -0
- data/vendor/behave/behave/api/async_step.py +283 -0
- data/vendor/behave/behave/capture.py +227 -0
- data/vendor/behave/behave/compat/__init__.py +5 -0
- data/vendor/behave/behave/compat/collections.py +20 -0
- data/vendor/behave/behave/configuration.py +788 -0
- data/vendor/behave/behave/contrib/__init__.py +0 -0
- data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
- data/vendor/behave/behave/formatter/__init__.py +12 -0
- data/vendor/behave/behave/formatter/_builtins.py +39 -0
- data/vendor/behave/behave/formatter/_registry.py +135 -0
- data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
- data/vendor/behave/behave/formatter/base.py +200 -0
- data/vendor/behave/behave/formatter/formatters.py +57 -0
- data/vendor/behave/behave/formatter/json.py +253 -0
- data/vendor/behave/behave/formatter/null.py +12 -0
- data/vendor/behave/behave/formatter/plain.py +158 -0
- data/vendor/behave/behave/formatter/pretty.py +351 -0
- data/vendor/behave/behave/formatter/progress.py +287 -0
- data/vendor/behave/behave/formatter/rerun.py +114 -0
- data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
- data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
- data/vendor/behave/behave/formatter/steps.py +497 -0
- data/vendor/behave/behave/formatter/tags.py +178 -0
- data/vendor/behave/behave/i18n.py +614 -0
- data/vendor/behave/behave/importer.py +102 -0
- data/vendor/behave/behave/json_parser.py +264 -0
- data/vendor/behave/behave/log_capture.py +233 -0
- data/vendor/behave/behave/matchers.py +402 -0
- data/vendor/behave/behave/model.py +1737 -0
- data/vendor/behave/behave/model_core.py +416 -0
- data/vendor/behave/behave/model_describe.py +105 -0
- data/vendor/behave/behave/parser.py +615 -0
- data/vendor/behave/behave/reporter/__init__.py +0 -0
- data/vendor/behave/behave/reporter/base.py +45 -0
- data/vendor/behave/behave/reporter/junit.py +473 -0
- data/vendor/behave/behave/reporter/summary.py +94 -0
- data/vendor/behave/behave/runner.py +753 -0
- data/vendor/behave/behave/runner_util.py +417 -0
- data/vendor/behave/behave/step_registry.py +112 -0
- data/vendor/behave/behave/tag_expression.py +111 -0
- data/vendor/behave/behave/tag_matcher.py +465 -0
- data/vendor/behave/behave/textutil.py +137 -0
- data/vendor/behave/behave/userdata.py +130 -0
- data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
- data/vendor/behave/behave4cmd0/__init__.py +5 -0
- data/vendor/behave/behave4cmd0/__setup.py +11 -0
- data/vendor/behave/behave4cmd0/command_shell.py +216 -0
- data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
- data/vendor/behave/behave4cmd0/command_steps.py +532 -0
- data/vendor/behave/behave4cmd0/command_util.py +147 -0
- data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
- data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
- data/vendor/behave/behave4cmd0/log/steps.py +395 -0
- data/vendor/behave/behave4cmd0/note_steps.py +29 -0
- data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
- data/vendor/behave/behave4cmd0/pathutil.py +146 -0
- data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
- data/vendor/behave/behave4cmd0/textutil.py +304 -0
- data/vendor/behave/bin/behave +44 -0
- data/vendor/behave/bin/behave.cmd +10 -0
- data/vendor/behave/bin/behave.junit_filter.py +85 -0
- data/vendor/behave/bin/behave.step_durations.py +163 -0
- data/vendor/behave/bin/behave2cucumber_json.py +63 -0
- data/vendor/behave/bin/behave_cmd.py +44 -0
- data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
- data/vendor/behave/bin/explore_platform_encoding.py +24 -0
- data/vendor/behave/bin/i18n.yml +621 -0
- data/vendor/behave/bin/invoke +8 -0
- data/vendor/behave/bin/invoke.cmd +9 -0
- data/vendor/behave/bin/json.format.py +167 -0
- data/vendor/behave/bin/jsonschema_validate.py +122 -0
- data/vendor/behave/bin/make_localpi.py +279 -0
- data/vendor/behave/bin/project_bootstrap.sh +30 -0
- data/vendor/behave/bin/toxcmd.py +270 -0
- data/vendor/behave/bin/toxcmd3.py +270 -0
- data/vendor/behave/conftest.py +27 -0
- data/vendor/behave/docs/Makefile +154 -0
- data/vendor/behave/docs/_static/agogo.css +501 -0
- data/vendor/behave/docs/_static/behave_logo.png +0 -0
- data/vendor/behave/docs/_static/behave_logo1.png +0 -0
- data/vendor/behave/docs/_static/behave_logo2.png +0 -0
- data/vendor/behave/docs/_static/behave_logo3.png +0 -0
- data/vendor/behave/docs/_themes/LICENSE +45 -0
- data/vendor/behave/docs/_themes/kr/layout.html +17 -0
- data/vendor/behave/docs/_themes/kr/relations.html +19 -0
- data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
- data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
- data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
- data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
- data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
- data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
- data/vendor/behave/docs/api.rst +408 -0
- data/vendor/behave/docs/appendix.rst +19 -0
- data/vendor/behave/docs/behave.rst +640 -0
- data/vendor/behave/docs/behave.rst-template +86 -0
- data/vendor/behave/docs/behave_ecosystem.rst +81 -0
- data/vendor/behave/docs/comparison.rst +85 -0
- data/vendor/behave/docs/conf.py +293 -0
- data/vendor/behave/docs/context_attributes.rst +66 -0
- data/vendor/behave/docs/django.rst +192 -0
- data/vendor/behave/docs/formatters.rst +61 -0
- data/vendor/behave/docs/gherkin.rst +673 -0
- data/vendor/behave/docs/index.rst +57 -0
- data/vendor/behave/docs/install.rst +60 -0
- data/vendor/behave/docs/more_info.rst +184 -0
- data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
- data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
- data/vendor/behave/docs/parse_builtin_types.rst +59 -0
- data/vendor/behave/docs/philosophy.rst +235 -0
- data/vendor/behave/docs/regular_expressions.rst +71 -0
- data/vendor/behave/docs/related.rst +14 -0
- data/vendor/behave/docs/test_domains.rst +62 -0
- data/vendor/behave/docs/tutorial.rst +636 -0
- data/vendor/behave/docs/update_behave_rst.py +100 -0
- data/vendor/behave/etc/json/behave.json-schema +172 -0
- data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
- data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
- data/vendor/behave/examples/async_step/README.txt +8 -0
- data/vendor/behave/examples/async_step/behave.ini +14 -0
- data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
- data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
- data/vendor/behave/examples/async_step/features/environment.py +28 -0
- data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
- data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
- data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
- data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
- data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
- data/vendor/behave/examples/env_vars/README.rst +26 -0
- data/vendor/behave/examples/env_vars/behave.ini +15 -0
- data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
- data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
- data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
- data/vendor/behave/features/README.txt +12 -0
- data/vendor/behave/features/background.feature +392 -0
- data/vendor/behave/features/capture_stderr.feature +172 -0
- data/vendor/behave/features/capture_stdout.feature +125 -0
- data/vendor/behave/features/cmdline.lang_list.feature +33 -0
- data/vendor/behave/features/configuration.default_paths.feature +116 -0
- data/vendor/behave/features/context.global_params.feature +35 -0
- data/vendor/behave/features/context.local_params.feature +17 -0
- data/vendor/behave/features/directory_layout.advanced.feature +147 -0
- data/vendor/behave/features/directory_layout.basic.feature +75 -0
- data/vendor/behave/features/directory_layout.basic2.feature +87 -0
- data/vendor/behave/features/environment.py +53 -0
- data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
- data/vendor/behave/features/feature.description.feature +0 -0
- data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
- data/vendor/behave/features/formatter.help.feature +30 -0
- data/vendor/behave/features/formatter.json.feature +420 -0
- data/vendor/behave/features/formatter.progress3.feature +235 -0
- data/vendor/behave/features/formatter.rerun.feature +296 -0
- data/vendor/behave/features/formatter.steps.feature +181 -0
- data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
- data/vendor/behave/features/formatter.steps_doc.feature +140 -0
- data/vendor/behave/features/formatter.steps_usage.feature +404 -0
- data/vendor/behave/features/formatter.tags.feature +134 -0
- data/vendor/behave/features/formatter.tags_location.feature +183 -0
- data/vendor/behave/features/formatter.user_defined.feature +196 -0
- data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
- data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
- data/vendor/behave/features/logcapture.feature +188 -0
- data/vendor/behave/features/logcapture.filter.feature +130 -0
- data/vendor/behave/features/logging.no_capture.feature +99 -0
- data/vendor/behave/features/logging.setup_format.feature +157 -0
- data/vendor/behave/features/logging.setup_level.feature +168 -0
- data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
- data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
- data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
- data/vendor/behave/features/runner.abort_by_user.feature +305 -0
- data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
- data/vendor/behave/features/runner.default_format.feature +175 -0
- data/vendor/behave/features/runner.dry_run.feature +184 -0
- data/vendor/behave/features/runner.feature_listfile.feature +223 -0
- data/vendor/behave/features/runner.hook_errors.feature +382 -0
- data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
- data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
- data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
- data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
- data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
- data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
- data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
- data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
- data/vendor/behave/features/runner.tag_logic.feature +67 -0
- data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
- data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
- data/vendor/behave/features/scenario.description.feature +171 -0
- data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
- data/vendor/behave/features/scenario_outline.basics.feature +100 -0
- data/vendor/behave/features/scenario_outline.improved.feature +177 -0
- data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
- data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
- data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
- data/vendor/behave/features/step.async_steps.feature +225 -0
- data/vendor/behave/features/step.duplicated_step.feature +106 -0
- data/vendor/behave/features/step.execute_steps.feature +59 -0
- data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
- data/vendor/behave/features/step.import_other_step_module.feature +103 -0
- data/vendor/behave/features/step.pending_steps.feature +128 -0
- data/vendor/behave/features/step.undefined_steps.feature +307 -0
- data/vendor/behave/features/step.use_step_library.feature +44 -0
- data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
- data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
- data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
- data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
- data/vendor/behave/features/step_param.custom_types.feature +134 -0
- data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
- data/vendor/behave/features/steps/behave_context_steps.py +67 -0
- data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
- data/vendor/behave/features/steps/behave_model_util.py +105 -0
- data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
- data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
- data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
- data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
- data/vendor/behave/features/summary.undefined_steps.feature +114 -0
- data/vendor/behave/features/tags.active_tags.feature +385 -0
- data/vendor/behave/features/tags.default_tags.feature +104 -0
- data/vendor/behave/features/tags.tag_expression.feature +105 -0
- data/vendor/behave/features/userdata.feature +331 -0
- data/vendor/behave/invoke.yaml +21 -0
- data/vendor/behave/issue.features/README.txt +17 -0
- data/vendor/behave/issue.features/environment.py +97 -0
- data/vendor/behave/issue.features/issue0030.feature +21 -0
- data/vendor/behave/issue.features/issue0031.feature +16 -0
- data/vendor/behave/issue.features/issue0032.feature +28 -0
- data/vendor/behave/issue.features/issue0035.feature +74 -0
- data/vendor/behave/issue.features/issue0040.feature +154 -0
- data/vendor/behave/issue.features/issue0041.feature +135 -0
- data/vendor/behave/issue.features/issue0042.feature +230 -0
- data/vendor/behave/issue.features/issue0044.feature +51 -0
- data/vendor/behave/issue.features/issue0046.feature +77 -0
- data/vendor/behave/issue.features/issue0052.feature +66 -0
- data/vendor/behave/issue.features/issue0059.feature +29 -0
- data/vendor/behave/issue.features/issue0063.feature +102 -0
- data/vendor/behave/issue.features/issue0064.feature +97 -0
- data/vendor/behave/issue.features/issue0065.feature +18 -0
- data/vendor/behave/issue.features/issue0066.feature +80 -0
- data/vendor/behave/issue.features/issue0067.feature +90 -0
- data/vendor/behave/issue.features/issue0069.feature +64 -0
- data/vendor/behave/issue.features/issue0072.feature +32 -0
- data/vendor/behave/issue.features/issue0073.feature +228 -0
- data/vendor/behave/issue.features/issue0075.feature +18 -0
- data/vendor/behave/issue.features/issue0077.feature +89 -0
- data/vendor/behave/issue.features/issue0080.feature +49 -0
- data/vendor/behave/issue.features/issue0081.feature +138 -0
- data/vendor/behave/issue.features/issue0083.feature +69 -0
- data/vendor/behave/issue.features/issue0084.feature +69 -0
- data/vendor/behave/issue.features/issue0085.feature +119 -0
- data/vendor/behave/issue.features/issue0092.feature +66 -0
- data/vendor/behave/issue.features/issue0096.feature +173 -0
- data/vendor/behave/issue.features/issue0099.feature +130 -0
- data/vendor/behave/issue.features/issue0109.feature +60 -0
- data/vendor/behave/issue.features/issue0111.feature +53 -0
- data/vendor/behave/issue.features/issue0112.feature +64 -0
- data/vendor/behave/issue.features/issue0114.feature +118 -0
- data/vendor/behave/issue.features/issue0116.feature +71 -0
- data/vendor/behave/issue.features/issue0125.feature +49 -0
- data/vendor/behave/issue.features/issue0127.feature +64 -0
- data/vendor/behave/issue.features/issue0139.feature +67 -0
- data/vendor/behave/issue.features/issue0142.feature +37 -0
- data/vendor/behave/issue.features/issue0143.feature +54 -0
- data/vendor/behave/issue.features/issue0145.feature +63 -0
- data/vendor/behave/issue.features/issue0148.feature +105 -0
- data/vendor/behave/issue.features/issue0152.feature +52 -0
- data/vendor/behave/issue.features/issue0159.feature +74 -0
- data/vendor/behave/issue.features/issue0162.feature +86 -0
- data/vendor/behave/issue.features/issue0171.feature +16 -0
- data/vendor/behave/issue.features/issue0172.feature +51 -0
- data/vendor/behave/issue.features/issue0175.feature +91 -0
- data/vendor/behave/issue.features/issue0177.feature +40 -0
- data/vendor/behave/issue.features/issue0181.feature +36 -0
- data/vendor/behave/issue.features/issue0184.feature +144 -0
- data/vendor/behave/issue.features/issue0186.feature +12 -0
- data/vendor/behave/issue.features/issue0188.feature +60 -0
- data/vendor/behave/issue.features/issue0191.feature +178 -0
- data/vendor/behave/issue.features/issue0194.feature +215 -0
- data/vendor/behave/issue.features/issue0197.feature +11 -0
- data/vendor/behave/issue.features/issue0216.feature +129 -0
- data/vendor/behave/issue.features/issue0226.feature +51 -0
- data/vendor/behave/issue.features/issue0228.feature +41 -0
- data/vendor/behave/issue.features/issue0230.feature +46 -0
- data/vendor/behave/issue.features/issue0231.feature +77 -0
- data/vendor/behave/issue.features/issue0238.feature +52 -0
- data/vendor/behave/issue.features/issue0251.feature +15 -0
- data/vendor/behave/issue.features/issue0280.feature +118 -0
- data/vendor/behave/issue.features/issue0288.feature +95 -0
- data/vendor/behave/issue.features/issue0300.feature +49 -0
- data/vendor/behave/issue.features/issue0302.feature +91 -0
- data/vendor/behave/issue.features/issue0309.feature +52 -0
- data/vendor/behave/issue.features/issue0330.feature +124 -0
- data/vendor/behave/issue.features/issue0349.feature +9 -0
- data/vendor/behave/issue.features/issue0361.feature +79 -0
- data/vendor/behave/issue.features/issue0383.feature +76 -0
- data/vendor/behave/issue.features/issue0384.feature +103 -0
- data/vendor/behave/issue.features/issue0385.feature +109 -0
- data/vendor/behave/issue.features/issue0424.feature +66 -0
- data/vendor/behave/issue.features/issue0446.feature +116 -0
- data/vendor/behave/issue.features/issue0449.feature +42 -0
- data/vendor/behave/issue.features/issue0453.feature +42 -0
- data/vendor/behave/issue.features/issue0457.feature +65 -0
- data/vendor/behave/issue.features/issue0462.feature +38 -0
- data/vendor/behave/issue.features/issue0476.feature +39 -0
- data/vendor/behave/issue.features/issue0487.feature +92 -0
- data/vendor/behave/issue.features/issue0506.feature +77 -0
- data/vendor/behave/issue.features/issue0510.feature +51 -0
- data/vendor/behave/issue.features/requirements.txt +12 -0
- data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
- data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
- data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
- data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
- data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
- data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
- data/vendor/behave/more.features/tutorial.feature +6 -0
- data/vendor/behave/py.requirements/README.txt +5 -0
- data/vendor/behave/py.requirements/all.txt +16 -0
- data/vendor/behave/py.requirements/basic.txt +21 -0
- data/vendor/behave/py.requirements/develop.txt +28 -0
- data/vendor/behave/py.requirements/docs.txt +6 -0
- data/vendor/behave/py.requirements/json.txt +7 -0
- data/vendor/behave/py.requirements/more_py26.txt +8 -0
- data/vendor/behave/py.requirements/testing.txt +10 -0
- data/vendor/behave/pytest.ini +24 -0
- data/vendor/behave/setup.cfg +29 -0
- data/vendor/behave/setup.py +118 -0
- data/vendor/behave/setuptools_behave.py +130 -0
- data/vendor/behave/tasks/__behave.py +45 -0
- data/vendor/behave/tasks/__init__.py +55 -0
- data/vendor/behave/tasks/__main__.py +70 -0
- data/vendor/behave/tasks/_setup.py +135 -0
- data/vendor/behave/tasks/_vendor/README.rst +35 -0
- data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
- data/vendor/behave/tasks/_vendor/path.py +1725 -0
- data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
- data/vendor/behave/tasks/_vendor/six.py +868 -0
- data/vendor/behave/tasks/clean.py +246 -0
- data/vendor/behave/tasks/docs.py +97 -0
- data/vendor/behave/tasks/requirements.txt +17 -0
- data/vendor/behave/tasks/test.py +192 -0
- data/vendor/behave/test/__init__.py +0 -0
- data/vendor/behave/test/_importer_candidate.py +3 -0
- data/vendor/behave/test/reporters/__init__.py +0 -0
- data/vendor/behave/test/reporters/test_summary.py +240 -0
- data/vendor/behave/test/test_ansi_escapes.py +73 -0
- data/vendor/behave/test/test_configuration.py +172 -0
- data/vendor/behave/test/test_formatter.py +265 -0
- data/vendor/behave/test/test_formatter_progress.py +39 -0
- data/vendor/behave/test/test_formatter_rerun.py +97 -0
- data/vendor/behave/test/test_formatter_tags.py +57 -0
- data/vendor/behave/test/test_importer.py +151 -0
- data/vendor/behave/test/test_log_capture.py +29 -0
- data/vendor/behave/test/test_matchers.py +236 -0
- data/vendor/behave/test/test_model.py +871 -0
- data/vendor/behave/test/test_parser.py +1590 -0
- data/vendor/behave/test/test_runner.py +1074 -0
- data/vendor/behave/test/test_step_registry.py +96 -0
- data/vendor/behave/test/test_tag_expression.py +506 -0
- data/vendor/behave/test/test_tag_expression2.py +462 -0
- data/vendor/behave/test/test_tag_matcher.py +729 -0
- data/vendor/behave/test/test_userdata.py +184 -0
- data/vendor/behave/tests/README.txt +12 -0
- data/vendor/behave/tests/__init__.py +0 -0
- data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
- data/vendor/behave/tests/api/__init__.py +0 -0
- data/vendor/behave/tests/api/_test_async_step34.py +130 -0
- data/vendor/behave/tests/api/_test_async_step35.py +75 -0
- data/vendor/behave/tests/api/test_async_step.py +18 -0
- data/vendor/behave/tests/api/testing_support.py +94 -0
- data/vendor/behave/tests/api/testing_support_async.py +21 -0
- data/vendor/behave/tests/issues/test_issue0336.py +66 -0
- data/vendor/behave/tests/issues/test_issue0449.py +55 -0
- data/vendor/behave/tests/issues/test_issue0453.py +62 -0
- data/vendor/behave/tests/issues/test_issue0458.py +54 -0
- data/vendor/behave/tests/issues/test_issue0495.py +65 -0
- data/vendor/behave/tests/unit/__init__.py +0 -0
- data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
- data/vendor/behave/tests/unit/test_capture.py +280 -0
- data/vendor/behave/tests/unit/test_model_core.py +56 -0
- data/vendor/behave/tests/unit/test_textutil.py +267 -0
- data/vendor/behave/tools/test-features/background.feature +9 -0
- data/vendor/behave/tools/test-features/environment.py +8 -0
- data/vendor/behave/tools/test-features/french.feature +11 -0
- data/vendor/behave/tools/test-features/outline.feature +39 -0
- data/vendor/behave/tools/test-features/parse.feature +10 -0
- data/vendor/behave/tools/test-features/step-data.feature +60 -0
- data/vendor/behave/tools/test-features/steps/steps.py +120 -0
- data/vendor/behave/tools/test-features/tags.feature +18 -0
- data/vendor/behave/tox.ini +159 -0
- metadata +562 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
@sequential
|
|
2
|
+
Feature: Steps Formatter (Step Definitions Formatter)
|
|
3
|
+
|
|
4
|
+
As a test writer
|
|
5
|
+
I want to get a quick overview which step definitions exist
|
|
6
|
+
To simplify the writing of feature tests.
|
|
7
|
+
|
|
8
|
+
. SOLUTION: Use StepsFormatter in dry-run mode, like:
|
|
9
|
+
.
|
|
10
|
+
. behave --dry-run -f steps features/
|
|
11
|
+
.
|
|
12
|
+
. NOTE: This formatter is similar to the "stepdefs" formatter in cucumber.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@setup
|
|
16
|
+
Scenario: Feature Setup
|
|
17
|
+
Given a new working directory
|
|
18
|
+
And a file named "features/steps/passing_steps.py" with:
|
|
19
|
+
"""
|
|
20
|
+
from behave import step
|
|
21
|
+
|
|
22
|
+
@step('a step passes')
|
|
23
|
+
def step_passes(context):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
@step('a step fails')
|
|
27
|
+
def step_fails(context):
|
|
28
|
+
assert False, "XFAIL-STEP"
|
|
29
|
+
"""
|
|
30
|
+
And a file named "features/steps/alice_steps.py" with:
|
|
31
|
+
"""
|
|
32
|
+
from behave import given, when, then
|
|
33
|
+
|
|
34
|
+
@given('{person} lives in {city}')
|
|
35
|
+
def step_given_person_lives_in_city(context, person, city):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@when('I visit {person}')
|
|
39
|
+
def step_when_visit_person(context, person):
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
@then('I meet {person} in {city}')
|
|
43
|
+
def step_then_meet_person_in_city(context, person, city):
|
|
44
|
+
pass
|
|
45
|
+
"""
|
|
46
|
+
And a file named "features/steps/bob_steps.py" with:
|
|
47
|
+
"""
|
|
48
|
+
from behave import given, when, then
|
|
49
|
+
|
|
50
|
+
@given('{person} works for {company}')
|
|
51
|
+
def step_given_person_works_for_company(context, person, company):
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
@when('I plan a meeting with {person}')
|
|
55
|
+
def step_when_plan_meeting_with_person(context, person):
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
@then('I meet him at the {company} office')
|
|
59
|
+
def step_then_meet_him_at_company_office(context, company):
|
|
60
|
+
pass
|
|
61
|
+
"""
|
|
62
|
+
And an empty file named "features/none.feature"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@usecase.primary
|
|
66
|
+
Scenario: Show available step definitions in dry-run mode
|
|
67
|
+
When I run "behave --dry-run -f steps features/"
|
|
68
|
+
Then it should pass with:
|
|
69
|
+
"""
|
|
70
|
+
GIVEN STEP DEFINITIONS[4]:
|
|
71
|
+
Given {person} lives in {city} # features/steps/alice_steps.py:3
|
|
72
|
+
Given {person} works for {company} # features/steps/bob_steps.py:3
|
|
73
|
+
Given a step passes # features/steps/passing_steps.py:3
|
|
74
|
+
Given a step fails # features/steps/passing_steps.py:7
|
|
75
|
+
|
|
76
|
+
WHEN STEP DEFINITIONS[4]:
|
|
77
|
+
When I visit {person} # features/steps/alice_steps.py:7
|
|
78
|
+
When I plan a meeting with {person} # features/steps/bob_steps.py:7
|
|
79
|
+
When a step passes # features/steps/passing_steps.py:3
|
|
80
|
+
When a step fails # features/steps/passing_steps.py:7
|
|
81
|
+
|
|
82
|
+
THEN STEP DEFINITIONS[4]:
|
|
83
|
+
Then I meet {person} in {city} # features/steps/alice_steps.py:11
|
|
84
|
+
Then I meet him at the {company} office # features/steps/bob_steps.py:11
|
|
85
|
+
Then a step passes # features/steps/passing_steps.py:3
|
|
86
|
+
Then a step fails # features/steps/passing_steps.py:7
|
|
87
|
+
|
|
88
|
+
GENERIC STEP DEFINITIONS[2]:
|
|
89
|
+
* a step passes # features/steps/passing_steps.py:3
|
|
90
|
+
* a step fails # features/steps/passing_steps.py:7
|
|
91
|
+
"""
|
|
92
|
+
But note that "the GENERIC STEP DEFINITIONS can be used as given/when/then steps"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@usecase.secondary
|
|
96
|
+
Scenario: Show available step definitions in normal mode
|
|
97
|
+
When I run "behave -f steps features/"
|
|
98
|
+
Then it should pass with:
|
|
99
|
+
"""
|
|
100
|
+
GIVEN STEP DEFINITIONS[4]:
|
|
101
|
+
Given {person} lives in {city} # features/steps/alice_steps.py:3
|
|
102
|
+
Given {person} works for {company} # features/steps/bob_steps.py:3
|
|
103
|
+
Given a step passes # features/steps/passing_steps.py:3
|
|
104
|
+
Given a step fails # features/steps/passing_steps.py:7
|
|
105
|
+
|
|
106
|
+
WHEN STEP DEFINITIONS[4]:
|
|
107
|
+
When I visit {person} # features/steps/alice_steps.py:7
|
|
108
|
+
When I plan a meeting with {person} # features/steps/bob_steps.py:7
|
|
109
|
+
When a step passes # features/steps/passing_steps.py:3
|
|
110
|
+
When a step fails # features/steps/passing_steps.py:7
|
|
111
|
+
|
|
112
|
+
THEN STEP DEFINITIONS[4]:
|
|
113
|
+
Then I meet {person} in {city} # features/steps/alice_steps.py:11
|
|
114
|
+
Then I meet him at the {company} office # features/steps/bob_steps.py:11
|
|
115
|
+
Then a step passes # features/steps/passing_steps.py:3
|
|
116
|
+
Then a step fails # features/steps/passing_steps.py:7
|
|
117
|
+
|
|
118
|
+
GENERIC STEP DEFINITIONS[2]:
|
|
119
|
+
* a step passes # features/steps/passing_steps.py:3
|
|
120
|
+
* a step fails # features/steps/passing_steps.py:7
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@language
|
|
125
|
+
Scenario: Show available step definitions for language=de (German)
|
|
126
|
+
When I run "behave --dry-run -f steps --lang=de features/"
|
|
127
|
+
Then it should pass with:
|
|
128
|
+
"""
|
|
129
|
+
GIVEN STEP DEFINITIONS[4]:
|
|
130
|
+
Angenommen {person} lives in {city} # features/steps/alice_steps.py:3
|
|
131
|
+
Angenommen {person} works for {company} # features/steps/bob_steps.py:3
|
|
132
|
+
Angenommen a step passes # features/steps/passing_steps.py:3
|
|
133
|
+
Angenommen a step fails # features/steps/passing_steps.py:7
|
|
134
|
+
|
|
135
|
+
WHEN STEP DEFINITIONS[4]:
|
|
136
|
+
Wenn I visit {person} # features/steps/alice_steps.py:7
|
|
137
|
+
Wenn I plan a meeting with {person} # features/steps/bob_steps.py:7
|
|
138
|
+
Wenn a step passes # features/steps/passing_steps.py:3
|
|
139
|
+
Wenn a step fails # features/steps/passing_steps.py:7
|
|
140
|
+
|
|
141
|
+
THEN STEP DEFINITIONS[4]:
|
|
142
|
+
Dann I meet {person} in {city} # features/steps/alice_steps.py:11
|
|
143
|
+
Dann I meet him at the {company} office # features/steps/bob_steps.py:11
|
|
144
|
+
Dann a step passes # features/steps/passing_steps.py:3
|
|
145
|
+
Dann a step fails # features/steps/passing_steps.py:7
|
|
146
|
+
|
|
147
|
+
GENERIC STEP DEFINITIONS[2]:
|
|
148
|
+
* a step passes # features/steps/passing_steps.py:3
|
|
149
|
+
* a step fails # features/steps/passing_steps.py:7
|
|
150
|
+
"""
|
|
151
|
+
But note that "this may fail depending on the language you use with your features"
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@language
|
|
155
|
+
Scenario: Show available step definitions for language=fr (French)
|
|
156
|
+
When I run "behave --dry-run -f steps --lang=fr features/"
|
|
157
|
+
Then it should pass with:
|
|
158
|
+
"""
|
|
159
|
+
GIVEN STEP DEFINITIONS[4]:
|
|
160
|
+
Soit {person} lives in {city} # features/steps/alice_steps.py:3
|
|
161
|
+
Soit {person} works for {company} # features/steps/bob_steps.py:3
|
|
162
|
+
Soit a step passes # features/steps/passing_steps.py:3
|
|
163
|
+
Soit a step fails # features/steps/passing_steps.py:7
|
|
164
|
+
|
|
165
|
+
WHEN STEP DEFINITIONS[4]:
|
|
166
|
+
Quand I visit {person} # features/steps/alice_steps.py:7
|
|
167
|
+
Quand I plan a meeting with {person} # features/steps/bob_steps.py:7
|
|
168
|
+
Quand a step passes # features/steps/passing_steps.py:3
|
|
169
|
+
Quand a step fails # features/steps/passing_steps.py:7
|
|
170
|
+
|
|
171
|
+
THEN STEP DEFINITIONS[4]:
|
|
172
|
+
Alors I meet {person} in {city} # features/steps/alice_steps.py:11
|
|
173
|
+
Alors I meet him at the {company} office # features/steps/bob_steps.py:11
|
|
174
|
+
Alors a step passes # features/steps/passing_steps.py:3
|
|
175
|
+
Alors a step fails # features/steps/passing_steps.py:7
|
|
176
|
+
|
|
177
|
+
GENERIC STEP DEFINITIONS[2]:
|
|
178
|
+
* a step passes # features/steps/passing_steps.py:3
|
|
179
|
+
* a step fails # features/steps/passing_steps.py:7
|
|
180
|
+
"""
|
|
181
|
+
But note that "this may fail depending on the language you use with your features"
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
@sequential
|
|
2
|
+
Feature: Steps Catalog Formatter
|
|
3
|
+
|
|
4
|
+
As a test writer
|
|
5
|
+
I want to get a quick overview how to use a step definition
|
|
6
|
+
By reading the step definition documentation (doc-stings).
|
|
7
|
+
However I am not interested in technical details such as
|
|
8
|
+
source location and step function names.
|
|
9
|
+
Also, I would prefer to view the step as they appear in a feature file.
|
|
10
|
+
|
|
11
|
+
. SOLUTION: Use StepsDocFormatter in dry-run mode, like:
|
|
12
|
+
.
|
|
13
|
+
. behave --dry-run -f steps.catalog features/
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@setup
|
|
17
|
+
Scenario: Feature Setup
|
|
18
|
+
Given a new working directory
|
|
19
|
+
And a file named "features/steps/passing_steps.py" with:
|
|
20
|
+
"""
|
|
21
|
+
from behave import step
|
|
22
|
+
|
|
23
|
+
@step('a step passes')
|
|
24
|
+
def step_passes(context):
|
|
25
|
+
'''This step always passes.'''
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
@step('a step fails')
|
|
29
|
+
def step_fails(context):
|
|
30
|
+
'''This step is expected to fail.'''
|
|
31
|
+
assert False, "XFAIL-STEP"
|
|
32
|
+
"""
|
|
33
|
+
And a file named "features/steps/alice_steps.py" with:
|
|
34
|
+
"""
|
|
35
|
+
from behave import given, when, then
|
|
36
|
+
|
|
37
|
+
@given('{person} lives in {city}')
|
|
38
|
+
def step_given_person_lives_in_city(context, person, city):
|
|
39
|
+
'''
|
|
40
|
+
Setup the data where a person lives and store in the database.
|
|
41
|
+
|
|
42
|
+
:param person: Person's name (as string).
|
|
43
|
+
:param city: City where the person lives (as string).
|
|
44
|
+
'''
|
|
45
|
+
database = getattr(context, "database", None)
|
|
46
|
+
if not database:
|
|
47
|
+
context.database = {}
|
|
48
|
+
context.database[person] = { "city": city }
|
|
49
|
+
|
|
50
|
+
@when('I visit {person}')
|
|
51
|
+
def step_when_visit_person(context, person):
|
|
52
|
+
# -- NO DOC-STRING.
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
@then('I meet {person} in {city}')
|
|
56
|
+
def step_then_meet_person_in_city(context, person, city):
|
|
57
|
+
'''
|
|
58
|
+
Checks if I can meet the person in the expected city.
|
|
59
|
+
|
|
60
|
+
:param person: Person's name as key (as string).
|
|
61
|
+
:param city: Expected city (as string).
|
|
62
|
+
'''
|
|
63
|
+
person_data = context.database.get(person, None)
|
|
64
|
+
assert person_data is not None, "Person %s not found" % person
|
|
65
|
+
assert person_data["city"] == city
|
|
66
|
+
"""
|
|
67
|
+
And an empty file named "features/none.feature"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@usecase.primary
|
|
71
|
+
Scenario: Show documentation of available step definitions in dry-run mode
|
|
72
|
+
When I run "behave --steps-catalog features/"
|
|
73
|
+
Then it should pass with:
|
|
74
|
+
"""
|
|
75
|
+
Given {person} lives in {city}
|
|
76
|
+
Setup the data where a person lives and store in the database.
|
|
77
|
+
|
|
78
|
+
:param person: Person's name (as string).
|
|
79
|
+
:param city: City where the person lives (as string).
|
|
80
|
+
|
|
81
|
+
When I visit {person}
|
|
82
|
+
|
|
83
|
+
Then I meet {person} in {city}
|
|
84
|
+
Checks if I can meet the person in the expected city.
|
|
85
|
+
|
|
86
|
+
:param person: Person's name as key (as string).
|
|
87
|
+
:param city: Expected city (as string).
|
|
88
|
+
|
|
89
|
+
Given a step passes
|
|
90
|
+
When a step passes
|
|
91
|
+
Then a step passes
|
|
92
|
+
This step always passes.
|
|
93
|
+
|
|
94
|
+
Given a step fails
|
|
95
|
+
When a step fails
|
|
96
|
+
Then a step fails
|
|
97
|
+
This step is expected to fail.
|
|
98
|
+
"""
|
|
99
|
+
But note that "the step definitions are ordered by step type"
|
|
100
|
+
And note that "'When I visit {person}' has no doc-string"
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
@sequential
|
|
2
|
+
Feature: Steps Doc Formatter
|
|
3
|
+
|
|
4
|
+
As a test writer
|
|
5
|
+
I want to get a quick overview how to use a step definition
|
|
6
|
+
By reading the step definition documentation (doc-stings).
|
|
7
|
+
|
|
8
|
+
. SOLUTION: Use StepsDocFormatter in dry-run mode, like:
|
|
9
|
+
.
|
|
10
|
+
. behave --dry-run -f steps.doc features/
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@setup
|
|
14
|
+
Scenario: Feature Setup
|
|
15
|
+
Given a new working directory
|
|
16
|
+
And a file named "features/steps/passing_steps.py" with:
|
|
17
|
+
"""
|
|
18
|
+
from behave import step
|
|
19
|
+
|
|
20
|
+
@step('a step passes')
|
|
21
|
+
def step_passes(context):
|
|
22
|
+
'''This step always passes.'''
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
@step('a step fails')
|
|
26
|
+
def step_fails(context):
|
|
27
|
+
'''This step is expected to fail.'''
|
|
28
|
+
assert False, "XFAIL-STEP"
|
|
29
|
+
"""
|
|
30
|
+
And a file named "features/steps/alice_steps.py" with:
|
|
31
|
+
"""
|
|
32
|
+
from behave import given, when, then
|
|
33
|
+
|
|
34
|
+
@given('{person} lives in {city}')
|
|
35
|
+
def step_given_person_lives_in_city(context, person, city):
|
|
36
|
+
'''
|
|
37
|
+
Setup the data where a person lives and store in the database.
|
|
38
|
+
|
|
39
|
+
:param person: Person's name (as string).
|
|
40
|
+
:param city: City where the person lives (as string).
|
|
41
|
+
'''
|
|
42
|
+
database = getattr(context, "database", None)
|
|
43
|
+
if not database:
|
|
44
|
+
context.database = {}
|
|
45
|
+
context.database[person] = { "city": city }
|
|
46
|
+
|
|
47
|
+
@when('I visit {person}')
|
|
48
|
+
def step_when_visit_person(context, person):
|
|
49
|
+
# -- NO DOC-STRING.
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
@then('I meet {person} in {city}')
|
|
53
|
+
def step_then_meet_person_in_city(context, person, city):
|
|
54
|
+
'''
|
|
55
|
+
Checks if I can meet the person in the expected city.
|
|
56
|
+
|
|
57
|
+
:param person: Person's name as key (as string).
|
|
58
|
+
:param city: Expected city (as string).
|
|
59
|
+
'''
|
|
60
|
+
person_data = context.database.get(person, None)
|
|
61
|
+
assert person_data is not None, "Person %s not found" % person
|
|
62
|
+
assert person_data["city"] == city
|
|
63
|
+
"""
|
|
64
|
+
And an empty file named "features/none.feature"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@usecase.primary
|
|
68
|
+
Scenario: Show documentation of available step definitions in dry-run mode
|
|
69
|
+
When I run "behave --dry-run -f steps.doc features/"
|
|
70
|
+
Then it should pass with:
|
|
71
|
+
"""
|
|
72
|
+
@given('{person} lives in {city}')
|
|
73
|
+
Function: step_given_person_lives_in_city()
|
|
74
|
+
Location: features/steps/alice_steps.py:3
|
|
75
|
+
Setup the data where a person lives and store in the database.
|
|
76
|
+
|
|
77
|
+
:param person: Person's name (as string).
|
|
78
|
+
:param city: City where the person lives (as string).
|
|
79
|
+
|
|
80
|
+
@when('I visit {person}')
|
|
81
|
+
Function: step_when_visit_person()
|
|
82
|
+
Location: features/steps/alice_steps.py:16
|
|
83
|
+
|
|
84
|
+
@then('I meet {person} in {city}')
|
|
85
|
+
Function: step_then_meet_person_in_city()
|
|
86
|
+
Location: features/steps/alice_steps.py:21
|
|
87
|
+
Checks if I can meet the person in the expected city.
|
|
88
|
+
|
|
89
|
+
:param person: Person's name as key (as string).
|
|
90
|
+
:param city: Expected city (as string).
|
|
91
|
+
|
|
92
|
+
@step('a step passes')
|
|
93
|
+
Function: step_passes()
|
|
94
|
+
Location: features/steps/passing_steps.py:3
|
|
95
|
+
This step always passes.
|
|
96
|
+
|
|
97
|
+
@step('a step fails')
|
|
98
|
+
Function: step_fails()
|
|
99
|
+
Location: features/steps/passing_steps.py:8
|
|
100
|
+
This step is expected to fail.
|
|
101
|
+
"""
|
|
102
|
+
But note that "the step definitions are ordered by file location"
|
|
103
|
+
And note that "@when('I visit {person}') has no doc-string"
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@usecase.secondary
|
|
107
|
+
Scenario: Show documentation of available step definitions in normal mode
|
|
108
|
+
When I run "behave -f steps.doc features/"
|
|
109
|
+
Then it should pass with:
|
|
110
|
+
"""
|
|
111
|
+
@given('{person} lives in {city}')
|
|
112
|
+
Function: step_given_person_lives_in_city()
|
|
113
|
+
Location: features/steps/alice_steps.py:3
|
|
114
|
+
Setup the data where a person lives and store in the database.
|
|
115
|
+
|
|
116
|
+
:param person: Person's name (as string).
|
|
117
|
+
:param city: City where the person lives (as string).
|
|
118
|
+
|
|
119
|
+
@when('I visit {person}')
|
|
120
|
+
Function: step_when_visit_person()
|
|
121
|
+
Location: features/steps/alice_steps.py:16
|
|
122
|
+
|
|
123
|
+
@then('I meet {person} in {city}')
|
|
124
|
+
Function: step_then_meet_person_in_city()
|
|
125
|
+
Location: features/steps/alice_steps.py:21
|
|
126
|
+
Checks if I can meet the person in the expected city.
|
|
127
|
+
|
|
128
|
+
:param person: Person's name as key (as string).
|
|
129
|
+
:param city: Expected city (as string).
|
|
130
|
+
|
|
131
|
+
@step('a step passes')
|
|
132
|
+
Function: step_passes()
|
|
133
|
+
Location: features/steps/passing_steps.py:3
|
|
134
|
+
This step always passes.
|
|
135
|
+
|
|
136
|
+
@step('a step fails')
|
|
137
|
+
Function: step_fails()
|
|
138
|
+
Location: features/steps/passing_steps.py:8
|
|
139
|
+
This step is expected to fail.
|
|
140
|
+
"""
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
@sequential
|
|
2
|
+
Feature: Steps Usage Formatter
|
|
3
|
+
|
|
4
|
+
As a test writer
|
|
5
|
+
I want to get an overview which step definitions are used and where
|
|
6
|
+
To simplify the refactoring of step definitions (and features).
|
|
7
|
+
|
|
8
|
+
. SOLUTION: Use StepsUsageFormatter in dry-run mode, like:
|
|
9
|
+
.
|
|
10
|
+
. behave --dry-run -f steps.usage features/
|
|
11
|
+
.
|
|
12
|
+
. NOTE: This formatter corresponds to the "usage" formatter in cucumber.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@setup
|
|
16
|
+
Scenario: Feature Setup
|
|
17
|
+
Given a new working directory
|
|
18
|
+
And a file named "features/steps/passing_steps.py" with:
|
|
19
|
+
"""
|
|
20
|
+
from behave import step
|
|
21
|
+
|
|
22
|
+
@step('{word:w} step passes')
|
|
23
|
+
def step_passes(context, word):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
@step('{word:w} step fails')
|
|
27
|
+
def step_passes(context, word):
|
|
28
|
+
assert False, "XFAIL-STEP"
|
|
29
|
+
"""
|
|
30
|
+
And a file named "features/steps/unused_steps.py" with:
|
|
31
|
+
"""
|
|
32
|
+
from behave import step
|
|
33
|
+
|
|
34
|
+
@step('an unused step')
|
|
35
|
+
def step_unused(context):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@step('another unused step')
|
|
39
|
+
def step_another_unused(context):
|
|
40
|
+
pass
|
|
41
|
+
"""
|
|
42
|
+
And a file named "features/steps/alice_steps.py" with:
|
|
43
|
+
"""
|
|
44
|
+
from behave import given, when, then
|
|
45
|
+
|
|
46
|
+
@given('{person} lives in {city}')
|
|
47
|
+
def step_given_person_lives_in_city(context, person, city):
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
@when('I visit {person}')
|
|
51
|
+
def step_when_visit_person(context, person):
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
@then('I meet {person} in {city}')
|
|
55
|
+
def step_then_meet_person_in_city(context, person, city):
|
|
56
|
+
pass
|
|
57
|
+
"""
|
|
58
|
+
And a file named "features/steps/charly_steps.py" with:
|
|
59
|
+
"""
|
|
60
|
+
from behave import given, when, then
|
|
61
|
+
|
|
62
|
+
@given('{person} works for {company}')
|
|
63
|
+
def step_given_person_works_for_company(context, person, company):
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
@when('I plan a meeting with {person}')
|
|
67
|
+
def step_when_plan_meeting_with_person(context, person):
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
@then('I meet him at the {company} office')
|
|
71
|
+
def step_then_meet_him_at_company_office(context, company):
|
|
72
|
+
pass
|
|
73
|
+
"""
|
|
74
|
+
And a file named "features/alice.feature" with:
|
|
75
|
+
"""
|
|
76
|
+
Feature:
|
|
77
|
+
Scenario: Visit Alice
|
|
78
|
+
Given Alice lives in Paris
|
|
79
|
+
When I visit Alice
|
|
80
|
+
Then I meet Alice in Paris
|
|
81
|
+
|
|
82
|
+
Scenario: Visit Bob
|
|
83
|
+
Given Bob lives in Berlin
|
|
84
|
+
When I visit Bob
|
|
85
|
+
Then I meet Bob in Berlin
|
|
86
|
+
"""
|
|
87
|
+
And a file named "features/bob.feature" with:
|
|
88
|
+
"""
|
|
89
|
+
Feature:
|
|
90
|
+
Scenario: Visit Bob
|
|
91
|
+
Given Bob lives in Barcelona
|
|
92
|
+
When I visit Bob
|
|
93
|
+
Then I meet Bob in Barcelona
|
|
94
|
+
And a step passes
|
|
95
|
+
"""
|
|
96
|
+
And a file named "features/charly.feature" with:
|
|
97
|
+
"""
|
|
98
|
+
Feature:
|
|
99
|
+
Scenario: Meeting with Charly
|
|
100
|
+
Given Charly works for ACME
|
|
101
|
+
When I plan a meeting with Charly
|
|
102
|
+
Then I meet him at the ACME office
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@usecase.primary
|
|
107
|
+
Scenario: Show step definitions usage with all features in dry-run mode
|
|
108
|
+
When I run "behave --dry-run -f steps.usage features/"
|
|
109
|
+
Then it should pass with:
|
|
110
|
+
"""
|
|
111
|
+
@given('{person} lives in {city}') # features/steps/alice_steps.py:3
|
|
112
|
+
Given Alice lives in Paris # features/alice.feature:3
|
|
113
|
+
Given Bob lives in Berlin # features/alice.feature:8
|
|
114
|
+
Given Bob lives in Barcelona # features/bob.feature:3
|
|
115
|
+
|
|
116
|
+
@when('I visit {person}') # features/steps/alice_steps.py:7
|
|
117
|
+
When I visit Alice # features/alice.feature:4
|
|
118
|
+
When I visit Bob # features/alice.feature:9
|
|
119
|
+
When I visit Bob # features/bob.feature:4
|
|
120
|
+
|
|
121
|
+
@then('I meet {person} in {city}') # features/steps/alice_steps.py:11
|
|
122
|
+
Then I meet Alice in Paris # features/alice.feature:5
|
|
123
|
+
Then I meet Bob in Berlin # features/alice.feature:10
|
|
124
|
+
Then I meet Bob in Barcelona # features/bob.feature:5
|
|
125
|
+
|
|
126
|
+
@given('{person} works for {company}') # features/steps/charly_steps.py:3
|
|
127
|
+
Given Charly works for ACME # features/charly.feature:3
|
|
128
|
+
|
|
129
|
+
@when('I plan a meeting with {person}') # features/steps/charly_steps.py:7
|
|
130
|
+
When I plan a meeting with Charly # features/charly.feature:4
|
|
131
|
+
|
|
132
|
+
@then('I meet him at the {company} office') # features/steps/charly_steps.py:11
|
|
133
|
+
Then I meet him at the ACME office # features/charly.feature:5
|
|
134
|
+
|
|
135
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
136
|
+
And a step passes # features/bob.feature:6
|
|
137
|
+
|
|
138
|
+
UNUSED STEP DEFINITIONS[3]:
|
|
139
|
+
@step('{word:w} step fails') # features/steps/passing_steps.py:7
|
|
140
|
+
@step('an unused step') # features/steps/unused_steps.py:3
|
|
141
|
+
@step('another unused step') # features/steps/unused_steps.py:7
|
|
142
|
+
"""
|
|
143
|
+
And note that "the UNUSED STEP DEFINITIONS are ordered by file location"
|
|
144
|
+
But note that "step definitions from unused_steps.py are not used by any feature"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@usecase.primary
|
|
148
|
+
Scenario: Show step definitions usage with one feature (dry-run mode)
|
|
149
|
+
When I run "behave --dry-run -f steps.usage features/alice.feature"
|
|
150
|
+
Then it should pass with:
|
|
151
|
+
"""
|
|
152
|
+
@given('{person} lives in {city}') # features/steps/alice_steps.py:3
|
|
153
|
+
Given Alice lives in Paris # features/alice.feature:3
|
|
154
|
+
Given Bob lives in Berlin # features/alice.feature:8
|
|
155
|
+
|
|
156
|
+
@when('I visit {person}') # features/steps/alice_steps.py:7
|
|
157
|
+
When I visit Alice # features/alice.feature:4
|
|
158
|
+
When I visit Bob # features/alice.feature:9
|
|
159
|
+
|
|
160
|
+
@then('I meet {person} in {city}') # features/steps/alice_steps.py:11
|
|
161
|
+
Then I meet Alice in Paris # features/alice.feature:5
|
|
162
|
+
Then I meet Bob in Berlin # features/alice.feature:10
|
|
163
|
+
|
|
164
|
+
UNUSED STEP DEFINITIONS[7]:
|
|
165
|
+
@given('{person} works for {company}') # features/steps/charly_steps.py:3
|
|
166
|
+
@when('I plan a meeting with {person}') # features/steps/charly_steps.py:7
|
|
167
|
+
@then('I meet him at the {company} office') # features/steps/charly_steps.py:11
|
|
168
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
169
|
+
@step('{word:w} step fails') # features/steps/passing_steps.py:7
|
|
170
|
+
@step('an unused step') # features/steps/unused_steps.py:3
|
|
171
|
+
@step('another unused step') # features/steps/unused_steps.py:7
|
|
172
|
+
"""
|
|
173
|
+
But note that "step definitions from charly_steps.py, passing_steps.py are now no longer used"
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@usecase.primary
|
|
177
|
+
Scenario: Show step definitions usage with two features (dry-run mode)
|
|
178
|
+
When I run "behave --dry-run -f steps.usage features/alice.feature features/charly.feature"
|
|
179
|
+
Then it should pass with:
|
|
180
|
+
"""
|
|
181
|
+
@given('{person} lives in {city}') # features/steps/alice_steps.py:3
|
|
182
|
+
Given Alice lives in Paris # features/alice.feature:3
|
|
183
|
+
Given Bob lives in Berlin # features/alice.feature:8
|
|
184
|
+
|
|
185
|
+
@when('I visit {person}') # features/steps/alice_steps.py:7
|
|
186
|
+
When I visit Alice # features/alice.feature:4
|
|
187
|
+
When I visit Bob # features/alice.feature:9
|
|
188
|
+
|
|
189
|
+
@then('I meet {person} in {city}') # features/steps/alice_steps.py:11
|
|
190
|
+
Then I meet Alice in Paris # features/alice.feature:5
|
|
191
|
+
Then I meet Bob in Berlin # features/alice.feature:10
|
|
192
|
+
|
|
193
|
+
@given('{person} works for {company}') # features/steps/charly_steps.py:3
|
|
194
|
+
Given Charly works for ACME # features/charly.feature:3
|
|
195
|
+
|
|
196
|
+
@when('I plan a meeting with {person}') # features/steps/charly_steps.py:7
|
|
197
|
+
When I plan a meeting with Charly # features/charly.feature:4
|
|
198
|
+
|
|
199
|
+
@then('I meet him at the {company} office') # features/steps/charly_steps.py:11
|
|
200
|
+
Then I meet him at the ACME office # features/charly.feature:5
|
|
201
|
+
|
|
202
|
+
UNUSED STEP DEFINITIONS[4]:
|
|
203
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
204
|
+
@step('{word:w} step fails') # features/steps/passing_steps.py:7
|
|
205
|
+
@step('an unused step') # features/steps/unused_steps.py:3
|
|
206
|
+
@step('another unused step') # features/steps/unused_steps.py:7
|
|
207
|
+
"""
|
|
208
|
+
But note that "step definitions from passing_steps.py, unused_steps.py are not used by any feature"
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@usecase.secondary
|
|
212
|
+
Scenario: Show step definitions usage with all features in normal mode
|
|
213
|
+
When I run "behave -f steps.usage features/"
|
|
214
|
+
Then it should pass with:
|
|
215
|
+
"""
|
|
216
|
+
@given('{person} lives in {city}') # features/steps/alice_steps.py:3
|
|
217
|
+
Given Alice lives in Paris # features/alice.feature:3
|
|
218
|
+
Given Bob lives in Berlin # features/alice.feature:8
|
|
219
|
+
Given Bob lives in Barcelona # features/bob.feature:3
|
|
220
|
+
|
|
221
|
+
@when('I visit {person}') # features/steps/alice_steps.py:7
|
|
222
|
+
When I visit Alice # features/alice.feature:4
|
|
223
|
+
When I visit Bob # features/alice.feature:9
|
|
224
|
+
When I visit Bob # features/bob.feature:4
|
|
225
|
+
|
|
226
|
+
@then('I meet {person} in {city}') # features/steps/alice_steps.py:11
|
|
227
|
+
Then I meet Alice in Paris # features/alice.feature:5
|
|
228
|
+
Then I meet Bob in Berlin # features/alice.feature:10
|
|
229
|
+
Then I meet Bob in Barcelona # features/bob.feature:5
|
|
230
|
+
|
|
231
|
+
@given('{person} works for {company}') # features/steps/charly_steps.py:3
|
|
232
|
+
Given Charly works for ACME # features/charly.feature:3
|
|
233
|
+
|
|
234
|
+
@when('I plan a meeting with {person}') # features/steps/charly_steps.py:7
|
|
235
|
+
When I plan a meeting with Charly # features/charly.feature:4
|
|
236
|
+
|
|
237
|
+
@then('I meet him at the {company} office') # features/steps/charly_steps.py:11
|
|
238
|
+
Then I meet him at the ACME office # features/charly.feature:5
|
|
239
|
+
|
|
240
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
241
|
+
And a step passes # features/bob.feature:6
|
|
242
|
+
|
|
243
|
+
UNUSED STEP DEFINITIONS[3]:
|
|
244
|
+
@step('{word:w} step fails') # features/steps/passing_steps.py:7
|
|
245
|
+
@step('an unused step') # features/steps/unused_steps.py:3
|
|
246
|
+
@step('another unused step') # features/steps/unused_steps.py:7
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
@corner.case
|
|
250
|
+
Scenario: StepsUsageFormatter shows undefined steps
|
|
251
|
+
Given a file named "features/undefined.feature" with:
|
|
252
|
+
"""
|
|
253
|
+
Feature: With undefined steps
|
|
254
|
+
Scenario:
|
|
255
|
+
Given a step is undefined
|
|
256
|
+
Then another step is undefined
|
|
257
|
+
"""
|
|
258
|
+
When I run "behave --dry-run -f steps.usage features/alice.feature features/undefined.feature"
|
|
259
|
+
Then it should fail with:
|
|
260
|
+
"""
|
|
261
|
+
0 features passed, 0 failed, 0 skipped, 2 untested
|
|
262
|
+
0 scenarios passed, 0 failed, 0 skipped, 3 untested
|
|
263
|
+
0 steps passed, 0 failed, 0 skipped, 2 undefined, 6 untested
|
|
264
|
+
"""
|
|
265
|
+
And the command output should contain:
|
|
266
|
+
"""
|
|
267
|
+
@given('{person} lives in {city}') # features/steps/alice_steps.py:3
|
|
268
|
+
Given Alice lives in Paris # features/alice.feature:3
|
|
269
|
+
Given Bob lives in Berlin # features/alice.feature:8
|
|
270
|
+
|
|
271
|
+
@when('I visit {person}') # features/steps/alice_steps.py:7
|
|
272
|
+
When I visit Alice # features/alice.feature:4
|
|
273
|
+
When I visit Bob # features/alice.feature:9
|
|
274
|
+
|
|
275
|
+
@then('I meet {person} in {city}') # features/steps/alice_steps.py:11
|
|
276
|
+
Then I meet Alice in Paris # features/alice.feature:5
|
|
277
|
+
Then I meet Bob in Berlin # features/alice.feature:10
|
|
278
|
+
|
|
279
|
+
UNUSED STEP DEFINITIONS[7]:
|
|
280
|
+
@given('{person} works for {company}') # features/steps/charly_steps.py:3
|
|
281
|
+
@when('I plan a meeting with {person}') # features/steps/charly_steps.py:7
|
|
282
|
+
@then('I meet him at the {company} office') # features/steps/charly_steps.py:11
|
|
283
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
284
|
+
@step('{word:w} step fails') # features/steps/passing_steps.py:7
|
|
285
|
+
@step('an unused step') # features/steps/unused_steps.py:3
|
|
286
|
+
@step('another unused step') # features/steps/unused_steps.py:7
|
|
287
|
+
|
|
288
|
+
UNDEFINED STEPS[2]:
|
|
289
|
+
Given a step is undefined # features/undefined.feature:3
|
|
290
|
+
Then another step is undefined # features/undefined.feature:4
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
@corner.case
|
|
295
|
+
Scenario: StepsUsageFormatter shows all locations of undefined step usage
|
|
296
|
+
|
|
297
|
+
Ensure that all location are shown where an undefined step is used
|
|
298
|
+
|
|
299
|
+
Given a file named "features/undefined_duplicates.feature" with:
|
|
300
|
+
"""
|
|
301
|
+
Feature: With undefined steps
|
|
302
|
+
|
|
303
|
+
Scenario: Same undefined step used twice
|
|
304
|
+
Given a step is undefined
|
|
305
|
+
And a step is undefined
|
|
306
|
+
Then a step passes
|
|
307
|
+
|
|
308
|
+
Scenario: Same undefined step used again
|
|
309
|
+
Given a step passes
|
|
310
|
+
And a step is undefined
|
|
311
|
+
"""
|
|
312
|
+
When I run "behave --dry-run -f steps.usage features/undefined_duplicates.feature"
|
|
313
|
+
Then it should fail with:
|
|
314
|
+
"""
|
|
315
|
+
0 scenarios passed, 0 failed, 0 skipped, 2 untested
|
|
316
|
+
0 steps passed, 0 failed, 0 skipped, 3 undefined, 2 untested
|
|
317
|
+
"""
|
|
318
|
+
And the command output should contain:
|
|
319
|
+
"""
|
|
320
|
+
UNDEFINED STEPS[3]:
|
|
321
|
+
Given a step is undefined # features/undefined_duplicates.feature:4
|
|
322
|
+
And a step is undefined # features/undefined_duplicates.feature:5
|
|
323
|
+
And a step is undefined # features/undefined_duplicates.feature:10
|
|
324
|
+
"""
|
|
325
|
+
|
|
326
|
+
@use_outline
|
|
327
|
+
Scenario: Scenario Outlines should not cause duplicated step entries
|
|
328
|
+
|
|
329
|
+
Scenario Outlines generate Scenarios that use the same step multiple times.
|
|
330
|
+
This duplication should not be listed.
|
|
331
|
+
|
|
332
|
+
Given a file named "features/use_scenario_outline.feature" with:
|
|
333
|
+
"""
|
|
334
|
+
Feature:
|
|
335
|
+
Scenario Outline:
|
|
336
|
+
Given a step <outcome1>
|
|
337
|
+
When another step <outcome2>
|
|
338
|
+
|
|
339
|
+
Examples:
|
|
340
|
+
| outcome1 | outcome2 |
|
|
341
|
+
| passes | passes |
|
|
342
|
+
| passes | fails |
|
|
343
|
+
"""
|
|
344
|
+
When I run "behave --dry-run -f steps.usage features/use_scenario_outline.feature"
|
|
345
|
+
Then it should pass with:
|
|
346
|
+
"""
|
|
347
|
+
0 scenarios passed, 0 failed, 0 skipped, 2 untested
|
|
348
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 4 untested
|
|
349
|
+
"""
|
|
350
|
+
And the command output should contain:
|
|
351
|
+
"""
|
|
352
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
353
|
+
Given a step passes # features/use_scenario_outline.feature:3
|
|
354
|
+
When another step passes # features/use_scenario_outline.feature:4
|
|
355
|
+
|
|
356
|
+
@step('{word:w} step fails') # features/steps/passing_steps.py:7
|
|
357
|
+
When another step fails # features/use_scenario_outline.feature:4
|
|
358
|
+
"""
|
|
359
|
+
But the command output should not contain:
|
|
360
|
+
"""
|
|
361
|
+
@step('{word:w} step passes') # features/steps/passing_steps.py:3
|
|
362
|
+
Given a step passes # features/use_scenario_outline.feature:3
|
|
363
|
+
When another step passes # features/use_scenario_outline.feature:4
|
|
364
|
+
Given a step passes # features/use_scenario_outline.feature:3
|
|
365
|
+
"""
|
|
366
|
+
|
|
367
|
+
@use_outline
|
|
368
|
+
Scenario: Scenario Outlines should not cause duplicated entries for undefined steps
|
|
369
|
+
|
|
370
|
+
Scenario Outlines generate Scenarios that use the same step multiple times.
|
|
371
|
+
This duplication should not be listed.
|
|
372
|
+
|
|
373
|
+
Given a file named "features/scenario_outline_with_undefined.feature" with:
|
|
374
|
+
"""
|
|
375
|
+
Feature:
|
|
376
|
+
Scenario Outline:
|
|
377
|
+
Given a step is <status1>
|
|
378
|
+
When another step is <status2>
|
|
379
|
+
|
|
380
|
+
Examples:
|
|
381
|
+
| status1 | status2 |
|
|
382
|
+
| undefined | undefined |
|
|
383
|
+
| undefined | undefined |
|
|
384
|
+
"""
|
|
385
|
+
When I run "behave --dry-run -f steps.usage features/scenario_outline_with_undefined.feature"
|
|
386
|
+
Then it should fail with:
|
|
387
|
+
"""
|
|
388
|
+
0 scenarios passed, 0 failed, 0 skipped, 2 untested
|
|
389
|
+
0 steps passed, 0 failed, 0 skipped, 4 undefined
|
|
390
|
+
"""
|
|
391
|
+
And the command output should contain:
|
|
392
|
+
"""
|
|
393
|
+
UNDEFINED STEPS[2]:
|
|
394
|
+
Given a step is undefined # features/scenario_outline_with_undefined.feature:3
|
|
395
|
+
When another step is undefined # features/scenario_outline_with_undefined.feature:4
|
|
396
|
+
"""
|
|
397
|
+
But the command output should not contain:
|
|
398
|
+
"""
|
|
399
|
+
UNDEFINED STEPS[2]:
|
|
400
|
+
Given a step is undefined # features/scenario_outline_with_undefined.feature:3
|
|
401
|
+
Given a step is undefined # features/scenario_outline_with_undefined.feature:3
|
|
402
|
+
When another step is undefined # features/scenario_outline_with_undefined.feature:4
|
|
403
|
+
When another step is undefined # features/scenario_outline_with_undefined.feature:4
|
|
404
|
+
"""
|