cucumber 2.99.0 → 3.0.0
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 +4 -4
- data/.cucumberproignore +6 -0
- data/.gitattributes +32 -0
- data/.github/ISSUE_TEMPLATE.md +1 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
- data/.rubocop.yml +13 -0
- data/.rubocop_todo.yml +991 -0
- data/.travis.yml +56 -10
- data/{History.md → CHANGELOG.md} +166 -32
- data/CONTRIBUTING.md +21 -1
- data/Gemfile +18 -5
- data/README.md +13 -4
- data/Rakefile +12 -2
- data/appveyor.yml +27 -0
- data/bin/cucumber +2 -1
- data/cucumber.gemspec +15 -10
- data/cucumber.yml +10 -11
- data/examples/i18n/Rakefile +1 -1
- data/examples/i18n/ar/features/step_definitions/calculator_steps.rb +8 -3
- data/examples/i18n/ar/lib/calculator.rb +2 -2
- data/examples/i18n/bg/features/step_definitions/calculator_steps.rb +6 -6
- data/examples/i18n/bg/features/support/env.rb +6 -1
- data/examples/i18n/bg/lib/calculator.rb +2 -1
- data/examples/i18n/ca/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/ca/lib/calculadora.rb +2 -2
- data/examples/i18n/cs/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/cs/lib/calculator.rb +3 -3
- data/examples/i18n/da/features/step_definitions/lommeregner_steps.rb +10 -5
- data/examples/i18n/da/lib/lommeregner.rb +2 -2
- data/examples/i18n/de/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/de/lib/calculator.rb +2 -2
- data/examples/i18n/el/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/el/lib/calculator.rb +2 -2
- data/examples/i18n/en/features/step_definitions/calculator_steps.rb +9 -4
- data/examples/i18n/en/lib/calculator.rb +2 -2
- data/examples/i18n/en-lol/features/step_definitions/cucumbrz_steps.rb +4 -4
- data/examples/i18n/en-lol/features/support/env.rb +6 -2
- data/examples/i18n/en-lol/lib/basket.rb +2 -2
- data/examples/i18n/en-lol/lib/belly.rb +2 -2
- data/examples/i18n/eo/features/step_definitions/calculator_steps.rb +9 -4
- data/examples/i18n/eo/lib/calculator.rb +2 -2
- data/examples/i18n/es/features/step_definitions/calculador_steps.rb +10 -5
- data/examples/i18n/es/lib/calculador.rb +2 -2
- data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +10 -5
- data/examples/i18n/et/lib/kalkulaator.rb +3 -3
- data/examples/i18n/fi/features/step_definitions/laskin_steps.rb +9 -4
- data/examples/i18n/fi/lib/laskin.rb +1 -1
- data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +8 -8
- data/examples/i18n/fr/features/support/env.rb +7 -2
- data/examples/i18n/fr/lib/calculatrice.rb +2 -2
- data/examples/i18n/he/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/he/lib/calculator.rb +1 -1
- data/examples/i18n/hi/features/step_definitions/calculator_steps.rb +9 -4
- data/examples/i18n/hi/lib/calculator.rb +1 -1
- data/examples/i18n/ht/features/step_definitions/kalkilatris_steps.rb +9 -5
- data/examples/i18n/ht/lib/kalkilatris.rb +2 -2
- data/examples/i18n/hu/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/hu/lib/calculator.rb +1 -1
- data/examples/i18n/id/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/id/lib/calculator.rb +2 -2
- data/examples/i18n/it/features/step_definitions/calcolatrice_steps.rb +10 -5
- data/examples/i18n/it/lib/calcolatrice.rb +3 -3
- data/examples/i18n/ja/features/step_definitions/calculator_steps.rb +3 -3
- data/examples/i18n/ja/features/support/env.rb +7 -2
- data/examples/i18n/ja/lib/calculator.rb +2 -2
- data/examples/i18n/ko/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/ko/lib/calculator.rb +2 -2
- data/examples/i18n/lt/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/lt/lib/calculator.rb +2 -2
- data/examples/i18n/lv/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/lv/lib/calculator.rb +2 -2
- data/examples/i18n/no/features/step_definitions/kalkulator_steps.rb +3 -3
- data/examples/i18n/no/features/support/env.rb +7 -2
- data/examples/i18n/no/lib/kalkulator.rb +2 -2
- data/examples/i18n/pl/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/pl/features/support/env.rb +6 -1
- data/examples/i18n/pl/lib/calculator.rb +2 -2
- data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +3 -3
- data/examples/i18n/pt/features/support/env.rb +7 -2
- data/examples/i18n/pt/lib/calculadora.rb +1 -1
- data/examples/i18n/ro/features/step_definitions/calculator_steps.rb +11 -6
- data/examples/i18n/ro/lib/calculator.rb +1 -1
- data/examples/i18n/ru/features/step_definitions/calculator_steps.rb +5 -5
- data/examples/i18n/ru/features/support/env.rb +6 -1
- data/examples/i18n/ru/lib/calculator.rb +2 -1
- data/examples/i18n/sk/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/sk/lib/calculator.rb +2 -2
- data/examples/i18n/sr-Cyrl/features/step_definitions/calculator_steps.rb +3 -3
- data/examples/i18n/sr-Cyrl/features/support/env.rb +7 -2
- data/examples/i18n/sr-Cyrl/lib/calculator.rb +2 -2
- data/examples/i18n/sr-Latn/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/sr-Latn/lib/calculator.rb +2 -2
- data/examples/i18n/sv/features/step_definitions/kalkulator_steps.rb +9 -4
- data/examples/i18n/sv/lib/kalkulator.rb +2 -2
- data/examples/i18n/tr/features/step_definitions/hesap_makinesi_adimlari.rb +10 -5
- data/examples/i18n/tr/lib/hesap_makinesi.rb +2 -2
- data/examples/i18n/uk/features/step_definitions/calculator_steps.rb +4 -4
- data/examples/i18n/uk/features/support/env.rb +6 -1
- data/examples/i18n/uk/lib/calculator.rb +2 -1
- data/examples/i18n/uz/features/step_definitions/calculator_steps.rb +4 -4
- data/examples/i18n/uz/features/support/env.rb +6 -1
- data/examples/i18n/uz/lib/calculator.rb +2 -1
- data/examples/i18n/zh-CN/features/step_definitions/calculator_steps.rb +11 -6
- data/examples/i18n/zh-CN/lib/calculator.rb +2 -2
- data/examples/i18n/zh-TW/features/step_definitions/calculator_steps.rb +10 -5
- data/examples/i18n/zh-TW/lib/calculator.rb +2 -2
- data/examples/rspec_doubles/features/step_definitions/calvin_steps.rb +3 -3
- data/examples/sinatra/features/step_definitions/add_steps.rb +4 -4
- data/examples/sinatra/features/support/env.rb +6 -1
- data/examples/tcl/features/step_definitions/fib_steps.rb +2 -2
- data/examples/tcl/features/support/env.rb +2 -1
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +4 -4
- data/examples/watir/features/step_definitions/search_steps.rb +6 -5
- data/examples/watir/features/support/env.rb +5 -1
- data/examples/watir/features/support/screenshots.rb +5 -5
- data/features/docs/api/list_step_defs_as_json.feature +21 -7
- data/features/docs/api/listen_for_events.feature +9 -8
- data/features/docs/api/run_cli_main_with_existing_runtime.feature +1 -0
- data/features/docs/cli/dry_run.feature +3 -0
- data/features/docs/cli/execute_with_tag_filter.feature +8 -6
- data/features/docs/cli/fail_fast.feature +2 -0
- data/features/docs/cli/help.feature +8 -0
- data/features/docs/{gherkin/language_help.feature → cli/i18n.feature} +6 -6
- data/features/docs/cli/randomize.feature +2 -2
- data/features/docs/cli/retry_failing_tests.feature +75 -15
- data/features/docs/cli/run_scenarios_matching_name.feature +1 -0
- data/features/docs/cli/specifying_multiple_formatters.feature +3 -0
- data/features/docs/cli/strict_mode.feature +6 -0
- data/features/docs/defining_steps/ambiguous_steps.feature +89 -0
- data/features/docs/defining_steps/nested_steps.feature +5 -1
- data/features/docs/defining_steps/nested_steps_i18n.feature +3 -0
- data/features/docs/defining_steps/nested_steps_with_second_arg.feature +2 -0
- data/features/docs/defining_steps/printing_messages.feature +1 -2
- data/features/docs/defining_steps/skip_scenario.feature +1 -34
- data/features/docs/defining_steps/snippets.feature +18 -18
- data/features/docs/events/gherkin_source_read_event.feature +43 -0
- data/features/docs/events/step_activated_event.feature +36 -0
- data/features/docs/events/step_definition_registered_event.feature +29 -0
- data/features/docs/events/test_case_finished_event.feature +35 -0
- data/features/docs/events/test_case_started_event.feature +54 -0
- data/features/docs/events/test_run_finished_event.feature +40 -0
- data/features/docs/events/test_run_started_event.feature +41 -0
- data/features/docs/events/test_step_finished_event.feature +47 -0
- data/features/docs/events/test_step_started_event.feature +43 -0
- data/features/docs/exception_in_after_hook.feature +3 -2
- data/features/docs/exception_in_after_step_hook.feature +2 -0
- data/features/docs/exception_in_around_hook.feature +2 -0
- data/features/docs/exception_in_before_hook.feature +3 -1
- data/features/docs/extending_cucumber/custom_formatter.feature +12 -48
- data/features/docs/formatters/json_formatter.feature +4 -4
- data/features/docs/formatters/junit_formatter.feature +7 -6
- data/features/docs/formatters/pretty_formatter.feature +1 -0
- data/features/docs/formatters/progress_formatter.feature +1 -0
- data/features/docs/formatters/rerun_formatter.feature +2 -0
- data/features/docs/formatters/summary_formatter.feature +35 -0
- data/features/docs/formatters/usage_formatter.feature +3 -0
- data/features/docs/getting_started.feature +2 -1
- data/features/docs/gherkin/background.feature +5 -5
- data/features/docs/gherkin/doc_strings.feature +2 -0
- data/features/docs/gherkin/expand_option_for_outlines.feature +1 -0
- data/features/docs/gherkin/outlines.feature +6 -4
- data/features/docs/gherkin/unicode_table.feature +2 -1
- data/features/docs/gherkin/using_descriptions.feature +1 -0
- data/features/docs/gherkin/using_star_notation.feature +1 -1
- data/features/docs/post_configuration_hook.feature +1 -17
- data/features/docs/rake_task.feature +5 -0
- data/features/docs/raketask.feature +3 -1
- data/features/docs/work_in_progress.feature +5 -2
- data/features/docs/writing_support_code/after_step_hooks.feature +3 -1
- data/features/docs/writing_support_code/around_hooks.feature +6 -0
- data/features/docs/writing_support_code/before_hook.feature +1 -0
- data/features/docs/writing_support_code/hook_order.feature +3 -1
- data/features/docs/writing_support_code/parameter_types.feature +53 -0
- data/features/docs/writing_support_code/tagged_hooks.feature +1 -1
- data/features/docs/writing_support_code/world.feature +129 -0
- data/features/lib/step_definitions/aruba_steps.rb +5 -10
- data/features/lib/step_definitions/cli_steps.rb +4 -0
- data/features/lib/step_definitions/cucumber_steps.rb +9 -12
- data/features/lib/step_definitions/iso-8859-1_steps.rb +9 -5
- data/features/lib/step_definitions/json_steps.rb +2 -1
- data/features/lib/step_definitions/junit_steps.rb +2 -1
- data/features/lib/step_definitions/language_steps.rb +3 -2
- data/features/lib/step_definitions/profile_steps.rb +7 -6
- data/features/lib/step_definitions/retry_steps.rb +33 -13
- data/features/lib/step_definitions/ruby_steps.rb +2 -1
- data/features/lib/support/env.rb +3 -2
- data/features/lib/support/fake_wire_server.rb +17 -3
- data/features/lib/support/feature_factory.rb +2 -1
- data/features/lib/support/normalise_output.rb +14 -12
- data/features/lib/support/parameter_types.rb +5 -0
- data/gem_tasks/contributors.rake +10 -6
- data/gem_tasks/cov.rake +1 -0
- data/gem_tasks/downloads.rb +1 -0
- data/gem_tasks/environment.rake +2 -5
- data/gem_tasks/examples.rake +3 -2
- data/gem_tasks/fix_cr_lf.rake +19 -7
- data/gem_tasks/flog.rake +4 -3
- data/gem_tasks/rspec.rake +2 -1
- data/gem_tasks/sass.rake +2 -1
- data/lib/autotest/cucumber.rb +1 -0
- data/lib/autotest/cucumber_mixin.rb +17 -16
- data/lib/autotest/cucumber_rails.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
- data/lib/autotest/cucumber_rspec.rb +1 -0
- data/lib/autotest/cucumber_rspec2.rb +1 -0
- data/lib/autotest/discover.rb +3 -2
- data/lib/cucumber/cli/configuration.rb +12 -21
- data/lib/cucumber/cli/main.rb +8 -7
- data/lib/cucumber/cli/options.rb +341 -217
- data/lib/cucumber/cli/profile_loader.rb +26 -21
- data/lib/cucumber/cli/rerun_file.rb +1 -0
- data/lib/cucumber/configuration.rb +54 -37
- data/lib/cucumber/constantize.rb +2 -1
- data/lib/cucumber/core_ext/string.rb +2 -1
- data/lib/cucumber/deprecate.rb +4 -3
- data/lib/cucumber/encoding.rb +1 -0
- data/lib/cucumber/errors.rb +3 -1
- data/lib/cucumber/events/gherkin_source_read.rb +17 -0
- data/lib/cucumber/events/{step_match.rb → step_activated.rb} +5 -2
- data/lib/cucumber/events/step_definition_registered.rb +24 -0
- data/lib/cucumber/events/test_case_finished.rb +18 -0
- data/lib/cucumber/events/test_case_started.rb +15 -0
- data/lib/cucumber/events/test_run_finished.rb +12 -0
- data/lib/cucumber/events/test_run_started.rb +16 -0
- data/lib/cucumber/events/test_step_finished.rb +20 -0
- data/lib/cucumber/events/test_step_started.rb +17 -0
- data/lib/cucumber/events.rb +23 -3
- data/lib/cucumber/file_specs.rb +1 -0
- data/lib/cucumber/filters/activate_steps.rb +8 -3
- data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
- data/lib/cucumber/filters/broadcast_test_run_started_event.rb +27 -0
- data/lib/cucumber/filters/gated_receiver.rb +1 -0
- data/lib/cucumber/filters/prepare_world.rb +1 -0
- data/lib/cucumber/filters/quit.rb +1 -0
- data/lib/cucumber/filters/randomizer.rb +1 -0
- data/lib/cucumber/filters/retry.rb +4 -4
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -0
- data/lib/cucumber/filters/tag_limits/verifier.rb +2 -1
- data/lib/cucumber/filters/tag_limits.rb +4 -3
- data/lib/cucumber/filters.rb +3 -0
- data/lib/cucumber/formatter/ansicolor.rb +9 -11
- data/lib/cucumber/formatter/backtrace_filter.rb +21 -8
- data/lib/cucumber/formatter/console.rb +72 -66
- data/lib/cucumber/formatter/console_counts.rb +44 -0
- data/lib/cucumber/formatter/console_issues.rb +58 -0
- data/lib/cucumber/formatter/duration.rb +2 -1
- data/lib/cucumber/formatter/duration_extractor.rb +1 -0
- data/lib/cucumber/formatter/fail_fast.rb +4 -2
- data/lib/cucumber/formatter/fanout.rb +1 -0
- data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
- data/lib/cucumber/formatter/html.rb +175 -249
- data/lib/cucumber/formatter/html_builder.rb +120 -0
- data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -0
- data/lib/cucumber/formatter/inline-js.js +30 -0
- data/lib/cucumber/formatter/interceptor.rb +3 -2
- data/lib/cucumber/formatter/io.rb +2 -1
- data/lib/cucumber/formatter/json.rb +33 -30
- data/lib/cucumber/formatter/json_pretty.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +26 -24
- data/lib/cucumber/formatter/legacy_api/adapter.rb +81 -69
- data/lib/cucumber/formatter/legacy_api/ast.rb +27 -22
- data/lib/cucumber/formatter/legacy_api/results.rb +7 -8
- data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +1 -0
- data/lib/cucumber/formatter/pretty.rb +24 -18
- data/lib/cucumber/formatter/progress.rb +55 -13
- data/lib/cucumber/formatter/rerun.rb +15 -18
- data/lib/cucumber/formatter/stepdefs.rb +1 -0
- data/lib/cucumber/formatter/steps.rb +2 -1
- data/lib/cucumber/formatter/summary.rb +43 -20
- data/lib/cucumber/formatter/unicode.rb +2 -1
- data/lib/cucumber/formatter/usage.rb +33 -28
- data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -1
- data/lib/cucumber/gherkin/formatter/escaping.rb +2 -1
- data/lib/cucumber/gherkin/i18n.rb +1 -0
- data/lib/cucumber/gherkin/steps_parser.rb +1 -0
- data/lib/cucumber/{rb_support/rb_dsl.rb → glue/dsl.rb} +41 -30
- data/lib/cucumber/glue/hook.rb +43 -0
- data/lib/cucumber/glue/invoke_in_world.rb +70 -0
- data/lib/cucumber/glue/proto_world.rb +220 -0
- data/lib/cucumber/{rb_support/rb_language.rb → glue/registry_and_more.rb} +60 -90
- data/lib/cucumber/{rb_support → glue}/snippet.rb +64 -26
- data/lib/cucumber/glue/step_definition.rb +143 -0
- data/lib/cucumber/glue/world_factory.rb +23 -0
- data/lib/cucumber/hooks.rb +9 -8
- data/lib/cucumber/load_path.rb +1 -0
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +158 -0
- data/lib/cucumber/multiline_argument/data_table.rb +47 -181
- data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
- data/lib/cucumber/multiline_argument.rb +6 -15
- data/lib/cucumber/platform.rb +4 -5
- data/lib/cucumber/project_initializer.rb +3 -2
- data/lib/cucumber/rake/task.rb +19 -14
- data/lib/cucumber/rspec/disable_option_parser.rb +2 -1
- data/lib/cucumber/rspec/doubles.rb +2 -1
- data/lib/cucumber/running_test_case.rb +3 -27
- data/lib/cucumber/runtime/after_hooks.rb +2 -1
- data/lib/cucumber/runtime/before_hooks.rb +1 -0
- data/lib/cucumber/runtime/for_programming_languages.rb +2 -36
- data/lib/cucumber/runtime/step_hooks.rb +1 -0
- data/lib/cucumber/runtime/support_code.rb +21 -16
- data/lib/cucumber/runtime/user_interface.rb +10 -16
- data/lib/cucumber/runtime.rb +49 -32
- data/lib/cucumber/step_argument.rb +1 -2
- data/lib/cucumber/step_definition_light.rb +2 -0
- data/lib/cucumber/step_definitions.rb +1 -0
- data/lib/cucumber/step_match.rb +30 -15
- data/lib/cucumber/step_match_search.rb +3 -3
- data/lib/cucumber/term/ansicolor.rb +2 -1
- data/lib/cucumber/unit.rb +1 -0
- data/lib/cucumber/version +1 -1
- data/lib/cucumber.rb +1 -13
- data/lib/simplecov_setup.rb +2 -1
- data/scripts/invite-collaborator +40 -0
- data/scripts/update-changelog +86 -0
- data/spec/cucumber/cli/configuration_spec.rb +109 -98
- data/spec/cucumber/cli/main_spec.rb +8 -7
- data/spec/cucumber/cli/options_spec.rb +114 -79
- data/spec/cucumber/cli/profile_loader_spec.rb +25 -5
- data/spec/cucumber/cli/rerun_spec.rb +21 -20
- data/spec/cucumber/configuration_spec.rb +48 -47
- data/spec/cucumber/constantize_spec.rb +3 -2
- data/spec/cucumber/events_spec.rb +9 -0
- data/spec/cucumber/file_specs_spec.rb +26 -25
- data/spec/cucumber/filters/activate_steps_spec.rb +25 -22
- data/spec/cucumber/filters/gated_receiver_spec.rb +7 -6
- data/spec/cucumber/filters/retry_spec.rb +42 -23
- data/spec/cucumber/filters/tag_limits/test_case_index_spec.rb +12 -11
- data/spec/cucumber/filters/tag_limits/verifier_spec.rb +15 -14
- data/spec/cucumber/filters/tag_limits_spec.rb +9 -8
- data/spec/cucumber/formatter/ansicolor_spec.rb +10 -9
- data/spec/cucumber/formatter/backtrace_filter_spec.rb +32 -0
- data/spec/cucumber/formatter/console_counts_spec.rb +14 -0
- data/spec/cucumber/formatter/duration_spec.rb +4 -3
- data/spec/cucumber/formatter/fail_fast_spec.rb +27 -27
- data/spec/cucumber/formatter/html_spec.rb +65 -60
- data/spec/cucumber/formatter/interceptor_spec.rb +1 -0
- data/spec/cucumber/formatter/json_spec.rb +71 -97
- data/spec/cucumber/formatter/junit_spec.rb +46 -47
- data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +134 -141
- data/spec/cucumber/formatter/pretty_spec.rb +105 -117
- data/spec/cucumber/formatter/progress_spec.rb +22 -21
- data/spec/cucumber/formatter/rerun_spec.rb +70 -64
- data/spec/cucumber/formatter/spec_helper.rb +14 -12
- data/spec/cucumber/{rb_support/rb_world_spec.rb → glue/proto_world_spec.rb} +22 -6
- data/spec/cucumber/glue/registry_and_more_spec.rb +213 -0
- data/spec/cucumber/{rb_support → glue}/snippet_spec.rb +62 -25
- data/spec/cucumber/glue/step_definition_spec.rb +207 -0
- data/spec/cucumber/hooks_spec.rb +5 -4
- data/spec/cucumber/multiline_argument/data_table_spec.rb +179 -129
- data/spec/cucumber/project_initializer_spec.rb +12 -11
- data/spec/cucumber/rake/forked_spec.rb +22 -17
- data/spec/cucumber/rake/task_spec.rb +21 -20
- data/spec/cucumber/running_test_case_spec.rb +36 -35
- data/spec/cucumber/runtime/for_programming_languages_spec.rb +2 -30
- data/spec/cucumber/runtime/support_code_spec.rb +1 -0
- data/spec/cucumber/runtime_spec.rb +3 -2
- data/spec/cucumber/step_argument_spec.rb +6 -5
- data/spec/cucumber/step_match_search_spec.rb +32 -41
- data/spec/cucumber/step_match_spec.rb +34 -33
- data/spec/cucumber/world/pending_spec.rb +12 -11
- data/spec/spec_helper.rb +1 -0
- data/spec/support/standard_step_actions.rb +2 -1
- metadata +132 -61
- data/features/docs/formatters/debug_formatter.feature +0 -47
- data/features/docs/formatters/formatter_step_file_colon_line.feature +0 -44
- data/features/docs/writing_support_code/transforms.feature +0 -98
- data/features/lib/step_definitions/wire_steps.rb +0 -58
- data/gem_tasks/cucumber.rake +0 -25
- data/lib/cucumber/ast.rb +0 -13
- data/lib/cucumber/core_ext/instance_exec.rb +0 -70
- data/lib/cucumber/events/after_test_case.rb +0 -25
- data/lib/cucumber/events/after_test_step.rb +0 -30
- data/lib/cucumber/events/before_test_case.rb +0 -18
- data/lib/cucumber/events/before_test_step.rb +0 -23
- data/lib/cucumber/events/bus.rb +0 -86
- data/lib/cucumber/events/finished_testing.rb +0 -9
- data/lib/cucumber/formatter/debug.rb +0 -35
- data/lib/cucumber/formatter/event_bus_report.rb +0 -38
- data/lib/cucumber/rb_support/rb_hook.rb +0 -19
- data/lib/cucumber/rb_support/rb_step_definition.rb +0 -131
- data/lib/cucumber/rb_support/rb_transform.rb +0 -59
- data/lib/cucumber/rb_support/rb_world.rb +0 -149
- data/spec/cucumber/core_ext/instance_exec_spec.rb +0 -4
- data/spec/cucumber/events/bus_spec.rb +0 -94
- data/spec/cucumber/formatter/debug_spec.rb +0 -64
- data/spec/cucumber/formatter/event_bus_report_spec.rb +0 -88
- data/spec/cucumber/rb_support/rb_language_spec.rb +0 -243
- data/spec/cucumber/rb_support/rb_step_definition_spec.rb +0 -199
- data/spec/cucumber/rb_support/rb_transform_spec.rb +0 -46
- data/spec/cucumber_spec.rb +0 -39
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
Given
|
|
1
|
+
Given(/^(\w+) = (\w+)$/) do |var, value|
|
|
2
2
|
instance_variable_set("@#{var}", value)
|
|
3
3
|
end
|
|
4
4
|
|
|
5
5
|
begin
|
|
6
6
|
require 'rubygems'
|
|
7
7
|
require 'matchy'
|
|
8
|
-
Then
|
|
8
|
+
Then(/^I can assert that (\w+) == (\w+)$/) do |var_a, var_b|
|
|
9
9
|
a = instance_variable_get("@#{var_a}")
|
|
10
10
|
b = instance_variable_get("@#{var_b}")
|
|
11
11
|
a.should == b
|
|
12
12
|
end
|
|
13
13
|
rescue LoadError
|
|
14
|
-
STDERR.puts
|
|
15
|
-
Then
|
|
14
|
+
STDERR.puts '***** You should install matchy *****'
|
|
15
|
+
Then(/^I can assert that (\w+) == (\w+)$/) do |var_a, var_b|
|
|
16
16
|
a = instance_variable_get("@#{var_a}")
|
|
17
17
|
b = instance_variable_get("@#{var_b}")
|
|
18
18
|
assert_equal(a, b)
|
|
@@ -5,12 +5,12 @@ Given 'I am on the Google search page' do
|
|
|
5
5
|
@browser.goto 'http://www.google.com/'
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
When
|
|
8
|
+
When(/I search for "(.*)"/) do |query|
|
|
9
9
|
@browser.text_field(:name, 'q').set(query)
|
|
10
10
|
@browser.button(:name, 'btnG').click
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
Then
|
|
13
|
+
Then(/I should see/) do |text|
|
|
14
14
|
@browser.text.should =~ /#{text}/m
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -18,9 +18,10 @@ end
|
|
|
18
18
|
# consider creating classes for your pages - such as this:
|
|
19
19
|
# http://github.com/cucumber/cucumber/tree/v0.1.15/examples/watir/features/step_definitons/search_steps.rb
|
|
20
20
|
#
|
|
21
|
-
# You may keep the page classes along your steps, or even better, put them in
|
|
22
|
-
# support/pages/google_search.rb
|
|
21
|
+
# You may keep the page classes along your steps, or even better, put them in
|
|
22
|
+
# separate files, e.g. support/pages/google_search.rb
|
|
23
23
|
#
|
|
24
24
|
# This technique is called "Page Objects", and you can read more about it here:
|
|
25
25
|
# http://github.com/marekj/watirloo/tree/master
|
|
26
|
-
# We're not using this technique here, since we want to illustrate the
|
|
26
|
+
# We're not using this technique here, since we want to illustrate the
|
|
27
|
+
# basics only.
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
# browser testing. Just run cucumber with --format html --out report.html
|
|
3
3
|
#
|
|
4
4
|
# The code below will work on OS X or Windows (with IE Watir only).
|
|
5
|
-
# Adding support for other platforms should be easy - as long as there is a
|
|
5
|
+
# Adding support for other platforms should be easy - as long as there is a
|
|
6
6
|
# ruby library or command line tool to take pictures.
|
|
7
7
|
#
|
|
8
8
|
module Screenshots
|
|
9
9
|
if Cucumber::OS_X
|
|
10
10
|
def embed_screenshot(id)
|
|
11
11
|
`screencapture -t png #{id}.png`
|
|
12
|
-
embed("#{id}.png",
|
|
12
|
+
embed("#{id}.png", 'image/png')
|
|
13
13
|
end
|
|
14
14
|
elsif Cucumber::WINDOWS
|
|
15
15
|
# http://wtr.rubyforge.org/rdoc/classes/Watir/ScreenCapture.html
|
|
@@ -17,12 +17,12 @@ module Screenshots
|
|
|
17
17
|
include Watir::ScreenCapture
|
|
18
18
|
def embed_screenshot(id)
|
|
19
19
|
screen_capture("#{id}.jpg", true)
|
|
20
|
-
embed("#{id}.jpg",
|
|
20
|
+
embed("#{id}.jpg", 'image/jpeg')
|
|
21
21
|
end
|
|
22
22
|
else
|
|
23
23
|
# Other platforms...
|
|
24
|
-
def embed_screenshot(
|
|
25
|
-
STDERR.puts
|
|
24
|
+
def embed_screenshot(_id)
|
|
25
|
+
STDERR.puts 'Sorry - no screenshots on your platform yet.'
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -8,6 +8,7 @@ Feature: List step defs as json
|
|
|
8
8
|
Background:
|
|
9
9
|
Given a directory named "features"
|
|
10
10
|
|
|
11
|
+
@todo-windows
|
|
11
12
|
Scenario: Two Ruby step definitions, in the same file
|
|
12
13
|
Given a file named "features/step_definitions/steps.rb" with:
|
|
13
14
|
"""
|
|
@@ -18,16 +19,23 @@ Feature: List step defs as json
|
|
|
18
19
|
"""
|
|
19
20
|
require 'cucumber'
|
|
20
21
|
puts Cucumber::StepDefinitions.new.to_json
|
|
21
|
-
|
|
22
|
+
|
|
22
23
|
"""
|
|
23
24
|
Then it should pass with JSON:
|
|
24
25
|
"""
|
|
25
26
|
[
|
|
26
|
-
{
|
|
27
|
-
|
|
27
|
+
{
|
|
28
|
+
"source": {"expression": "foo", "type": "regular expression"},
|
|
29
|
+
"regexp": {"source": "foo", "flags": "i"}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"source": {"expression": "b.r", "type": "regular expression"},
|
|
33
|
+
"regexp": {"source": "b.r", "flags": "mx"}
|
|
34
|
+
}
|
|
28
35
|
]
|
|
29
36
|
"""
|
|
30
37
|
|
|
38
|
+
@todo-windows
|
|
31
39
|
Scenario: Non-default directory structure
|
|
32
40
|
Given a file named "my_weird/place/steps.rb" with:
|
|
33
41
|
"""
|
|
@@ -38,13 +46,19 @@ Feature: List step defs as json
|
|
|
38
46
|
"""
|
|
39
47
|
require 'cucumber'
|
|
40
48
|
puts Cucumber::StepDefinitions.new(:autoload_code_paths => ['my_weird']).to_json
|
|
41
|
-
|
|
49
|
+
|
|
42
50
|
"""
|
|
43
51
|
Then it should pass with JSON:
|
|
44
52
|
"""
|
|
45
53
|
[
|
|
46
|
-
{
|
|
47
|
-
|
|
54
|
+
{
|
|
55
|
+
"source": {"expression": "foo", "type": "regular expression"},
|
|
56
|
+
"regexp": {"source": "foo", "flags": ""}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"source": {"expression": "b.r", "type": "regular expression"},
|
|
60
|
+
"regexp": {"source": "b.r", "flags": "x"}
|
|
61
|
+
}
|
|
48
62
|
]
|
|
49
|
-
|
|
63
|
+
|
|
50
64
|
"""
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
Feature: Listen for events
|
|
2
2
|
|
|
3
|
+
Cucumber's `config` object has an event bus that you can use to listen for
|
|
4
|
+
various events that happen during your test run.
|
|
5
|
+
|
|
3
6
|
Scenario: Step Matched Event
|
|
4
7
|
Given a file named "features/test.feature" with:
|
|
5
8
|
"""
|
|
@@ -16,10 +19,9 @@ Feature: Listen for events
|
|
|
16
19
|
"""
|
|
17
20
|
AfterConfiguration do |config|
|
|
18
21
|
io = config.out_stream
|
|
19
|
-
config.on_event
|
|
22
|
+
config.on_event :step_activated do |event|
|
|
20
23
|
io.puts "Success!"
|
|
21
|
-
io.puts "
|
|
22
|
-
io.puts "Step name: #{event.test_step.name}"
|
|
24
|
+
io.puts "Step text: #{event.test_step}"
|
|
23
25
|
io.puts "Source location: #{event.step_match.location}"
|
|
24
26
|
end
|
|
25
27
|
end
|
|
@@ -28,8 +30,7 @@ Feature: Listen for events
|
|
|
28
30
|
Then it should pass with:
|
|
29
31
|
"""
|
|
30
32
|
Success!
|
|
31
|
-
|
|
32
|
-
Step name: matching
|
|
33
|
+
Step text: matching
|
|
33
34
|
Source location: features/step_definitions/steps.rb:1
|
|
34
35
|
"""
|
|
35
36
|
|
|
@@ -45,14 +46,14 @@ Feature: Listen for events
|
|
|
45
46
|
"""
|
|
46
47
|
AfterConfiguration do |config|
|
|
47
48
|
io = config.out_stream
|
|
48
|
-
config.on_event
|
|
49
|
-
io.puts
|
|
49
|
+
config.on_event :test_step_finished do |event|
|
|
50
|
+
io.puts event.result.passed?
|
|
50
51
|
end
|
|
51
52
|
end
|
|
52
53
|
"""
|
|
53
54
|
When I run `cucumber`
|
|
54
55
|
Then it should pass with:
|
|
55
56
|
"""
|
|
56
|
-
|
|
57
|
+
true
|
|
57
58
|
"""
|
|
58
59
|
|
|
@@ -5,6 +5,7 @@ Feature: Run Cli::Main with existing Runtime
|
|
|
5
5
|
When the process forks, Spork them passes the runtime to Cli::Main to
|
|
6
6
|
run it.
|
|
7
7
|
|
|
8
|
+
@todo-windows
|
|
8
9
|
Scenario: Run a single feature
|
|
9
10
|
Given the standard step definitions
|
|
10
11
|
Given a file named "features/success.feature" with:
|
|
@@ -64,6 +64,9 @@ Feature: Dry Run
|
|
|
64
64
|
Undefined step: "this step is undefined" (Cucumber::Undefined)
|
|
65
65
|
features/test.feature:3:in `Given this step is undefined'
|
|
66
66
|
|
|
67
|
+
Undefined Scenarios:
|
|
68
|
+
cucumber features/test.feature:2 # Scenario:
|
|
69
|
+
|
|
67
70
|
1 scenario (1 undefined)
|
|
68
71
|
1 step (1 undefined)
|
|
69
72
|
|
|
@@ -23,10 +23,11 @@ Feature: Tag logic
|
|
|
23
23
|
|
|
24
24
|
@ignore
|
|
25
25
|
Scenario: And yet another Example
|
|
26
|
+
Given passing
|
|
26
27
|
"""
|
|
27
28
|
|
|
28
29
|
Scenario: ANDing tags
|
|
29
|
-
When I run `cucumber -q -t @one
|
|
30
|
+
When I run `cucumber -q -t '@one and @three' features/test.feature`
|
|
30
31
|
Then it should pass with:
|
|
31
32
|
"""
|
|
32
33
|
@feature
|
|
@@ -42,7 +43,7 @@ Feature: Tag logic
|
|
|
42
43
|
"""
|
|
43
44
|
|
|
44
45
|
Scenario: ORing tags
|
|
45
|
-
When I run `cucumber -q -t @one
|
|
46
|
+
When I run `cucumber -q -t '@one or @three' features/test.feature`
|
|
46
47
|
Then it should pass with:
|
|
47
48
|
"""
|
|
48
49
|
@feature
|
|
@@ -66,7 +67,7 @@ Feature: Tag logic
|
|
|
66
67
|
"""
|
|
67
68
|
|
|
68
69
|
Scenario: Negative tags
|
|
69
|
-
When I run `cucumber -q -t
|
|
70
|
+
When I run `cucumber -q -t 'not @three' features/test.feature`
|
|
70
71
|
Then it should pass with:
|
|
71
72
|
"""
|
|
72
73
|
@feature
|
|
@@ -78,9 +79,10 @@ Feature: Tag logic
|
|
|
78
79
|
|
|
79
80
|
@ignore
|
|
80
81
|
Scenario: And yet another Example
|
|
82
|
+
Given passing
|
|
81
83
|
|
|
82
|
-
2 scenarios (
|
|
83
|
-
|
|
84
|
+
2 scenarios (2 undefined)
|
|
85
|
+
2 steps (2 undefined)
|
|
84
86
|
"""
|
|
85
87
|
|
|
86
88
|
Scenario: Run with limited tag count, blowing it on scenario
|
|
@@ -104,7 +106,7 @@ Feature: Tag logic
|
|
|
104
106
|
"""
|
|
105
107
|
|
|
106
108
|
Scenario: Run with limited tag count using negative tag, blowing it via a tag that is not run
|
|
107
|
-
When I run `cucumber -q --no-source --tags
|
|
109
|
+
When I run `cucumber -q --no-source --tags 'not @one:1' features/test.feature`
|
|
108
110
|
Then it fails before running features with:
|
|
109
111
|
"""
|
|
110
112
|
@one occurred 2 times, but the limit was set to 1
|
|
@@ -4,6 +4,7 @@ Feature: Fail fast
|
|
|
4
4
|
The --fail-fast flag causes Cucumber to exit immediately after the first
|
|
5
5
|
scenario fails.
|
|
6
6
|
|
|
7
|
+
@todo-windows
|
|
7
8
|
Scenario: When a scenario fails
|
|
8
9
|
Given a file named "features/bad.feature" with:
|
|
9
10
|
"""
|
|
@@ -25,6 +26,7 @@ Feature: Fail fast
|
|
|
25
26
|
1 scenario (1 failed)
|
|
26
27
|
"""
|
|
27
28
|
|
|
29
|
+
@todo-windows
|
|
28
30
|
Scenario: When all the scenarios pass
|
|
29
31
|
Given a file named "features/first.feature" with:
|
|
30
32
|
"""
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
@needs-many-fonts
|
|
2
|
-
Feature:
|
|
2
|
+
Feature: i18n
|
|
3
3
|
|
|
4
4
|
It's possible to ask cucumber which keywords are used for any
|
|
5
5
|
particular language by running:
|
|
6
6
|
|
|
7
|
-
`cucumber --i18n <
|
|
7
|
+
`cucumber --i18n-keywords <LANG>`
|
|
8
8
|
|
|
9
9
|
This will print a table showing all the different words we use for
|
|
10
10
|
that language, to allow you to easily write features in any language
|
|
11
11
|
you choose.
|
|
12
12
|
|
|
13
13
|
Scenario: Get help for Portuguese language
|
|
14
|
-
When I run `cucumber --i18n pt
|
|
14
|
+
When I run `cucumber --i18n-keywords pt`
|
|
15
15
|
Then it should pass with:
|
|
16
16
|
"""
|
|
17
17
|
| feature | "Funcionalidade", "Característica", "Caracteristica" |
|
|
@@ -33,10 +33,10 @@ Feature: Language help
|
|
|
33
33
|
"""
|
|
34
34
|
|
|
35
35
|
Scenario: List languages
|
|
36
|
-
When I run `cucumber --i18n
|
|
36
|
+
When I run `cucumber --i18n-languages`
|
|
37
37
|
Then cucumber lists all the supported languages
|
|
38
38
|
|
|
39
39
|
Scenario: Seek help for invalid language
|
|
40
|
-
When I run `cucumber --i18n foo`
|
|
40
|
+
When I run `cucumber --i18n-keywords foo`
|
|
41
41
|
Then the output includes the message "Invalid language 'foo'"
|
|
42
|
-
And cucumber lists all the supported languages
|
|
42
|
+
And cucumber lists all the supported languages
|
|
@@ -57,7 +57,7 @@ Feature: Randomize
|
|
|
57
57
|
When I run `cucumber`
|
|
58
58
|
Then it should pass
|
|
59
59
|
|
|
60
|
-
@spawn
|
|
60
|
+
@spawn @todo-windows
|
|
61
61
|
Scenario: Run scenarios randomized
|
|
62
62
|
When I run `cucumber --order random:41544 -q`
|
|
63
63
|
Then it should fail
|
|
@@ -101,7 +101,7 @@ Feature: Randomize
|
|
|
101
101
|
|
|
102
102
|
"""
|
|
103
103
|
|
|
104
|
-
@spawn
|
|
104
|
+
@spawn @todo-windows
|
|
105
105
|
Scenario: Run scenarios randomized with some skipped
|
|
106
106
|
When I run `cucumber --tags ~@skipme --order random:41544 -q`
|
|
107
107
|
Then it should fail
|
|
@@ -1,32 +1,92 @@
|
|
|
1
|
-
@wip
|
|
2
1
|
Feature: Retry failing tests
|
|
3
2
|
|
|
4
3
|
Retry gives you a way to get through flaky tests that usually pass after a few runs.
|
|
5
4
|
This gives a development team a way forward other than disabling a valuable test.
|
|
6
|
-
|
|
5
|
+
|
|
7
6
|
- Specify max retry count in option
|
|
8
7
|
- Output information to the screen
|
|
9
8
|
- Output retry information in test report
|
|
10
|
-
|
|
9
|
+
|
|
11
10
|
Questions:
|
|
12
11
|
use a tag for flaky tests? Global option to retry any test that fails?
|
|
13
|
-
|
|
12
|
+
|
|
14
13
|
Background:
|
|
15
|
-
Given a scenario "
|
|
16
|
-
And a scenario "
|
|
14
|
+
Given a scenario "Fails-once" that fails once, then passes
|
|
15
|
+
And a scenario "Fails-twice" that fails twice, then passes
|
|
17
16
|
And a scenario "Solid" that passes
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Scenario:
|
|
21
|
-
|
|
17
|
+
|
|
18
|
+
@todo-windows
|
|
19
|
+
Scenario: Retry once, so Fails-once starts to pass
|
|
20
|
+
Given a scenario "Fails-forever" that fails
|
|
21
|
+
When I run `cucumber -q --retry 1 --format summary`
|
|
22
|
+
Then it should fail with:
|
|
23
|
+
"""
|
|
24
|
+
4 scenarios (2 failed, 1 flaky, 1 passed)
|
|
25
|
+
"""
|
|
26
|
+
And it should fail with:
|
|
27
|
+
"""
|
|
28
|
+
Fails-forever
|
|
29
|
+
Fails-forever ✗
|
|
30
|
+
Fails-forever ✗
|
|
31
|
+
|
|
32
|
+
Solid
|
|
33
|
+
Solid ✓
|
|
34
|
+
|
|
35
|
+
Fails-once feature
|
|
36
|
+
Fails-once ✗
|
|
37
|
+
Fails-once ✓
|
|
38
|
+
|
|
39
|
+
Fails-twice feature
|
|
40
|
+
Fails-twice ✗
|
|
41
|
+
Fails-twice ✗
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
@todo-windows
|
|
45
|
+
Scenario: Retry twice, so Fails-twice starts to pass too
|
|
46
|
+
Given a scenario "Fails-forever" that fails
|
|
47
|
+
When I run `cucumber -q --retry 2 --format summary`
|
|
22
48
|
Then it should fail with:
|
|
23
49
|
"""
|
|
24
|
-
4 scenarios (
|
|
50
|
+
4 scenarios (1 failed, 2 flaky, 1 passed)
|
|
25
51
|
"""
|
|
52
|
+
And it should fail with:
|
|
53
|
+
"""
|
|
54
|
+
Fails-forever
|
|
55
|
+
Fails-forever ✗
|
|
56
|
+
Fails-forever ✗
|
|
57
|
+
Fails-forever ✗
|
|
58
|
+
|
|
59
|
+
Solid
|
|
60
|
+
Solid ✓
|
|
26
61
|
|
|
27
|
-
|
|
28
|
-
|
|
62
|
+
Fails-once feature
|
|
63
|
+
Fails-once ✗
|
|
64
|
+
Fails-once ✓
|
|
65
|
+
|
|
66
|
+
Fails-twice feature
|
|
67
|
+
Fails-twice ✗
|
|
68
|
+
Fails-twice ✗
|
|
69
|
+
Fails-twice ✓
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
@todo-windows
|
|
73
|
+
Scenario: Flaky scenarios gives exit code zero in non-strict mode
|
|
74
|
+
When I run `cucumber -q --retry 2 --format summary`
|
|
29
75
|
Then it should pass with:
|
|
30
76
|
"""
|
|
31
|
-
|
|
32
|
-
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
3 scenarios (2 flaky, 1 passed)
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
@todo-windows
|
|
83
|
+
Scenario: Flaky scenarios gives non-zero exit code in strict mode
|
|
84
|
+
When I run `cucumber -q --retry 2 --format summary --strict`
|
|
85
|
+
Then it should fail with:
|
|
86
|
+
"""
|
|
87
|
+
Flaky Scenarios:
|
|
88
|
+
cucumber features/fails_once.feature:2
|
|
89
|
+
cucumber features/fails_twice.feature:2
|
|
90
|
+
|
|
91
|
+
3 scenarios (2 flaky, 1 passed)
|
|
92
|
+
"""
|
|
@@ -18,6 +18,7 @@ Feature: Running multiple formatters
|
|
|
18
18
|
And there is world peace
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
+
@todo-windows
|
|
21
22
|
Scenario: Multiple formatters and outputs
|
|
22
23
|
When I run `cucumber --no-color --format progress --out progress.txt --format pretty --out pretty.txt --no-source --dry-run --no-snippets features/test.feature`
|
|
23
24
|
Then the stderr should not contain anything
|
|
@@ -45,6 +46,7 @@ Feature: Running multiple formatters
|
|
|
45
46
|
|
|
46
47
|
"""
|
|
47
48
|
|
|
49
|
+
@todo-windows
|
|
48
50
|
Scenario: Two formatters to stdout
|
|
49
51
|
When I run `cucumber -f progress -f pretty features/test.feature`
|
|
50
52
|
Then it should fail with:
|
|
@@ -52,6 +54,7 @@ Feature: Running multiple formatters
|
|
|
52
54
|
All but one formatter must use --out, only one can print to each stream (or STDOUT) (RuntimeError)
|
|
53
55
|
"""
|
|
54
56
|
|
|
57
|
+
@todo-windows
|
|
55
58
|
Scenario: Two formatters to stdout when using a profile
|
|
56
59
|
Given the following profiles are defined:
|
|
57
60
|
"""
|
|
@@ -28,6 +28,9 @@ Feature: Strict mode
|
|
|
28
28
|
Undefined step: "this step passes" (Cucumber::Undefined)
|
|
29
29
|
features/missing.feature:3:in `Given this step passes'
|
|
30
30
|
|
|
31
|
+
Undefined Scenarios:
|
|
32
|
+
cucumber features/missing.feature:2
|
|
33
|
+
|
|
31
34
|
1 scenario (1 undefined)
|
|
32
35
|
1 step (1 undefined)
|
|
33
36
|
"""
|
|
@@ -45,6 +48,9 @@ Feature: Strict mode
|
|
|
45
48
|
./features/step_definitions/steps.rb:3:in `/^this step is pending$/'
|
|
46
49
|
features/pending.feature:3:in `Given this step is pending'
|
|
47
50
|
|
|
51
|
+
Pending Scenarios:
|
|
52
|
+
cucumber features/pending.feature:2
|
|
53
|
+
|
|
48
54
|
1 scenario (1 pending)
|
|
49
55
|
1 step (1 pending)
|
|
50
56
|
"""
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
Feature: Ambiguous Steps
|
|
2
|
+
|
|
3
|
+
When Cucumber searches for a step definition for a step, it might find multiple step
|
|
4
|
+
definitions that could match. In that case, it will give you an error that the step
|
|
5
|
+
definitions are ambiguous.
|
|
6
|
+
|
|
7
|
+
You can also use a `--guess` mode, where it uses magic powers to try and figure
|
|
8
|
+
out which of those two step definitions is most likely to be the one you meant it
|
|
9
|
+
to use. Use it with caution!
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
Scenario: Ambiguous steps
|
|
13
|
+
|
|
14
|
+
Given a file named "features/ambiguous.feature" with:
|
|
15
|
+
"""
|
|
16
|
+
Feature:
|
|
17
|
+
|
|
18
|
+
Scenario:
|
|
19
|
+
When a step
|
|
20
|
+
Then an ambiguous step
|
|
21
|
+
|
|
22
|
+
"""
|
|
23
|
+
And a file named "features/step_definitions.rb" with:
|
|
24
|
+
"""
|
|
25
|
+
When(/^a.*step$/) do
|
|
26
|
+
'foo'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Then(/^an ambiguous step$/) do
|
|
30
|
+
'bar'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
"""
|
|
34
|
+
When I run `cucumber`
|
|
35
|
+
Then it should fail with:
|
|
36
|
+
"""
|
|
37
|
+
Ambiguous match of "an ambiguous step":
|
|
38
|
+
|
|
39
|
+
features/step_definitions.rb:1:in `/^a.*step$/'
|
|
40
|
+
features/step_definitions.rb:5:in `/^an ambiguous step$/'
|
|
41
|
+
|
|
42
|
+
You can run again with --guess to make Cucumber be more smart about it
|
|
43
|
+
(Cucumber::Ambiguous)
|
|
44
|
+
features/ambiguous.feature:5:in `Then an ambiguous step'
|
|
45
|
+
|
|
46
|
+
Failing Scenarios:
|
|
47
|
+
cucumber features/ambiguous.feature:3 # Scenario:
|
|
48
|
+
|
|
49
|
+
1 scenario (1 failed)
|
|
50
|
+
2 steps (1 failed, 1 passed)
|
|
51
|
+
0m0.012s
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
Scenario: Ambiguous steps with guess mode
|
|
57
|
+
|
|
58
|
+
Given a file named "features/ambiguous.feature" with:
|
|
59
|
+
"""
|
|
60
|
+
Feature:
|
|
61
|
+
|
|
62
|
+
Scenario:
|
|
63
|
+
When a step
|
|
64
|
+
Then an ambiguous step
|
|
65
|
+
"""
|
|
66
|
+
And a file named "features/step_definitions.rb" with:
|
|
67
|
+
"""
|
|
68
|
+
When(/^a.*step$/) do
|
|
69
|
+
'foo'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
Then(/^an ambiguous step$/) do
|
|
73
|
+
'bar'
|
|
74
|
+
end
|
|
75
|
+
"""
|
|
76
|
+
When I run `cucumber -g`
|
|
77
|
+
Then it should pass with exactly:
|
|
78
|
+
"""
|
|
79
|
+
Feature:
|
|
80
|
+
|
|
81
|
+
Scenario: # features/ambiguous.feature:3
|
|
82
|
+
When a step # features/step_definitions.rb:1
|
|
83
|
+
Then an ambiguous step # features/step_definitions.rb:5
|
|
84
|
+
|
|
85
|
+
1 scenario (1 passed)
|
|
86
|
+
2 steps (2 passed)
|
|
87
|
+
0m0.012s
|
|
88
|
+
|
|
89
|
+
"""
|
|
@@ -12,6 +12,7 @@ Feature: Nested Steps
|
|
|
12
12
|
end
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
+
@todo-windows
|
|
15
16
|
Scenario: Use #steps to call several steps at once
|
|
16
17
|
Given a step definition that looks like this:
|
|
17
18
|
"""ruby
|
|
@@ -31,6 +32,7 @@ Feature: Nested Steps
|
|
|
31
32
|
|
|
32
33
|
"""
|
|
33
34
|
|
|
35
|
+
@todo-windows
|
|
34
36
|
Scenario: Use #step to call a single step
|
|
35
37
|
Given a step definition that looks like this:
|
|
36
38
|
"""ruby
|
|
@@ -48,6 +50,7 @@ Feature: Nested Steps
|
|
|
48
50
|
|
|
49
51
|
"""
|
|
50
52
|
|
|
53
|
+
@todo-windows
|
|
51
54
|
Scenario: Use #steps to call a table
|
|
52
55
|
Given a step definition that looks like this:
|
|
53
56
|
"""ruby
|
|
@@ -77,6 +80,7 @@ Feature: Nested Steps
|
|
|
77
80
|
|
|
78
81
|
"""
|
|
79
82
|
|
|
83
|
+
@todo-windows
|
|
80
84
|
Scenario: Use #steps to call a multi-line string
|
|
81
85
|
Given a step definition that looks like this:
|
|
82
86
|
"""ruby
|
|
@@ -103,7 +107,7 @@ Feature: Nested Steps
|
|
|
103
107
|
Liouville
|
|
104
108
|
"""
|
|
105
109
|
|
|
106
|
-
@spawn
|
|
110
|
+
@spawn @todo-windows
|
|
107
111
|
Scenario: Backtrace doesn't skip nested steps
|
|
108
112
|
Given a step definition that looks like this:
|
|
109
113
|
"""ruby
|
|
@@ -8,15 +8,18 @@ Feature: Nested Steps in I18n
|
|
|
8
8
|
And a step definition that looks like this:
|
|
9
9
|
"""ruby
|
|
10
10
|
# -*- coding: utf-8 -*-
|
|
11
|
+
# frozen_string_literal: true
|
|
11
12
|
前提 /a turtle/ do
|
|
12
13
|
puts "turtle!"
|
|
13
14
|
end
|
|
14
15
|
"""
|
|
15
16
|
|
|
17
|
+
@todo-windows
|
|
16
18
|
Scenario: Use #steps to call several steps at once
|
|
17
19
|
Given a step definition that looks like this:
|
|
18
20
|
"""ruby
|
|
19
21
|
# -*- coding: utf-8 -*-
|
|
22
|
+
# frozen_string_literal: true
|
|
20
23
|
前提 /two turtles/ do
|
|
21
24
|
steps %{
|
|
22
25
|
前提 a turtle
|