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,184 @@
|
|
|
1
|
+
@sequential
|
|
2
|
+
Feature: Runner should support a --dry-run option
|
|
3
|
+
|
|
4
|
+
As a tester
|
|
5
|
+
I want to check if behave tests are syntactically correct
|
|
6
|
+
And all step definitions exist
|
|
7
|
+
Before I actually run the tests (by executing steps).
|
|
8
|
+
|
|
9
|
+
. SPECIFICATION: Dry-run mode
|
|
10
|
+
. * Undefined steps are detected
|
|
11
|
+
. * Marks steps as "untested" or "undefined"
|
|
12
|
+
. * Marks scenarios as "untested"
|
|
13
|
+
. * Marks features as "untested"
|
|
14
|
+
. * Causes no failed scenarios, features
|
|
15
|
+
. * Causes failed test-run when undefined steps are found.
|
|
16
|
+
|
|
17
|
+
@setup
|
|
18
|
+
Scenario: Feature Setup
|
|
19
|
+
Given a new working directory
|
|
20
|
+
And a file named "features/steps/steps.py" with:
|
|
21
|
+
"""
|
|
22
|
+
from behave import step
|
|
23
|
+
|
|
24
|
+
@step('a step passes')
|
|
25
|
+
def step_passes(context):
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
@step('a step fails')
|
|
29
|
+
def step_fails(context):
|
|
30
|
+
assert False, "XFAIL"
|
|
31
|
+
"""
|
|
32
|
+
And a file named "features/alice.feature" with:
|
|
33
|
+
"""
|
|
34
|
+
Feature: Alice
|
|
35
|
+
|
|
36
|
+
@selected
|
|
37
|
+
Scenario: A1
|
|
38
|
+
Given a step passes
|
|
39
|
+
When a step passes
|
|
40
|
+
Then a step passes
|
|
41
|
+
|
|
42
|
+
@other_selected
|
|
43
|
+
Scenario: A2
|
|
44
|
+
Given a step passes
|
|
45
|
+
When a step fails
|
|
46
|
+
Then a step passes
|
|
47
|
+
|
|
48
|
+
@selected
|
|
49
|
+
Scenario: A3
|
|
50
|
+
Given a step passes
|
|
51
|
+
|
|
52
|
+
@selected
|
|
53
|
+
Scenario: A4
|
|
54
|
+
Given a step fails
|
|
55
|
+
"""
|
|
56
|
+
And a file named "features/bob.feature" with:
|
|
57
|
+
"""
|
|
58
|
+
Feature: Bob
|
|
59
|
+
Scenario: B1
|
|
60
|
+
Given a step passes
|
|
61
|
+
When a step passes
|
|
62
|
+
Then a step passes
|
|
63
|
+
|
|
64
|
+
Scenario: B2
|
|
65
|
+
Given a step passes
|
|
66
|
+
When a step fails
|
|
67
|
+
Then a step passes
|
|
68
|
+
"""
|
|
69
|
+
And a file named "features/undefined_steps.feature" with:
|
|
70
|
+
"""
|
|
71
|
+
Feature: Undefined Steps
|
|
72
|
+
|
|
73
|
+
@selected
|
|
74
|
+
Scenario: U1
|
|
75
|
+
Given a step passes
|
|
76
|
+
When a step is undefined
|
|
77
|
+
Then a step fails
|
|
78
|
+
|
|
79
|
+
@other_selected
|
|
80
|
+
Scenario: U2 fails
|
|
81
|
+
Given a step is undefined
|
|
82
|
+
When a step passes
|
|
83
|
+
And a step fails
|
|
84
|
+
Then a step is undefined
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
Scenario: Dry-run one feature should mark feature/scenarios/steps as untested
|
|
89
|
+
When I run "behave -f plain --dry-run features/alice.feature"
|
|
90
|
+
Then it should pass with:
|
|
91
|
+
"""
|
|
92
|
+
0 features passed, 0 failed, 0 skipped, 1 untested
|
|
93
|
+
0 scenarios passed, 0 failed, 0 skipped, 4 untested
|
|
94
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 8 untested
|
|
95
|
+
"""
|
|
96
|
+
And the command output should contain
|
|
97
|
+
"""
|
|
98
|
+
Scenario: A1
|
|
99
|
+
"""
|
|
100
|
+
And the command output should contain:
|
|
101
|
+
"""
|
|
102
|
+
Scenario: A2
|
|
103
|
+
"""
|
|
104
|
+
And the command output should contain:
|
|
105
|
+
"""
|
|
106
|
+
Scenario: A3
|
|
107
|
+
"""
|
|
108
|
+
And the command output should contain:
|
|
109
|
+
"""
|
|
110
|
+
Scenario: A4
|
|
111
|
+
"""
|
|
112
|
+
And note that "all scenarios of this feature are contained"
|
|
113
|
+
|
|
114
|
+
Scenario: Dry-run one feature with tags should mark skipped scenario/steps as skipped
|
|
115
|
+
When I run "behave -f plain --dry-run --tags=@selected --no-skipped features/alice.feature"
|
|
116
|
+
Then it should pass with:
|
|
117
|
+
"""
|
|
118
|
+
0 features passed, 0 failed, 0 skipped, 1 untested
|
|
119
|
+
0 scenarios passed, 0 failed, 1 skipped, 3 untested
|
|
120
|
+
0 steps passed, 0 failed, 3 skipped, 0 undefined, 5 untested
|
|
121
|
+
"""
|
|
122
|
+
And the command output should contain:
|
|
123
|
+
"""
|
|
124
|
+
Scenario: A1
|
|
125
|
+
"""
|
|
126
|
+
And the command output should contain:
|
|
127
|
+
"""
|
|
128
|
+
Scenario: A3
|
|
129
|
+
"""
|
|
130
|
+
And the command output should contain:
|
|
131
|
+
"""
|
|
132
|
+
Scenario: A4
|
|
133
|
+
"""
|
|
134
|
+
But the command output should not contain:
|
|
135
|
+
"""
|
|
136
|
+
Scenario: A2
|
|
137
|
+
"""
|
|
138
|
+
And note that "only tagged scenarios of this feature are contained (3 of 4)"
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
Scenario: Dry-run two features
|
|
142
|
+
When I run "behave --dry-run features/alice.feature features/bob.feature"
|
|
143
|
+
Then it should pass with:
|
|
144
|
+
"""
|
|
145
|
+
0 features passed, 0 failed, 0 skipped, 2 untested
|
|
146
|
+
0 scenarios passed, 0 failed, 0 skipped, 6 untested
|
|
147
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 14 untested
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
Scenario: Dry-run one feature with undefined steps
|
|
151
|
+
When I run "behave --dry-run features/undefined_steps.feature"
|
|
152
|
+
Then it should fail with:
|
|
153
|
+
"""
|
|
154
|
+
0 features passed, 0 failed, 0 skipped, 1 untested
|
|
155
|
+
0 scenarios passed, 0 failed, 0 skipped, 2 untested
|
|
156
|
+
0 steps passed, 0 failed, 0 skipped, 3 undefined, 4 untested
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
Scenario: Dry-run two features, one with undefined steps
|
|
160
|
+
When I run "behave --dry-run features/alice.feature features/undefined_steps.feature"
|
|
161
|
+
Then it should fail with:
|
|
162
|
+
"""
|
|
163
|
+
0 features passed, 0 failed, 0 skipped, 2 untested
|
|
164
|
+
0 scenarios passed, 0 failed, 0 skipped, 6 untested
|
|
165
|
+
0 steps passed, 0 failed, 0 skipped, 3 undefined, 12 untested
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
Scenario: Dry-run two features, one with undefined steps and use tags
|
|
169
|
+
When I run "behave --dry-run --tags=@selected features/alice.feature features/undefined_steps.feature"
|
|
170
|
+
Then it should fail with:
|
|
171
|
+
"""
|
|
172
|
+
0 features passed, 0 failed, 0 skipped, 2 untested
|
|
173
|
+
0 scenarios passed, 0 failed, 2 skipped, 4 untested
|
|
174
|
+
0 steps passed, 0 failed, 7 skipped, 1 undefined, 7 untested
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
Scenario: Dry-run two features, one with undefined steps and use other tags
|
|
178
|
+
When I run "behave --dry-run --tags=@other_selected features/alice.feature features/undefined_steps.feature"
|
|
179
|
+
Then it should fail with:
|
|
180
|
+
"""
|
|
181
|
+
0 features passed, 0 failed, 0 skipped, 2 untested
|
|
182
|
+
0 scenarios passed, 0 failed, 4 skipped, 2 untested
|
|
183
|
+
0 steps passed, 0 failed, 8 skipped, 2 undefined, 5 untested
|
|
184
|
+
"""
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
@sequential
|
|
2
|
+
Feature: Feature Listfile (List of feature filenames/directories)
|
|
3
|
+
|
|
4
|
+
As a tester
|
|
5
|
+
I want to run a list of features together
|
|
6
|
+
And I do not want to provide the list each time
|
|
7
|
+
But provide a text file that contains the list of features.
|
|
8
|
+
|
|
9
|
+
. SPECIFICATION: behave file args
|
|
10
|
+
. * Prepend an '@' char (AT) to the feature configfile name to classify it.
|
|
11
|
+
.
|
|
12
|
+
. SPECIFICATION: Feature listfile (text file)
|
|
13
|
+
. * Each line contains a feature filename or directory with features
|
|
14
|
+
. * Feature filenames/dirnames are relative to the feature configfile
|
|
15
|
+
. * Empty lines are removed while reading
|
|
16
|
+
. * Comment lines are removed while reading (start with '#' char)
|
|
17
|
+
. * Wildcards are expanded to select 0..N files or directories.
|
|
18
|
+
. * Wildcards for file locations are not supported (only filenames or dirs).
|
|
19
|
+
.
|
|
20
|
+
. SPECIFICATION: Runner
|
|
21
|
+
. * Feature configfile with unknown/not found feature files
|
|
22
|
+
. cause runner to fail.
|
|
23
|
+
.
|
|
24
|
+
. NOTE: Also supported by Cucumber.
|
|
25
|
+
. RELATED: issue #75
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@setup
|
|
29
|
+
Scenario: Test Setup
|
|
30
|
+
Given a new working directory
|
|
31
|
+
And a file named "features/steps/steps.py" with:
|
|
32
|
+
"""
|
|
33
|
+
from behave import step
|
|
34
|
+
|
|
35
|
+
@step('a step passes')
|
|
36
|
+
def step_passes(context):
|
|
37
|
+
pass
|
|
38
|
+
"""
|
|
39
|
+
And a file named "features/alice.feature" with:
|
|
40
|
+
"""
|
|
41
|
+
Feature: Alice
|
|
42
|
+
Scenario:
|
|
43
|
+
Given a step passes
|
|
44
|
+
"""
|
|
45
|
+
And a file named "features/bob.feature" with:
|
|
46
|
+
"""
|
|
47
|
+
Feature: Bob
|
|
48
|
+
Scenario:
|
|
49
|
+
Given a step passes
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
Scenario: Use @feature_listfile in WORKDIR directory (above features/)
|
|
54
|
+
Given a file named "alice_and_bob2.txt" with:
|
|
55
|
+
"""
|
|
56
|
+
features/alice.feature
|
|
57
|
+
features/bob.feature
|
|
58
|
+
"""
|
|
59
|
+
When I run "behave @alice_and_bob2.txt"
|
|
60
|
+
Then it should pass with:
|
|
61
|
+
"""
|
|
62
|
+
2 features passed, 0 failed, 0 skipped
|
|
63
|
+
2 scenarios passed, 0 failed, 0 skipped
|
|
64
|
+
2 steps passed, 0 failed, 0 skipped, 0 undefined
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
Scenario: Use @feature_listfile in features/ subdirectory (Case 2)
|
|
69
|
+
Given a file named "features/alice_and_bob.txt" with:
|
|
70
|
+
"""
|
|
71
|
+
alice.feature
|
|
72
|
+
bob.feature
|
|
73
|
+
"""
|
|
74
|
+
When I run "behave @features/alice_and_bob.txt"
|
|
75
|
+
Then it should pass with:
|
|
76
|
+
"""
|
|
77
|
+
2 features passed, 0 failed, 0 skipped
|
|
78
|
+
2 scenarios passed, 0 failed, 0 skipped
|
|
79
|
+
2 steps passed, 0 failed, 0 skipped, 0 undefined
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
Scenario: Use @feature_listfile with some empty lines
|
|
83
|
+
Given a file named "features/alice_and_bob_with_empty_lines.txt" with:
|
|
84
|
+
"""
|
|
85
|
+
alice.feature
|
|
86
|
+
|
|
87
|
+
bob.feature
|
|
88
|
+
"""
|
|
89
|
+
When I run "behave @features/alice_and_bob_with_empty_lines.txt"
|
|
90
|
+
Then it should pass with:
|
|
91
|
+
"""
|
|
92
|
+
2 features passed, 0 failed, 0 skipped
|
|
93
|
+
2 scenarios passed, 0 failed, 0 skipped
|
|
94
|
+
2 steps passed, 0 failed, 0 skipped, 0 undefined
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
Scenario: Use @feature_listfile with some comment lines
|
|
98
|
+
Given a file named "features/alice_and_bob_with_comment_lines.txt" with:
|
|
99
|
+
"""
|
|
100
|
+
alice.feature
|
|
101
|
+
# -- USE: bob (comment line)
|
|
102
|
+
bob.feature
|
|
103
|
+
"""
|
|
104
|
+
When I run "behave @features/alice_and_bob_with_comment_lines.txt"
|
|
105
|
+
Then it should pass with:
|
|
106
|
+
"""
|
|
107
|
+
2 features passed, 0 failed, 0 skipped
|
|
108
|
+
2 scenarios passed, 0 failed, 0 skipped
|
|
109
|
+
2 steps passed, 0 failed, 0 skipped, 0 undefined
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
Scenario: Use @feature_listfile with wildcards (Case 1)
|
|
113
|
+
|
|
114
|
+
Use feature list-file with wildcard pattern to select features.
|
|
115
|
+
|
|
116
|
+
Given a file named "with_wildcard_feature.txt" with:
|
|
117
|
+
"""
|
|
118
|
+
features/a*.feature
|
|
119
|
+
"""
|
|
120
|
+
When I run "behave -f plain --no-timings @with_wildcard_feature.txt"
|
|
121
|
+
Then it should pass with:
|
|
122
|
+
"""
|
|
123
|
+
1 feature passed, 0 failed, 0 skipped
|
|
124
|
+
1 scenario passed, 0 failed, 0 skipped
|
|
125
|
+
"""
|
|
126
|
+
And the command output should contain:
|
|
127
|
+
"""
|
|
128
|
+
Feature: Alice
|
|
129
|
+
|
|
130
|
+
Scenario:
|
|
131
|
+
Given a step passes ... passed
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
Scenario: Use @feature_listfile with wildcards (Case 2)
|
|
135
|
+
|
|
136
|
+
Use feature list-file with:
|
|
137
|
+
- normal filename
|
|
138
|
+
- wildcard pattern to select features
|
|
139
|
+
|
|
140
|
+
Given a file named "with_wildcard_feature2.txt" with:
|
|
141
|
+
"""
|
|
142
|
+
features/alice.feature
|
|
143
|
+
features/b*.feature
|
|
144
|
+
"""
|
|
145
|
+
When I run "behave -f plain --no-timings @with_wildcard_feature2.txt"
|
|
146
|
+
Then it should pass with:
|
|
147
|
+
"""
|
|
148
|
+
2 features passed, 0 failed, 0 skipped
|
|
149
|
+
2 scenarios passed, 0 failed, 0 skipped
|
|
150
|
+
"""
|
|
151
|
+
And the command output should contain:
|
|
152
|
+
"""
|
|
153
|
+
Feature: Alice
|
|
154
|
+
|
|
155
|
+
Scenario:
|
|
156
|
+
Given a step passes ... passed
|
|
157
|
+
|
|
158
|
+
Feature: Bob
|
|
159
|
+
|
|
160
|
+
Scenario:
|
|
161
|
+
Given a step passes ... passed
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
Scenario: Use @feature_listfile with wildcards for file location (not supported)
|
|
165
|
+
|
|
166
|
+
Note that wildcards are not supported when file locations are used.
|
|
167
|
+
|
|
168
|
+
Given a file named "with_wildcard_location.txt" with:
|
|
169
|
+
"""
|
|
170
|
+
features/a*.feature:3
|
|
171
|
+
"""
|
|
172
|
+
When I run "behave -f plain --no-timings @with_wildcard_location.txt"
|
|
173
|
+
Then it should fail with:
|
|
174
|
+
"""
|
|
175
|
+
ConfigError: No steps directory in '{__WORKDIR__}'
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
Scenario: Use empty @feature_listfile (Case 1)
|
|
180
|
+
Given an empty file named "empty.txt"
|
|
181
|
+
When I run "behave @empty.txt"
|
|
182
|
+
Then it should fail with:
|
|
183
|
+
"""
|
|
184
|
+
No steps directory in '{__WORKDIR__}'
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
Scenario: Use empty @feature_listfile in features subdirectory (Case 2)
|
|
188
|
+
Given an empty file named "features/empty.txt"
|
|
189
|
+
When I run "behave @features/empty.txt"
|
|
190
|
+
Then it should pass with:
|
|
191
|
+
"""
|
|
192
|
+
0 features passed, 0 failed, 0 skipped
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
Scenario: Use @feature_listfile with unknown feature file (Case 1)
|
|
196
|
+
Given a file named "with_unknown_feature.txt" with:
|
|
197
|
+
"""
|
|
198
|
+
features/alice.feature
|
|
199
|
+
features/UNKNOWN.feature
|
|
200
|
+
"""
|
|
201
|
+
When I run "behave @with_unknown_feature.txt"
|
|
202
|
+
Then it should fail with:
|
|
203
|
+
"""
|
|
204
|
+
Error: [Errno 2] No such file or directory: '{__WORKDIR__}/features/UNKNOWN.feature'
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
Scenario: Use @feature_listfile with unknown feature file (Case 2)
|
|
208
|
+
Given a file named "features/with_unknown_feature2.txt" with:
|
|
209
|
+
"""
|
|
210
|
+
UNKNOWN.feature
|
|
211
|
+
"""
|
|
212
|
+
When I run "behave @features/with_unknown_feature2.txt"
|
|
213
|
+
Then it should fail with:
|
|
214
|
+
"""
|
|
215
|
+
Error: [Errno 2] No such file or directory: '{__WORKDIR__}/features/UNKNOWN.feature'
|
|
216
|
+
"""
|
|
217
|
+
|
|
218
|
+
Scenario: Use unknown @feature_listfile
|
|
219
|
+
When I run "behave @unknown_feature_configfile.txt"
|
|
220
|
+
Then it should fail with:
|
|
221
|
+
"""
|
|
222
|
+
FileNotFoundError: unknown_feature_configfile.txt
|
|
223
|
+
"""
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
Feature: Hooks processing in case of errors (exceptions)
|
|
2
|
+
|
|
3
|
+
. SPECIFICATION:
|
|
4
|
+
. * Hook errors in before_all/after_all hook aborts the test run (and fail).
|
|
5
|
+
. * Hook errors in before_feature/after_feature causes the feature to fail.
|
|
6
|
+
. * Hook errors in before_feature causes feature scenarios to be skipped (untested).
|
|
7
|
+
. * Hook errors in before_scenario/after_scenario causes the scenario to fail.
|
|
8
|
+
. * Hook errors in before_scenario causes scenario steps to be skipped (untested).
|
|
9
|
+
. * Hook errors in before_step/after_step causes step to fail.
|
|
10
|
+
. * Hook errors in before_tag/after_tag of a feature causes feature to fail.
|
|
11
|
+
. * Hook errors in before_tag/after_tag of a scenario causes scenario to fail.
|
|
12
|
+
. * If a hook error occurs in a "before_xxx" hook,
|
|
13
|
+
. then the "after_xxx" hook will also be called (to cleanup some stuff).
|
|
14
|
+
.
|
|
15
|
+
. NOTE:
|
|
16
|
+
. The --verbose flag can be used to show the exception traceback.
|
|
17
|
+
|
|
18
|
+
@setup
|
|
19
|
+
Scenario: Feature Setup
|
|
20
|
+
Given a new working directory
|
|
21
|
+
And a file named "features/steps/steps.py" with:
|
|
22
|
+
"""
|
|
23
|
+
from behave import step
|
|
24
|
+
|
|
25
|
+
@step(u'{word:w} step passes')
|
|
26
|
+
def step(context, word):
|
|
27
|
+
pass
|
|
28
|
+
"""
|
|
29
|
+
And a file named "features/passing.feature" with:
|
|
30
|
+
"""
|
|
31
|
+
@foo
|
|
32
|
+
Feature: Alice
|
|
33
|
+
@soo
|
|
34
|
+
Scenario: A1
|
|
35
|
+
Given a step passes
|
|
36
|
+
"""
|
|
37
|
+
And a file named "features/environment.py" with:
|
|
38
|
+
"""
|
|
39
|
+
from __future__ import print_function
|
|
40
|
+
|
|
41
|
+
def cause_hook_to_fail():
|
|
42
|
+
raise RuntimeError("FAIL")
|
|
43
|
+
|
|
44
|
+
def before_all(context):
|
|
45
|
+
userdata = context.config.userdata
|
|
46
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_all":
|
|
47
|
+
cause_hook_to_fail()
|
|
48
|
+
|
|
49
|
+
def after_all(context):
|
|
50
|
+
userdata = context.config.userdata
|
|
51
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_all":
|
|
52
|
+
print("called_hook:after_all")
|
|
53
|
+
if userdata.get("HOOK_ERROR_LOC") == "after_all":
|
|
54
|
+
cause_hook_to_fail()
|
|
55
|
+
|
|
56
|
+
def before_feature(context, feature):
|
|
57
|
+
userdata = context.config.userdata
|
|
58
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_feature":
|
|
59
|
+
cause_hook_to_fail()
|
|
60
|
+
|
|
61
|
+
def after_feature(context, feature):
|
|
62
|
+
userdata = context.config.userdata
|
|
63
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_feature":
|
|
64
|
+
print("called_hook:after_feature")
|
|
65
|
+
if userdata.get("HOOK_ERROR_LOC") == "after_feature":
|
|
66
|
+
cause_hook_to_fail()
|
|
67
|
+
|
|
68
|
+
def before_scenario(context, scenario):
|
|
69
|
+
userdata = context.config.userdata
|
|
70
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_scenario":
|
|
71
|
+
cause_hook_to_fail()
|
|
72
|
+
|
|
73
|
+
def after_scenario(context, scenario):
|
|
74
|
+
userdata = context.config.userdata
|
|
75
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_scenario":
|
|
76
|
+
print("called_hook:after_scenario")
|
|
77
|
+
if userdata.get("HOOK_ERROR_LOC") == "after_scenario":
|
|
78
|
+
cause_hook_to_fail()
|
|
79
|
+
|
|
80
|
+
def before_step(context, step):
|
|
81
|
+
userdata = context.config.userdata
|
|
82
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_step":
|
|
83
|
+
cause_hook_to_fail()
|
|
84
|
+
|
|
85
|
+
def after_step(context, step):
|
|
86
|
+
userdata = context.config.userdata
|
|
87
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_step":
|
|
88
|
+
print("called_hook:after_step")
|
|
89
|
+
if userdata.get("HOOK_ERROR_LOC") == "after_step":
|
|
90
|
+
cause_hook_to_fail()
|
|
91
|
+
|
|
92
|
+
def before_tag(context, tag):
|
|
93
|
+
userdata = context.config.userdata
|
|
94
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_tag":
|
|
95
|
+
error_tag = userdata.get("HOOK_ERROR_TAG")
|
|
96
|
+
if not error_tag or tag == error_tag:
|
|
97
|
+
cause_hook_to_fail()
|
|
98
|
+
|
|
99
|
+
def after_tag(context, tag):
|
|
100
|
+
userdata = context.config.userdata
|
|
101
|
+
if userdata.get("HOOK_ERROR_LOC") == "before_tag":
|
|
102
|
+
error_tag = userdata.get("HOOK_ERROR_TAG")
|
|
103
|
+
if tag == error_tag:
|
|
104
|
+
print("called_hook:after_tag: tag=%s" % tag)
|
|
105
|
+
if userdata.get("HOOK_ERROR_LOC") == "after_tag":
|
|
106
|
+
error_tag = userdata.get("HOOK_ERROR_TAG")
|
|
107
|
+
if not error_tag or tag == error_tag:
|
|
108
|
+
cause_hook_to_fail()
|
|
109
|
+
"""
|
|
110
|
+
And a file named "behave.ini" with:
|
|
111
|
+
"""
|
|
112
|
+
[behave]
|
|
113
|
+
show_skipped = false
|
|
114
|
+
show_timings = false
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@hook.before_all
|
|
119
|
+
Scenario: Hook error in before_all
|
|
120
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_all features/passing.feature"
|
|
121
|
+
Then it should fail with
|
|
122
|
+
"""
|
|
123
|
+
HOOK-ERROR in before_all: RuntimeError: FAIL
|
|
124
|
+
|
|
125
|
+
ABORTED: By user.
|
|
126
|
+
called_hook:after_all
|
|
127
|
+
0 features passed, 0 failed, 0 skipped, 1 untested
|
|
128
|
+
0 scenarios passed, 0 failed, 0 skipped, 1 untested
|
|
129
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 1 untested
|
|
130
|
+
"""
|
|
131
|
+
But note that "the after_all hook is called, too"
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@hook.after_all
|
|
135
|
+
Scenario: Hook error in after_all
|
|
136
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_all features/passing.feature"
|
|
137
|
+
Then it should fail with:
|
|
138
|
+
"""
|
|
139
|
+
Feature: Alice
|
|
140
|
+
|
|
141
|
+
Scenario: A1
|
|
142
|
+
Given a step passes ... passed
|
|
143
|
+
|
|
144
|
+
HOOK-ERROR in after_all: RuntimeError: FAIL
|
|
145
|
+
1 feature passed, 0 failed, 0 skipped
|
|
146
|
+
1 scenario passed, 0 failed, 0 skipped
|
|
147
|
+
1 step passed, 0 failed, 0 skipped, 0 undefined
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@hook.before_feature
|
|
152
|
+
Scenario: Hook error in before_feature
|
|
153
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_feature features/passing.feature"
|
|
154
|
+
Then it should fail with:
|
|
155
|
+
"""
|
|
156
|
+
HOOK-ERROR in before_feature: RuntimeError: FAIL
|
|
157
|
+
Feature: Alice
|
|
158
|
+
called_hook:after_feature
|
|
159
|
+
|
|
160
|
+
0 features passed, 1 failed, 0 skipped
|
|
161
|
+
0 scenarios passed, 0 failed, 0 skipped, 1 untested
|
|
162
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 1 untested
|
|
163
|
+
"""
|
|
164
|
+
But note that "the after_feature hook is called, too."
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@hook.after_feature
|
|
168
|
+
Scenario: Hook error in after_feature
|
|
169
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_feature features/passing.feature"
|
|
170
|
+
Then it should fail with:
|
|
171
|
+
"""
|
|
172
|
+
Feature: Alice
|
|
173
|
+
Scenario: A1
|
|
174
|
+
Given a step passes ... passed
|
|
175
|
+
HOOK-ERROR in after_feature: RuntimeError: FAIL
|
|
176
|
+
|
|
177
|
+
0 features passed, 1 failed, 0 skipped
|
|
178
|
+
1 scenario passed, 0 failed, 0 skipped
|
|
179
|
+
1 step passed, 0 failed, 0 skipped, 0 undefined
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
@hook.before_scenario
|
|
184
|
+
Scenario: Hook error in before_scenario
|
|
185
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_scenario features/passing.feature"
|
|
186
|
+
Then it should fail with:
|
|
187
|
+
"""
|
|
188
|
+
Feature: Alice
|
|
189
|
+
|
|
190
|
+
HOOK-ERROR in before_scenario: RuntimeError: FAIL
|
|
191
|
+
Scenario: A1
|
|
192
|
+
called_hook:after_scenario
|
|
193
|
+
|
|
194
|
+
Failing scenarios:
|
|
195
|
+
features/passing.feature:4 A1
|
|
196
|
+
|
|
197
|
+
0 features passed, 1 failed, 0 skipped
|
|
198
|
+
0 scenarios passed, 1 failed, 0 skipped
|
|
199
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 1 untested
|
|
200
|
+
"""
|
|
201
|
+
But note that "the after_scenario hook is called, too."
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@hook.after_scenario
|
|
205
|
+
Scenario: Hook error in after_scenario
|
|
206
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_scenario features/passing.feature"
|
|
207
|
+
Then it should fail with:
|
|
208
|
+
"""
|
|
209
|
+
Feature: Alice
|
|
210
|
+
|
|
211
|
+
Scenario: A1
|
|
212
|
+
Given a step passes ... passed
|
|
213
|
+
HOOK-ERROR in after_scenario: RuntimeError: FAIL
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
Failing scenarios:
|
|
217
|
+
features/passing.feature:4 A1
|
|
218
|
+
|
|
219
|
+
0 features passed, 1 failed, 0 skipped
|
|
220
|
+
0 scenarios passed, 1 failed, 0 skipped
|
|
221
|
+
1 step passed, 0 failed, 0 skipped, 0 undefined
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
@hook.before_step
|
|
225
|
+
Scenario: Hook error in before_step
|
|
226
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_step features/passing.feature"
|
|
227
|
+
Then it should fail with:
|
|
228
|
+
"""
|
|
229
|
+
Feature: Alice
|
|
230
|
+
|
|
231
|
+
Scenario: A1
|
|
232
|
+
Given a step passes ... failed
|
|
233
|
+
|
|
234
|
+
Captured stdout:
|
|
235
|
+
HOOK-ERROR in before_step: RuntimeError: FAIL
|
|
236
|
+
called_hook:after_step
|
|
237
|
+
|
|
238
|
+
Failing scenarios:
|
|
239
|
+
features/passing.feature:4 A1
|
|
240
|
+
|
|
241
|
+
0 features passed, 1 failed, 0 skipped
|
|
242
|
+
0 scenarios passed, 1 failed, 0 skipped
|
|
243
|
+
0 steps passed, 1 failed, 0 skipped, 0 undefined
|
|
244
|
+
"""
|
|
245
|
+
But note that "the after_step hook is called, too."
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
@hook.after_step
|
|
249
|
+
Scenario: Hook error in after_step
|
|
250
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_step features/passing.feature"
|
|
251
|
+
Then it should fail with:
|
|
252
|
+
"""
|
|
253
|
+
Feature: Alice
|
|
254
|
+
|
|
255
|
+
Scenario: A1
|
|
256
|
+
Given a step passes ... failed
|
|
257
|
+
|
|
258
|
+
Captured stdout:
|
|
259
|
+
HOOK-ERROR in after_step: RuntimeError: FAIL
|
|
260
|
+
|
|
261
|
+
Failing scenarios:
|
|
262
|
+
features/passing.feature:4 A1
|
|
263
|
+
|
|
264
|
+
0 features passed, 1 failed, 0 skipped
|
|
265
|
+
0 scenarios passed, 1 failed, 0 skipped
|
|
266
|
+
0 steps passed, 1 failed, 0 skipped, 0 undefined
|
|
267
|
+
"""
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
@hook.before_tag
|
|
271
|
+
Scenario: Hook error in before_tag for feature
|
|
272
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_tag -D HOOK_ERROR_TAG=foo features/passing.feature"
|
|
273
|
+
Then it should fail with:
|
|
274
|
+
"""
|
|
275
|
+
HOOK-ERROR in before_tag(tag=foo): RuntimeError: FAIL
|
|
276
|
+
Feature: Alice
|
|
277
|
+
called_hook:after_tag: tag=foo
|
|
278
|
+
|
|
279
|
+
0 features passed, 1 failed, 0 skipped
|
|
280
|
+
0 scenarios passed, 0 failed, 0 skipped, 1 untested
|
|
281
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 1 untested
|
|
282
|
+
"""
|
|
283
|
+
And the command output should contain:
|
|
284
|
+
"""
|
|
285
|
+
HOOK-ERROR in before_tag(tag=foo): RuntimeError: FAIL
|
|
286
|
+
Feature: Alice
|
|
287
|
+
"""
|
|
288
|
+
But note that "the hook-error in before_tag of the feature causes it to fail and be skipped (untested)"
|
|
289
|
+
And note that "the after_tag hook is still called"
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
@hook.after_tag
|
|
293
|
+
Scenario: Hook error in after_tag for feature
|
|
294
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_tag -D HOOK_ERROR_TAG=foo features/passing.feature"
|
|
295
|
+
Then it should fail with:
|
|
296
|
+
"""
|
|
297
|
+
Feature: Alice
|
|
298
|
+
|
|
299
|
+
Scenario: A1
|
|
300
|
+
Given a step passes ... passed
|
|
301
|
+
HOOK-ERROR in after_tag(tag=foo): RuntimeError: FAIL
|
|
302
|
+
|
|
303
|
+
0 features passed, 1 failed, 0 skipped
|
|
304
|
+
1 scenario passed, 0 failed, 0 skipped
|
|
305
|
+
1 step passed, 0 failed, 0 skipped, 0 undefined
|
|
306
|
+
"""
|
|
307
|
+
But note that "the hook-error in after_tag of the scenario causes it to fail"
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
@hook.before_tag
|
|
311
|
+
Scenario: Hook error in before_tag for scenario
|
|
312
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_tag -D HOOK_ERROR_TAG=soo features/passing.feature"
|
|
313
|
+
Then it should fail with:
|
|
314
|
+
"""
|
|
315
|
+
Feature: Alice
|
|
316
|
+
HOOK-ERROR in before_tag(tag=soo): RuntimeError: FAIL
|
|
317
|
+
Scenario: A1
|
|
318
|
+
called_hook:after_tag: tag=soo
|
|
319
|
+
|
|
320
|
+
Failing scenarios:
|
|
321
|
+
features/passing.feature:4 A1
|
|
322
|
+
|
|
323
|
+
0 features passed, 1 failed, 0 skipped
|
|
324
|
+
0 scenarios passed, 1 failed, 0 skipped
|
|
325
|
+
0 steps passed, 0 failed, 0 skipped, 0 undefined, 1 untested
|
|
326
|
+
"""
|
|
327
|
+
But note that "the hook-error in before_tag of the scenario causes it to fail and be skipped (untested)"
|
|
328
|
+
And note that "the after_tag hook is still called"
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
@hook.after_tag
|
|
332
|
+
Scenario: Hook error in after_tag for scenario
|
|
333
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_tag -D HOOK_ERROR_TAG=soo features/passing.feature"
|
|
334
|
+
Then it should fail with:
|
|
335
|
+
"""
|
|
336
|
+
Feature: Alice
|
|
337
|
+
|
|
338
|
+
Scenario: A1
|
|
339
|
+
Given a step passes ... passed
|
|
340
|
+
HOOK-ERROR in after_tag(tag=soo): RuntimeError: FAIL
|
|
341
|
+
|
|
342
|
+
Failing scenarios:
|
|
343
|
+
features/passing.feature:4 A1
|
|
344
|
+
|
|
345
|
+
0 features passed, 1 failed, 0 skipped
|
|
346
|
+
0 scenarios passed, 1 failed, 0 skipped
|
|
347
|
+
1 step passed, 0 failed, 0 skipped, 0 undefined
|
|
348
|
+
"""
|
|
349
|
+
But note that "the hook-error in after_tag of the scenario causes it to fail"
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
@skipped.hook.after_feature
|
|
353
|
+
Scenario: Skipped feature with potential hook error (hooks are not run)
|
|
354
|
+
|
|
355
|
+
This goes unnoticed because hooks are not run for a skipped feature/scenario.
|
|
356
|
+
NOTE: Except if before_feature(), before_scenario() hook skips the feature/scenario.
|
|
357
|
+
|
|
358
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=after_feature -t ~@foo features/passing.feature"
|
|
359
|
+
Then it should pass with:
|
|
360
|
+
"""
|
|
361
|
+
0 features passed, 0 failed, 1 skipped
|
|
362
|
+
0 scenarios passed, 0 failed, 1 skipped
|
|
363
|
+
0 steps passed, 0 failed, 1 skipped, 0 undefined
|
|
364
|
+
"""
|
|
365
|
+
But note that "hooks are not executed for skipped features/scenarios"
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
Scenario: Show hook error details (traceback)
|
|
369
|
+
When I run "behave -f plain -D HOOK_ERROR_LOC=before_feature --verbose features/passing.feature"
|
|
370
|
+
Then it should fail with:
|
|
371
|
+
"""
|
|
372
|
+
HOOK-ERROR in before_feature: RuntimeError: FAIL
|
|
373
|
+
"""
|
|
374
|
+
And the command output should contain:
|
|
375
|
+
"""
|
|
376
|
+
self.hooks[name](context, *args)
|
|
377
|
+
File "features/environment.py", line 21, in before_feature
|
|
378
|
+
cause_hook_to_fail()
|
|
379
|
+
File "features/environment.py", line 4, in cause_hook_to_fail
|
|
380
|
+
raise RuntimeError("FAIL")
|
|
381
|
+
"""
|
|
382
|
+
But note that "the traceback caused by the hook-error is shown"
|