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
|
File without changes
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
from behave.model_core import Status
|
|
4
|
+
|
|
5
|
+
class Reporter(object):
|
|
6
|
+
"""
|
|
7
|
+
Base class for all reporters.
|
|
8
|
+
A reporter provides an extension point (variant point) for the runner logic.
|
|
9
|
+
A reporter is called after a model element is processed
|
|
10
|
+
(and its result status is known).
|
|
11
|
+
Otherwise, a reporter is similar to a formatter, but it has a simpler API.
|
|
12
|
+
|
|
13
|
+
Processing Logic (simplified)::
|
|
14
|
+
|
|
15
|
+
config.reporters = ... #< Configuration (and provision).
|
|
16
|
+
runner.run():
|
|
17
|
+
for feature in runner.features:
|
|
18
|
+
feature.run() # And feature scenarios, too.
|
|
19
|
+
for reporter in config.reporters:
|
|
20
|
+
reporter.feature(feature)
|
|
21
|
+
# -- FINALLY:
|
|
22
|
+
for reporter in config.reporters:
|
|
23
|
+
reporter.end()
|
|
24
|
+
|
|
25
|
+
An existing formatter can be reused as reporter by using
|
|
26
|
+
:class:`behave.report.formatter_reporter.FormatterAsReporter`.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, config):
|
|
30
|
+
self.config = config
|
|
31
|
+
|
|
32
|
+
def feature(self, feature): # pylint: disable=no-self-use
|
|
33
|
+
"""
|
|
34
|
+
Called after a feature was processed.
|
|
35
|
+
|
|
36
|
+
:param feature: Feature object (as :class:`behave.model.Feature`)
|
|
37
|
+
"""
|
|
38
|
+
assert feature.status != Status.undefined
|
|
39
|
+
raise NotImplementedError
|
|
40
|
+
|
|
41
|
+
def end(self):
|
|
42
|
+
"""
|
|
43
|
+
Called after all model elements are processed (optional-hook).
|
|
44
|
+
"""
|
|
45
|
+
pass
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
|
2
|
+
# pylint: disable=line-too-long
|
|
3
|
+
"""
|
|
4
|
+
This module provides a reporter with JUnit XML output.
|
|
5
|
+
|
|
6
|
+
Mapping of behave model elements to XML elements::
|
|
7
|
+
|
|
8
|
+
feature -> xml_element:testsuite
|
|
9
|
+
scenario -> xml_element:testcase
|
|
10
|
+
|
|
11
|
+
XML document structure::
|
|
12
|
+
|
|
13
|
+
# -- XML elements:
|
|
14
|
+
# CARDINALITY SUFFIX:
|
|
15
|
+
# ? optional (zero or one)
|
|
16
|
+
# * many0 (zero or more)
|
|
17
|
+
# + many (one or more)
|
|
18
|
+
testsuites := sequence<testsuite>
|
|
19
|
+
testsuite:
|
|
20
|
+
properties? : sequence<property>
|
|
21
|
+
testcase* :
|
|
22
|
+
error? : text
|
|
23
|
+
failure? : text
|
|
24
|
+
system-out : text
|
|
25
|
+
system-err : text
|
|
26
|
+
|
|
27
|
+
testsuite:
|
|
28
|
+
@name : TokenString
|
|
29
|
+
@tests : int
|
|
30
|
+
@failures : int
|
|
31
|
+
@errors : int
|
|
32
|
+
@skipped : int
|
|
33
|
+
@time : Decimal # Duration in seconds
|
|
34
|
+
# -- SINCE: behave-1.2.6
|
|
35
|
+
@timestamp : IsoDateTime
|
|
36
|
+
@hostname : string
|
|
37
|
+
|
|
38
|
+
testcase:
|
|
39
|
+
@name : TokenString
|
|
40
|
+
@classname : TokenString
|
|
41
|
+
@status : string # Status enum
|
|
42
|
+
@time : Decimal # Elapsed seconds
|
|
43
|
+
|
|
44
|
+
error:
|
|
45
|
+
@message : string
|
|
46
|
+
@type : string
|
|
47
|
+
|
|
48
|
+
failure:
|
|
49
|
+
@message : string
|
|
50
|
+
@type : string
|
|
51
|
+
|
|
52
|
+
# -- HINT: Not used
|
|
53
|
+
property:
|
|
54
|
+
@name : TokenString
|
|
55
|
+
@value : string
|
|
56
|
+
|
|
57
|
+
type Status : Enum("passed", "failed", "skipped", "untested")
|
|
58
|
+
|
|
59
|
+
Note that a spec for JUnit XML output was not clearly defined.
|
|
60
|
+
Best sources are:
|
|
61
|
+
|
|
62
|
+
* `JUnit XML`_ (for PDF)
|
|
63
|
+
* JUnit XML (`ant spec 1`_, `ant spec 2`_)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
.. _`JUnit XML`: http://junitpdfreport.sourceforge.net/managedcontent/PdfTranslation
|
|
67
|
+
.. _`ant spec 1`: https://github.com/windyroad/JUnit-Schema
|
|
68
|
+
.. _`ant spec 2`: http://svn.apache.org/repos/asf/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java
|
|
69
|
+
"""
|
|
70
|
+
# pylint: enable=line-too-long
|
|
71
|
+
|
|
72
|
+
from __future__ import absolute_import
|
|
73
|
+
import os.path
|
|
74
|
+
import codecs
|
|
75
|
+
from xml.etree import ElementTree
|
|
76
|
+
from datetime import datetime
|
|
77
|
+
from behave.reporter.base import Reporter
|
|
78
|
+
from behave.model import Scenario, ScenarioOutline, Step
|
|
79
|
+
from behave.model_core import Status
|
|
80
|
+
from behave.formatter import ansi_escapes
|
|
81
|
+
from behave.model_describe import ModelDescriptor
|
|
82
|
+
from behave.textutil import indent, make_indentation, text as _text
|
|
83
|
+
import six
|
|
84
|
+
if six.PY2:
|
|
85
|
+
# -- USE: Python3 backport for better unicode compatibility.
|
|
86
|
+
import traceback2 as traceback
|
|
87
|
+
else:
|
|
88
|
+
import traceback
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def CDATA(text=None): # pylint: disable=invalid-name
|
|
92
|
+
# -- issue #70: remove_ansi_escapes(text)
|
|
93
|
+
element = ElementTree.Element('![CDATA[')
|
|
94
|
+
element.text = ansi_escapes.strip_escapes(text)
|
|
95
|
+
return element
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ElementTreeWithCDATA(ElementTree.ElementTree):
|
|
99
|
+
# pylint: disable=redefined-builtin, no-member
|
|
100
|
+
def _write(self, file, node, encoding, namespaces):
|
|
101
|
+
"""This method is for ElementTree <= 1.2.6"""
|
|
102
|
+
|
|
103
|
+
if node.tag == '![CDATA[':
|
|
104
|
+
text = node.text.encode(encoding)
|
|
105
|
+
file.write("\n<![CDATA[%s]]>\n" % text)
|
|
106
|
+
else:
|
|
107
|
+
ElementTree.ElementTree._write(self, file, node, encoding,
|
|
108
|
+
namespaces)
|
|
109
|
+
|
|
110
|
+
if hasattr(ElementTree, '_serialize'):
|
|
111
|
+
# pylint: disable=protected-access
|
|
112
|
+
def _serialize_xml2(write, elem, encoding, qnames, namespaces,
|
|
113
|
+
orig=ElementTree._serialize_xml):
|
|
114
|
+
if elem.tag == '![CDATA[':
|
|
115
|
+
write("\n<%s%s]]>\n" % \
|
|
116
|
+
(elem.tag, elem.text.encode(encoding, "xmlcharrefreplace")))
|
|
117
|
+
return
|
|
118
|
+
return orig(write, elem, encoding, qnames, namespaces)
|
|
119
|
+
|
|
120
|
+
def _serialize_xml3(write, elem, qnames, namespaces,
|
|
121
|
+
short_empty_elements=None,
|
|
122
|
+
orig=ElementTree._serialize_xml):
|
|
123
|
+
if elem.tag == '![CDATA[':
|
|
124
|
+
write("\n<{tag}{text}]]>\n".format(
|
|
125
|
+
tag=elem.tag, text=elem.text))
|
|
126
|
+
return
|
|
127
|
+
if short_empty_elements:
|
|
128
|
+
# python >=3.3
|
|
129
|
+
return orig(write, elem, qnames, namespaces, short_empty_elements)
|
|
130
|
+
else:
|
|
131
|
+
# python <3.3
|
|
132
|
+
return orig(write, elem, qnames, namespaces)
|
|
133
|
+
|
|
134
|
+
if six.PY3:
|
|
135
|
+
ElementTree._serialize_xml = \
|
|
136
|
+
ElementTree._serialize['xml'] = _serialize_xml3
|
|
137
|
+
elif six.PY2:
|
|
138
|
+
ElementTree._serialize_xml = \
|
|
139
|
+
ElementTree._serialize['xml'] = _serialize_xml2
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class FeatureReportData(object):
|
|
143
|
+
"""
|
|
144
|
+
Provides value object to collect JUnit report data from a Feature.
|
|
145
|
+
"""
|
|
146
|
+
def __init__(self, feature, filename, classname=None):
|
|
147
|
+
if not classname and filename:
|
|
148
|
+
classname = filename.replace('/', '.')
|
|
149
|
+
self.feature = feature
|
|
150
|
+
self.filename = filename
|
|
151
|
+
self.classname = classname
|
|
152
|
+
self.testcases = []
|
|
153
|
+
self.counts_tests = 0
|
|
154
|
+
self.counts_errors = 0
|
|
155
|
+
self.counts_failed = 0
|
|
156
|
+
self.counts_skipped = 0
|
|
157
|
+
|
|
158
|
+
def reset(self):
|
|
159
|
+
self.testcases = []
|
|
160
|
+
self.counts_tests = 0
|
|
161
|
+
self.counts_errors = 0
|
|
162
|
+
self.counts_failed = 0
|
|
163
|
+
self.counts_skipped = 0
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class JUnitReporter(Reporter):
|
|
167
|
+
"""Generates JUnit-like XML test report for behave.
|
|
168
|
+
"""
|
|
169
|
+
# -- XML REPORT:
|
|
170
|
+
userdata_scope = "behave.reporter.junit"
|
|
171
|
+
show_timings = True # -- Show step timings.
|
|
172
|
+
show_skipped_always = False
|
|
173
|
+
show_timestamp = True
|
|
174
|
+
show_hostname = True
|
|
175
|
+
# -- XML REPORT PART: Describe scenarios
|
|
176
|
+
show_scenarios = True # Show scenario descriptions.
|
|
177
|
+
show_tags = True
|
|
178
|
+
show_multiline = True
|
|
179
|
+
|
|
180
|
+
def __init__(self, config):
|
|
181
|
+
super(JUnitReporter, self).__init__(config)
|
|
182
|
+
self.setup_with_userdata(config.userdata)
|
|
183
|
+
|
|
184
|
+
def setup_with_userdata(self, userdata):
|
|
185
|
+
"""Setup JUnit reporter with userdata information.
|
|
186
|
+
A user can now tweak the output format of this reporter.
|
|
187
|
+
|
|
188
|
+
EXAMPLE:
|
|
189
|
+
.. code-block:: ini
|
|
190
|
+
|
|
191
|
+
# -- FILE: behave.ini
|
|
192
|
+
[behave.userdata]
|
|
193
|
+
behave.reporter.junit.show_hostname = false
|
|
194
|
+
"""
|
|
195
|
+
# -- EXPERIMENTAL:
|
|
196
|
+
option_names = [
|
|
197
|
+
"show_timings", "show_skipped_always",
|
|
198
|
+
"show_timestamp", "show_hostname",
|
|
199
|
+
"show_scenarios", "show_tags", "show_multiline",
|
|
200
|
+
]
|
|
201
|
+
for option_name in option_names:
|
|
202
|
+
name = "%s.%s" % (self.userdata_scope, option_name)
|
|
203
|
+
default_value = getattr(self, option_name)
|
|
204
|
+
value = userdata.getbool(name, default_value)
|
|
205
|
+
if value != default_value:
|
|
206
|
+
setattr(self, option_name, value)
|
|
207
|
+
|
|
208
|
+
def make_feature_filename(self, feature):
|
|
209
|
+
filename = None
|
|
210
|
+
for path in self.config.paths:
|
|
211
|
+
if feature.filename.startswith(path):
|
|
212
|
+
filename = feature.filename[len(path) + 1:]
|
|
213
|
+
break
|
|
214
|
+
if not filename:
|
|
215
|
+
# -- NOTE: Directory path (subdirs) are taken into account.
|
|
216
|
+
filename = feature.location.relpath(self.config.base_dir)
|
|
217
|
+
filename = filename.rsplit('.', 1)[0]
|
|
218
|
+
filename = filename.replace('\\', '/').replace('/', '.')
|
|
219
|
+
return _text(filename)
|
|
220
|
+
|
|
221
|
+
@property
|
|
222
|
+
def show_skipped(self):
|
|
223
|
+
return self.config.show_skipped or self.show_skipped_always
|
|
224
|
+
|
|
225
|
+
# -- REPORTER-API:
|
|
226
|
+
def feature(self, feature):
|
|
227
|
+
if feature.status == Status.skipped and not self.show_skipped:
|
|
228
|
+
# -- SKIP-OUTPUT: If skipped features should not be shown.
|
|
229
|
+
return
|
|
230
|
+
|
|
231
|
+
feature_filename = self.make_feature_filename(feature)
|
|
232
|
+
classname = feature_filename
|
|
233
|
+
report = FeatureReportData(feature, feature_filename)
|
|
234
|
+
now = datetime.now()
|
|
235
|
+
|
|
236
|
+
suite = ElementTree.Element(u'testsuite')
|
|
237
|
+
feature_name = feature.name or feature_filename
|
|
238
|
+
suite.set(u'name', u'%s.%s' % (classname, feature_name))
|
|
239
|
+
|
|
240
|
+
# -- BUILD-TESTCASES: From scenarios
|
|
241
|
+
for scenario in feature:
|
|
242
|
+
if isinstance(scenario, ScenarioOutline):
|
|
243
|
+
scenario_outline = scenario
|
|
244
|
+
self._process_scenario_outline(scenario_outline, report)
|
|
245
|
+
else:
|
|
246
|
+
self._process_scenario(scenario, report)
|
|
247
|
+
|
|
248
|
+
# -- ADD TESTCASES to testsuite:
|
|
249
|
+
for testcase in report.testcases:
|
|
250
|
+
suite.append(testcase)
|
|
251
|
+
|
|
252
|
+
suite.set(u'tests', _text(report.counts_tests))
|
|
253
|
+
suite.set(u'errors', _text(report.counts_errors))
|
|
254
|
+
suite.set(u'failures', _text(report.counts_failed))
|
|
255
|
+
suite.set(u'skipped', _text(report.counts_skipped)) # WAS: skips
|
|
256
|
+
suite.set(u'time', _text(round(feature.duration, 6)))
|
|
257
|
+
# -- SINCE: behave-1.2.6.dev0
|
|
258
|
+
if self.show_timestamp:
|
|
259
|
+
suite.set(u'timestamp', _text(now.isoformat()))
|
|
260
|
+
if self.show_hostname:
|
|
261
|
+
suite.set(u'hostname', _text(gethostname()))
|
|
262
|
+
|
|
263
|
+
if not os.path.exists(self.config.junit_directory):
|
|
264
|
+
# -- ENSURE: Create multiple directory levels at once.
|
|
265
|
+
os.makedirs(self.config.junit_directory)
|
|
266
|
+
|
|
267
|
+
tree = ElementTreeWithCDATA(suite)
|
|
268
|
+
report_dirname = self.config.junit_directory
|
|
269
|
+
report_basename = u'TESTS-%s.xml' % feature_filename
|
|
270
|
+
report_filename = os.path.join(report_dirname, report_basename)
|
|
271
|
+
tree.write(codecs.open(report_filename, "wb"), "UTF-8")
|
|
272
|
+
|
|
273
|
+
# -- MORE:
|
|
274
|
+
# pylint: disable=line-too-long
|
|
275
|
+
@staticmethod
|
|
276
|
+
def select_step_with_status(status, steps):
|
|
277
|
+
"""Helper function to find the first step that has the given
|
|
278
|
+
step.status.
|
|
279
|
+
|
|
280
|
+
EXAMPLE: Search for a failing step in a scenario (all steps).
|
|
281
|
+
>>> scenario = ...
|
|
282
|
+
>>> failed_step = select_step_with_status(Status.failed, scenario)
|
|
283
|
+
>>> failed_step = select_step_with_status(Status.failed, scenario.all_steps)
|
|
284
|
+
>>> assert failed_step.status == Status.failed
|
|
285
|
+
|
|
286
|
+
EXAMPLE: Search only scenario steps, skip background steps.
|
|
287
|
+
>>> failed_step = select_step_with_status(Status.failed, scenario.steps)
|
|
288
|
+
|
|
289
|
+
:param status: Step status to search for (as enum value).
|
|
290
|
+
:param steps: List of steps to search in (or scenario).
|
|
291
|
+
:returns: Step object, if found.
|
|
292
|
+
:returns: None, otherwise.
|
|
293
|
+
|
|
294
|
+
.. versionchanged:: 1.2.6
|
|
295
|
+
status: Use enum value instead of string (or string).
|
|
296
|
+
"""
|
|
297
|
+
for step in steps:
|
|
298
|
+
assert isinstance(step, Step), \
|
|
299
|
+
"TYPE-MISMATCH: step.class=%s" % step.__class__.__name__
|
|
300
|
+
if step.status == status:
|
|
301
|
+
return step
|
|
302
|
+
# -- OTHERWISE: No step with the given status found.
|
|
303
|
+
# KeyError("Step with status={0} not found".format(status))
|
|
304
|
+
return None
|
|
305
|
+
# pylint: enable=line-too-long
|
|
306
|
+
|
|
307
|
+
def describe_step(self, step):
|
|
308
|
+
status_text = _text(step.status.name)
|
|
309
|
+
if self.show_timings:
|
|
310
|
+
status_text += u" in %0.3fs" % step.duration
|
|
311
|
+
text = u'%s %s ... ' % (step.keyword, step.name)
|
|
312
|
+
text += u'%s\n' % status_text
|
|
313
|
+
if self.show_multiline:
|
|
314
|
+
prefix = make_indentation(2)
|
|
315
|
+
if step.text:
|
|
316
|
+
text += ModelDescriptor.describe_docstring(step.text, prefix)
|
|
317
|
+
elif step.table:
|
|
318
|
+
text += ModelDescriptor.describe_table(step.table, prefix)
|
|
319
|
+
return text
|
|
320
|
+
|
|
321
|
+
@classmethod
|
|
322
|
+
def describe_tags(cls, tags):
|
|
323
|
+
text = u''
|
|
324
|
+
if tags:
|
|
325
|
+
text = u'@'+ u' @'.join(tags)
|
|
326
|
+
return text
|
|
327
|
+
|
|
328
|
+
def describe_scenario(self, scenario):
|
|
329
|
+
"""Describe the scenario and the test status.
|
|
330
|
+
NOTE: table, multiline text is missing in description.
|
|
331
|
+
|
|
332
|
+
:param scenario: Scenario that was tested.
|
|
333
|
+
:return: Textual description of the scenario.
|
|
334
|
+
"""
|
|
335
|
+
header_line = u'\n@scenario.begin\n'
|
|
336
|
+
if self.show_tags and scenario.tags:
|
|
337
|
+
header_line += u'\n %s\n' % self.describe_tags(scenario.tags)
|
|
338
|
+
header_line += u' %s: %s\n' % (scenario.keyword, scenario.name)
|
|
339
|
+
footer_line = u'\n@scenario.end\n' + u'-' * 80 + '\n'
|
|
340
|
+
text = u''
|
|
341
|
+
for step in scenario:
|
|
342
|
+
text += self.describe_step(step)
|
|
343
|
+
step_indentation = make_indentation(4)
|
|
344
|
+
return header_line + indent(text, step_indentation) + footer_line
|
|
345
|
+
|
|
346
|
+
def _process_scenario(self, scenario, report):
|
|
347
|
+
"""Process a scenario and append information to JUnit report object.
|
|
348
|
+
This corresponds to a JUnit testcase:
|
|
349
|
+
|
|
350
|
+
* testcase.@classname = f(filename) +'.'+ feature.name
|
|
351
|
+
* testcase.@name = scenario.name
|
|
352
|
+
* testcase.@status = scenario.status
|
|
353
|
+
* testcase.@time = scenario.duration
|
|
354
|
+
|
|
355
|
+
Distinguishes now between failures and errors.
|
|
356
|
+
Failures are AssertationErrors: expectation is violated/not met.
|
|
357
|
+
Errors are unexpected RuntimeErrors (all other exceptions).
|
|
358
|
+
|
|
359
|
+
If a failure/error occurs, the step, that caused the failure,
|
|
360
|
+
and its location are provided now.
|
|
361
|
+
|
|
362
|
+
:param scenario: Scenario to process.
|
|
363
|
+
:param report: Context object to store/add info to (outgoing param).
|
|
364
|
+
"""
|
|
365
|
+
# pylint: disable=too-many-locals, too-many-branches, too-many-statements
|
|
366
|
+
assert isinstance(scenario, Scenario)
|
|
367
|
+
assert not isinstance(scenario, ScenarioOutline)
|
|
368
|
+
if scenario.status != Status.skipped or self.show_skipped:
|
|
369
|
+
# -- NOTE: Count only if not-skipped or skipped should be shown.
|
|
370
|
+
report.counts_tests += 1
|
|
371
|
+
classname = report.classname
|
|
372
|
+
feature = report.feature
|
|
373
|
+
feature_name = feature.name
|
|
374
|
+
if not feature_name:
|
|
375
|
+
feature_name = self.make_feature_filename(feature)
|
|
376
|
+
|
|
377
|
+
case = ElementTree.Element('testcase')
|
|
378
|
+
case.set(u"classname", u"%s.%s" % (classname, feature_name))
|
|
379
|
+
case.set(u"name", scenario.name or "")
|
|
380
|
+
case.set(u"status", scenario.status.name)
|
|
381
|
+
case.set(u"time", _text(round(scenario.duration, 6)))
|
|
382
|
+
|
|
383
|
+
step = None
|
|
384
|
+
failing_step = None
|
|
385
|
+
if scenario.status == Status.failed:
|
|
386
|
+
for status in (Status.failed, Status.undefined):
|
|
387
|
+
step = self.select_step_with_status(status, scenario)
|
|
388
|
+
if step:
|
|
389
|
+
break
|
|
390
|
+
# -- NOTE: Scenario may fail now due to hook-errors.
|
|
391
|
+
element_name = "failure"
|
|
392
|
+
if step and isinstance(step.exception, (AssertionError, type(None))):
|
|
393
|
+
# -- FAILURE: AssertionError
|
|
394
|
+
assert step.status in (Status.failed, Status.undefined)
|
|
395
|
+
report.counts_failed += 1
|
|
396
|
+
else:
|
|
397
|
+
# -- UNEXPECTED RUNTIME-ERROR:
|
|
398
|
+
report.counts_errors += 1
|
|
399
|
+
element_name = "error"
|
|
400
|
+
# -- COMMON-PART:
|
|
401
|
+
failure = ElementTree.Element(element_name)
|
|
402
|
+
if step:
|
|
403
|
+
step_text = self.describe_step(step).rstrip()
|
|
404
|
+
text = u"\nFailing step: %s\nLocation: %s\n" % \
|
|
405
|
+
(step_text, step.location)
|
|
406
|
+
message = _text(step.exception)
|
|
407
|
+
failure.set(u'type', step.exception.__class__.__name__)
|
|
408
|
+
failure.set(u'message', message)
|
|
409
|
+
text += _text(step.error_message)
|
|
410
|
+
else:
|
|
411
|
+
# -- MAYBE: Hook failure before any step is executed.
|
|
412
|
+
failure_type = "UnknownError"
|
|
413
|
+
if scenario.exception:
|
|
414
|
+
failure_type = scenario.exception.__class__.__name__
|
|
415
|
+
failure.set(u'type', failure_type)
|
|
416
|
+
failure.set(u'message', scenario.error_message or "")
|
|
417
|
+
traceback_lines = traceback.format_tb(scenario.exc_traceback)
|
|
418
|
+
traceback_lines.insert(0, u"Traceback:\n")
|
|
419
|
+
text = _text(u"".join(traceback_lines))
|
|
420
|
+
failure.append(CDATA(text))
|
|
421
|
+
case.append(failure)
|
|
422
|
+
elif (scenario.status in (Status.skipped, Status.untested)
|
|
423
|
+
and self.show_skipped):
|
|
424
|
+
report.counts_skipped += 1
|
|
425
|
+
step = self.select_step_with_status(Status.undefined, scenario)
|
|
426
|
+
if step:
|
|
427
|
+
# -- UNDEFINED-STEP:
|
|
428
|
+
report.counts_failed += 1
|
|
429
|
+
failure = ElementTree.Element(u"failure")
|
|
430
|
+
failure.set(u"type", u"undefined")
|
|
431
|
+
failure.set(u"message", (u"Undefined Step: %s" % step.name))
|
|
432
|
+
case.append(failure)
|
|
433
|
+
else:
|
|
434
|
+
skip = ElementTree.Element(u'skipped')
|
|
435
|
+
case.append(skip)
|
|
436
|
+
|
|
437
|
+
# Create stdout section for each test case
|
|
438
|
+
stdout = ElementTree.Element(u"system-out")
|
|
439
|
+
text = u""
|
|
440
|
+
if self.show_scenarios:
|
|
441
|
+
text = self.describe_scenario(scenario)
|
|
442
|
+
|
|
443
|
+
# Append the captured standard output
|
|
444
|
+
if scenario.captured.stdout:
|
|
445
|
+
output = _text(scenario.captured.stdout)
|
|
446
|
+
text += u"\nCaptured stdout:\n%s\n" % output
|
|
447
|
+
stdout.append(CDATA(text))
|
|
448
|
+
case.append(stdout)
|
|
449
|
+
|
|
450
|
+
# Create stderr section for each test case
|
|
451
|
+
if scenario.captured.stderr:
|
|
452
|
+
stderr = ElementTree.Element(u"system-err")
|
|
453
|
+
output = _text(scenario.captured.stderr)
|
|
454
|
+
text = u"\nCaptured stderr:\n%s\n" % output
|
|
455
|
+
stderr.append(CDATA(text))
|
|
456
|
+
case.append(stderr)
|
|
457
|
+
|
|
458
|
+
if scenario.status != Status.skipped or self.show_skipped:
|
|
459
|
+
report.testcases.append(case)
|
|
460
|
+
|
|
461
|
+
def _process_scenario_outline(self, scenario_outline, report):
|
|
462
|
+
assert isinstance(scenario_outline, ScenarioOutline)
|
|
463
|
+
for scenario in scenario_outline:
|
|
464
|
+
assert isinstance(scenario, Scenario)
|
|
465
|
+
self._process_scenario(scenario, report)
|
|
466
|
+
|
|
467
|
+
# -----------------------------------------------------------------------------
|
|
468
|
+
# SUPPORT:
|
|
469
|
+
# -----------------------------------------------------------------------------
|
|
470
|
+
def gethostname():
|
|
471
|
+
"""Return hostname of local host (as string)"""
|
|
472
|
+
import socket
|
|
473
|
+
return socket.gethostname()
|