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.
Files changed (418) hide show
  1. checksums.yaml +7 -0
  2. data/.cane +0 -0
  3. data/.gitignore +17 -0
  4. data/.tailor +4 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGELOG.md +3 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +15 -0
  9. data/README.md +41 -0
  10. data/Rakefile +68 -0
  11. data/busser-behave.gemspec +30 -0
  12. data/features/plugin_install_command.feature +11 -0
  13. data/features/plugin_list_command.feature +8 -0
  14. data/features/support/env.rb +13 -0
  15. data/features/test_command.feature +31 -0
  16. data/lib/busser/behave/version.rb +26 -0
  17. data/lib/busser/runner_plugin/behave.rb +37 -0
  18. data/vendor/behave/CHANGES.rst +483 -0
  19. data/vendor/behave/LICENSE +23 -0
  20. data/vendor/behave/MANIFEST.in +37 -0
  21. data/vendor/behave/PROJECT_INFO.rst +21 -0
  22. data/vendor/behave/README.rst +112 -0
  23. data/vendor/behave/VERSION.txt +1 -0
  24. data/vendor/behave/behave.ini +22 -0
  25. data/vendor/behave/behave/__init__.py +30 -0
  26. data/vendor/behave/behave/__main__.py +187 -0
  27. data/vendor/behave/behave/_stepimport.py +185 -0
  28. data/vendor/behave/behave/_types.py +134 -0
  29. data/vendor/behave/behave/api/__init__.py +7 -0
  30. data/vendor/behave/behave/api/async_step.py +283 -0
  31. data/vendor/behave/behave/capture.py +227 -0
  32. data/vendor/behave/behave/compat/__init__.py +5 -0
  33. data/vendor/behave/behave/compat/collections.py +20 -0
  34. data/vendor/behave/behave/configuration.py +788 -0
  35. data/vendor/behave/behave/contrib/__init__.py +0 -0
  36. data/vendor/behave/behave/contrib/scenario_autoretry.py +73 -0
  37. data/vendor/behave/behave/formatter/__init__.py +12 -0
  38. data/vendor/behave/behave/formatter/_builtins.py +39 -0
  39. data/vendor/behave/behave/formatter/_registry.py +135 -0
  40. data/vendor/behave/behave/formatter/ansi_escapes.py +91 -0
  41. data/vendor/behave/behave/formatter/base.py +200 -0
  42. data/vendor/behave/behave/formatter/formatters.py +57 -0
  43. data/vendor/behave/behave/formatter/json.py +253 -0
  44. data/vendor/behave/behave/formatter/null.py +12 -0
  45. data/vendor/behave/behave/formatter/plain.py +158 -0
  46. data/vendor/behave/behave/formatter/pretty.py +351 -0
  47. data/vendor/behave/behave/formatter/progress.py +287 -0
  48. data/vendor/behave/behave/formatter/rerun.py +114 -0
  49. data/vendor/behave/behave/formatter/sphinx_steps.py +372 -0
  50. data/vendor/behave/behave/formatter/sphinx_util.py +118 -0
  51. data/vendor/behave/behave/formatter/steps.py +497 -0
  52. data/vendor/behave/behave/formatter/tags.py +178 -0
  53. data/vendor/behave/behave/i18n.py +614 -0
  54. data/vendor/behave/behave/importer.py +102 -0
  55. data/vendor/behave/behave/json_parser.py +264 -0
  56. data/vendor/behave/behave/log_capture.py +233 -0
  57. data/vendor/behave/behave/matchers.py +402 -0
  58. data/vendor/behave/behave/model.py +1737 -0
  59. data/vendor/behave/behave/model_core.py +416 -0
  60. data/vendor/behave/behave/model_describe.py +105 -0
  61. data/vendor/behave/behave/parser.py +615 -0
  62. data/vendor/behave/behave/reporter/__init__.py +0 -0
  63. data/vendor/behave/behave/reporter/base.py +45 -0
  64. data/vendor/behave/behave/reporter/junit.py +473 -0
  65. data/vendor/behave/behave/reporter/summary.py +94 -0
  66. data/vendor/behave/behave/runner.py +753 -0
  67. data/vendor/behave/behave/runner_util.py +417 -0
  68. data/vendor/behave/behave/step_registry.py +112 -0
  69. data/vendor/behave/behave/tag_expression.py +111 -0
  70. data/vendor/behave/behave/tag_matcher.py +465 -0
  71. data/vendor/behave/behave/textutil.py +137 -0
  72. data/vendor/behave/behave/userdata.py +130 -0
  73. data/vendor/behave/behave4cmd0/__all_steps__.py +12 -0
  74. data/vendor/behave/behave4cmd0/__init__.py +5 -0
  75. data/vendor/behave/behave4cmd0/__setup.py +11 -0
  76. data/vendor/behave/behave4cmd0/command_shell.py +216 -0
  77. data/vendor/behave/behave4cmd0/command_shell_proc.py +256 -0
  78. data/vendor/behave/behave4cmd0/command_steps.py +532 -0
  79. data/vendor/behave/behave4cmd0/command_util.py +147 -0
  80. data/vendor/behave/behave4cmd0/failing_steps.py +49 -0
  81. data/vendor/behave/behave4cmd0/log/__init__.py +1 -0
  82. data/vendor/behave/behave4cmd0/log/steps.py +395 -0
  83. data/vendor/behave/behave4cmd0/note_steps.py +29 -0
  84. data/vendor/behave/behave4cmd0/passing_steps.py +36 -0
  85. data/vendor/behave/behave4cmd0/pathutil.py +146 -0
  86. data/vendor/behave/behave4cmd0/setup_command_shell.py +24 -0
  87. data/vendor/behave/behave4cmd0/textutil.py +304 -0
  88. data/vendor/behave/bin/behave +44 -0
  89. data/vendor/behave/bin/behave.cmd +10 -0
  90. data/vendor/behave/bin/behave.junit_filter.py +85 -0
  91. data/vendor/behave/bin/behave.step_durations.py +163 -0
  92. data/vendor/behave/bin/behave2cucumber_json.py +63 -0
  93. data/vendor/behave/bin/behave_cmd.py +44 -0
  94. data/vendor/behave/bin/convert_i18n_yaml.py +77 -0
  95. data/vendor/behave/bin/explore_platform_encoding.py +24 -0
  96. data/vendor/behave/bin/i18n.yml +621 -0
  97. data/vendor/behave/bin/invoke +8 -0
  98. data/vendor/behave/bin/invoke.cmd +9 -0
  99. data/vendor/behave/bin/json.format.py +167 -0
  100. data/vendor/behave/bin/jsonschema_validate.py +122 -0
  101. data/vendor/behave/bin/make_localpi.py +279 -0
  102. data/vendor/behave/bin/project_bootstrap.sh +30 -0
  103. data/vendor/behave/bin/toxcmd.py +270 -0
  104. data/vendor/behave/bin/toxcmd3.py +270 -0
  105. data/vendor/behave/conftest.py +27 -0
  106. data/vendor/behave/docs/Makefile +154 -0
  107. data/vendor/behave/docs/_static/agogo.css +501 -0
  108. data/vendor/behave/docs/_static/behave_logo.png +0 -0
  109. data/vendor/behave/docs/_static/behave_logo1.png +0 -0
  110. data/vendor/behave/docs/_static/behave_logo2.png +0 -0
  111. data/vendor/behave/docs/_static/behave_logo3.png +0 -0
  112. data/vendor/behave/docs/_themes/LICENSE +45 -0
  113. data/vendor/behave/docs/_themes/kr/layout.html +17 -0
  114. data/vendor/behave/docs/_themes/kr/relations.html +19 -0
  115. data/vendor/behave/docs/_themes/kr/static/flasky.css_t +480 -0
  116. data/vendor/behave/docs/_themes/kr/static/small_flask.css +90 -0
  117. data/vendor/behave/docs/_themes/kr/theme.conf +7 -0
  118. data/vendor/behave/docs/_themes/kr_small/layout.html +22 -0
  119. data/vendor/behave/docs/_themes/kr_small/static/flasky.css_t +287 -0
  120. data/vendor/behave/docs/_themes/kr_small/theme.conf +10 -0
  121. data/vendor/behave/docs/api.rst +408 -0
  122. data/vendor/behave/docs/appendix.rst +19 -0
  123. data/vendor/behave/docs/behave.rst +640 -0
  124. data/vendor/behave/docs/behave.rst-template +86 -0
  125. data/vendor/behave/docs/behave_ecosystem.rst +81 -0
  126. data/vendor/behave/docs/comparison.rst +85 -0
  127. data/vendor/behave/docs/conf.py +293 -0
  128. data/vendor/behave/docs/context_attributes.rst +66 -0
  129. data/vendor/behave/docs/django.rst +192 -0
  130. data/vendor/behave/docs/formatters.rst +61 -0
  131. data/vendor/behave/docs/gherkin.rst +673 -0
  132. data/vendor/behave/docs/index.rst +57 -0
  133. data/vendor/behave/docs/install.rst +60 -0
  134. data/vendor/behave/docs/more_info.rst +184 -0
  135. data/vendor/behave/docs/new_and_noteworthy.rst +18 -0
  136. data/vendor/behave/docs/new_and_noteworthy_v1.2.4.rst +11 -0
  137. data/vendor/behave/docs/new_and_noteworthy_v1.2.5.rst +814 -0
  138. data/vendor/behave/docs/new_and_noteworthy_v1.2.6.rst +255 -0
  139. data/vendor/behave/docs/parse_builtin_types.rst +59 -0
  140. data/vendor/behave/docs/philosophy.rst +235 -0
  141. data/vendor/behave/docs/regular_expressions.rst +71 -0
  142. data/vendor/behave/docs/related.rst +14 -0
  143. data/vendor/behave/docs/test_domains.rst +62 -0
  144. data/vendor/behave/docs/tutorial.rst +636 -0
  145. data/vendor/behave/docs/update_behave_rst.py +100 -0
  146. data/vendor/behave/etc/json/behave.json-schema +172 -0
  147. data/vendor/behave/etc/junit.xml/behave_junit.xsd +103 -0
  148. data/vendor/behave/etc/junit.xml/junit-4.xsd +92 -0
  149. data/vendor/behave/examples/async_step/README.txt +8 -0
  150. data/vendor/behave/examples/async_step/behave.ini +14 -0
  151. data/vendor/behave/examples/async_step/features/async_dispatch.feature +8 -0
  152. data/vendor/behave/examples/async_step/features/async_run.feature +6 -0
  153. data/vendor/behave/examples/async_step/features/environment.py +28 -0
  154. data/vendor/behave/examples/async_step/features/steps/async_dispatch_steps.py +26 -0
  155. data/vendor/behave/examples/async_step/features/steps/async_steps34.py +10 -0
  156. data/vendor/behave/examples/async_step/features/steps/async_steps35.py +10 -0
  157. data/vendor/behave/examples/async_step/testrun_example.async_dispatch.txt +11 -0
  158. data/vendor/behave/examples/async_step/testrun_example.async_run.txt +9 -0
  159. data/vendor/behave/examples/env_vars/README.rst +26 -0
  160. data/vendor/behave/examples/env_vars/behave.ini +15 -0
  161. data/vendor/behave/examples/env_vars/behave_run.output_example.txt +12 -0
  162. data/vendor/behave/examples/env_vars/features/env_var.feature +6 -0
  163. data/vendor/behave/examples/env_vars/features/steps/env_var_steps.py +38 -0
  164. data/vendor/behave/features/README.txt +12 -0
  165. data/vendor/behave/features/background.feature +392 -0
  166. data/vendor/behave/features/capture_stderr.feature +172 -0
  167. data/vendor/behave/features/capture_stdout.feature +125 -0
  168. data/vendor/behave/features/cmdline.lang_list.feature +33 -0
  169. data/vendor/behave/features/configuration.default_paths.feature +116 -0
  170. data/vendor/behave/features/context.global_params.feature +35 -0
  171. data/vendor/behave/features/context.local_params.feature +17 -0
  172. data/vendor/behave/features/directory_layout.advanced.feature +147 -0
  173. data/vendor/behave/features/directory_layout.basic.feature +75 -0
  174. data/vendor/behave/features/directory_layout.basic2.feature +87 -0
  175. data/vendor/behave/features/environment.py +53 -0
  176. data/vendor/behave/features/exploratory_testing.with_table.feature +141 -0
  177. data/vendor/behave/features/feature.description.feature +0 -0
  178. data/vendor/behave/features/feature.exclude_from_run.feature +96 -0
  179. data/vendor/behave/features/formatter.help.feature +30 -0
  180. data/vendor/behave/features/formatter.json.feature +420 -0
  181. data/vendor/behave/features/formatter.progress3.feature +235 -0
  182. data/vendor/behave/features/formatter.rerun.feature +296 -0
  183. data/vendor/behave/features/formatter.steps.feature +181 -0
  184. data/vendor/behave/features/formatter.steps_catalog.feature +100 -0
  185. data/vendor/behave/features/formatter.steps_doc.feature +140 -0
  186. data/vendor/behave/features/formatter.steps_usage.feature +404 -0
  187. data/vendor/behave/features/formatter.tags.feature +134 -0
  188. data/vendor/behave/features/formatter.tags_location.feature +183 -0
  189. data/vendor/behave/features/formatter.user_defined.feature +196 -0
  190. data/vendor/behave/features/i18n.unicode_problems.feature +445 -0
  191. data/vendor/behave/features/logcapture.clear_handlers.feature +114 -0
  192. data/vendor/behave/features/logcapture.feature +188 -0
  193. data/vendor/behave/features/logcapture.filter.feature +130 -0
  194. data/vendor/behave/features/logging.no_capture.feature +99 -0
  195. data/vendor/behave/features/logging.setup_format.feature +157 -0
  196. data/vendor/behave/features/logging.setup_level.feature +168 -0
  197. data/vendor/behave/features/logging.setup_with_configfile.feature +137 -0
  198. data/vendor/behave/features/parser.background.sad_cases.feature +129 -0
  199. data/vendor/behave/features/parser.feature.sad_cases.feature +144 -0
  200. data/vendor/behave/features/runner.abort_by_user.feature +305 -0
  201. data/vendor/behave/features/runner.continue_after_failed_step.feature +136 -0
  202. data/vendor/behave/features/runner.default_format.feature +175 -0
  203. data/vendor/behave/features/runner.dry_run.feature +184 -0
  204. data/vendor/behave/features/runner.feature_listfile.feature +223 -0
  205. data/vendor/behave/features/runner.hook_errors.feature +382 -0
  206. data/vendor/behave/features/runner.multiple_formatters.feature +285 -0
  207. data/vendor/behave/features/runner.scenario_autoretry.feature +131 -0
  208. data/vendor/behave/features/runner.select_files_by_regexp.example.feature +71 -0
  209. data/vendor/behave/features/runner.select_files_by_regexp.feature +84 -0
  210. data/vendor/behave/features/runner.select_scenarios_by_file_location.feature +403 -0
  211. data/vendor/behave/features/runner.select_scenarios_by_name.feature +289 -0
  212. data/vendor/behave/features/runner.select_scenarios_by_tag.feature +225 -0
  213. data/vendor/behave/features/runner.stop_after_failure.feature +122 -0
  214. data/vendor/behave/features/runner.tag_logic.feature +67 -0
  215. data/vendor/behave/features/runner.unknown_formatter.feature +23 -0
  216. data/vendor/behave/features/runner.use_stage_implementations.feature +126 -0
  217. data/vendor/behave/features/scenario.description.feature +171 -0
  218. data/vendor/behave/features/scenario.exclude_from_run.feature +217 -0
  219. data/vendor/behave/features/scenario_outline.basics.feature +100 -0
  220. data/vendor/behave/features/scenario_outline.improved.feature +177 -0
  221. data/vendor/behave/features/scenario_outline.name_annotation.feature +157 -0
  222. data/vendor/behave/features/scenario_outline.parametrized.feature +401 -0
  223. data/vendor/behave/features/scenario_outline.tagged_examples.feature +118 -0
  224. data/vendor/behave/features/step.async_steps.feature +225 -0
  225. data/vendor/behave/features/step.duplicated_step.feature +106 -0
  226. data/vendor/behave/features/step.execute_steps.feature +59 -0
  227. data/vendor/behave/features/step.execute_steps.with_table.feature +65 -0
  228. data/vendor/behave/features/step.import_other_step_module.feature +103 -0
  229. data/vendor/behave/features/step.pending_steps.feature +128 -0
  230. data/vendor/behave/features/step.undefined_steps.feature +307 -0
  231. data/vendor/behave/features/step.use_step_library.feature +44 -0
  232. data/vendor/behave/features/step_dialect.generic_steps.feature +189 -0
  233. data/vendor/behave/features/step_dialect.given_when_then.feature +89 -0
  234. data/vendor/behave/features/step_param.builtin_types.with_float.feature +239 -0
  235. data/vendor/behave/features/step_param.builtin_types.with_integer.feature +305 -0
  236. data/vendor/behave/features/step_param.custom_types.feature +134 -0
  237. data/vendor/behave/features/steps/behave_active_tags_steps.py +86 -0
  238. data/vendor/behave/features/steps/behave_context_steps.py +67 -0
  239. data/vendor/behave/features/steps/behave_model_tag_logic_steps.py +105 -0
  240. data/vendor/behave/features/steps/behave_model_util.py +105 -0
  241. data/vendor/behave/features/steps/behave_select_files_steps.py +83 -0
  242. data/vendor/behave/features/steps/behave_tag_expression_steps.py +166 -0
  243. data/vendor/behave/features/steps/behave_undefined_steps.py +101 -0
  244. data/vendor/behave/features/steps/use_steplib_behave4cmd.py +12 -0
  245. data/vendor/behave/features/summary.undefined_steps.feature +114 -0
  246. data/vendor/behave/features/tags.active_tags.feature +385 -0
  247. data/vendor/behave/features/tags.default_tags.feature +104 -0
  248. data/vendor/behave/features/tags.tag_expression.feature +105 -0
  249. data/vendor/behave/features/userdata.feature +331 -0
  250. data/vendor/behave/invoke.yaml +21 -0
  251. data/vendor/behave/issue.features/README.txt +17 -0
  252. data/vendor/behave/issue.features/environment.py +97 -0
  253. data/vendor/behave/issue.features/issue0030.feature +21 -0
  254. data/vendor/behave/issue.features/issue0031.feature +16 -0
  255. data/vendor/behave/issue.features/issue0032.feature +28 -0
  256. data/vendor/behave/issue.features/issue0035.feature +74 -0
  257. data/vendor/behave/issue.features/issue0040.feature +154 -0
  258. data/vendor/behave/issue.features/issue0041.feature +135 -0
  259. data/vendor/behave/issue.features/issue0042.feature +230 -0
  260. data/vendor/behave/issue.features/issue0044.feature +51 -0
  261. data/vendor/behave/issue.features/issue0046.feature +77 -0
  262. data/vendor/behave/issue.features/issue0052.feature +66 -0
  263. data/vendor/behave/issue.features/issue0059.feature +29 -0
  264. data/vendor/behave/issue.features/issue0063.feature +102 -0
  265. data/vendor/behave/issue.features/issue0064.feature +97 -0
  266. data/vendor/behave/issue.features/issue0065.feature +18 -0
  267. data/vendor/behave/issue.features/issue0066.feature +80 -0
  268. data/vendor/behave/issue.features/issue0067.feature +90 -0
  269. data/vendor/behave/issue.features/issue0069.feature +64 -0
  270. data/vendor/behave/issue.features/issue0072.feature +32 -0
  271. data/vendor/behave/issue.features/issue0073.feature +228 -0
  272. data/vendor/behave/issue.features/issue0075.feature +18 -0
  273. data/vendor/behave/issue.features/issue0077.feature +89 -0
  274. data/vendor/behave/issue.features/issue0080.feature +49 -0
  275. data/vendor/behave/issue.features/issue0081.feature +138 -0
  276. data/vendor/behave/issue.features/issue0083.feature +69 -0
  277. data/vendor/behave/issue.features/issue0084.feature +69 -0
  278. data/vendor/behave/issue.features/issue0085.feature +119 -0
  279. data/vendor/behave/issue.features/issue0092.feature +66 -0
  280. data/vendor/behave/issue.features/issue0096.feature +173 -0
  281. data/vendor/behave/issue.features/issue0099.feature +130 -0
  282. data/vendor/behave/issue.features/issue0109.feature +60 -0
  283. data/vendor/behave/issue.features/issue0111.feature +53 -0
  284. data/vendor/behave/issue.features/issue0112.feature +64 -0
  285. data/vendor/behave/issue.features/issue0114.feature +118 -0
  286. data/vendor/behave/issue.features/issue0116.feature +71 -0
  287. data/vendor/behave/issue.features/issue0125.feature +49 -0
  288. data/vendor/behave/issue.features/issue0127.feature +64 -0
  289. data/vendor/behave/issue.features/issue0139.feature +67 -0
  290. data/vendor/behave/issue.features/issue0142.feature +37 -0
  291. data/vendor/behave/issue.features/issue0143.feature +54 -0
  292. data/vendor/behave/issue.features/issue0145.feature +63 -0
  293. data/vendor/behave/issue.features/issue0148.feature +105 -0
  294. data/vendor/behave/issue.features/issue0152.feature +52 -0
  295. data/vendor/behave/issue.features/issue0159.feature +74 -0
  296. data/vendor/behave/issue.features/issue0162.feature +86 -0
  297. data/vendor/behave/issue.features/issue0171.feature +16 -0
  298. data/vendor/behave/issue.features/issue0172.feature +51 -0
  299. data/vendor/behave/issue.features/issue0175.feature +91 -0
  300. data/vendor/behave/issue.features/issue0177.feature +40 -0
  301. data/vendor/behave/issue.features/issue0181.feature +36 -0
  302. data/vendor/behave/issue.features/issue0184.feature +144 -0
  303. data/vendor/behave/issue.features/issue0186.feature +12 -0
  304. data/vendor/behave/issue.features/issue0188.feature +60 -0
  305. data/vendor/behave/issue.features/issue0191.feature +178 -0
  306. data/vendor/behave/issue.features/issue0194.feature +215 -0
  307. data/vendor/behave/issue.features/issue0197.feature +11 -0
  308. data/vendor/behave/issue.features/issue0216.feature +129 -0
  309. data/vendor/behave/issue.features/issue0226.feature +51 -0
  310. data/vendor/behave/issue.features/issue0228.feature +41 -0
  311. data/vendor/behave/issue.features/issue0230.feature +46 -0
  312. data/vendor/behave/issue.features/issue0231.feature +77 -0
  313. data/vendor/behave/issue.features/issue0238.feature +52 -0
  314. data/vendor/behave/issue.features/issue0251.feature +15 -0
  315. data/vendor/behave/issue.features/issue0280.feature +118 -0
  316. data/vendor/behave/issue.features/issue0288.feature +95 -0
  317. data/vendor/behave/issue.features/issue0300.feature +49 -0
  318. data/vendor/behave/issue.features/issue0302.feature +91 -0
  319. data/vendor/behave/issue.features/issue0309.feature +52 -0
  320. data/vendor/behave/issue.features/issue0330.feature +124 -0
  321. data/vendor/behave/issue.features/issue0349.feature +9 -0
  322. data/vendor/behave/issue.features/issue0361.feature +79 -0
  323. data/vendor/behave/issue.features/issue0383.feature +76 -0
  324. data/vendor/behave/issue.features/issue0384.feature +103 -0
  325. data/vendor/behave/issue.features/issue0385.feature +109 -0
  326. data/vendor/behave/issue.features/issue0424.feature +66 -0
  327. data/vendor/behave/issue.features/issue0446.feature +116 -0
  328. data/vendor/behave/issue.features/issue0449.feature +42 -0
  329. data/vendor/behave/issue.features/issue0453.feature +42 -0
  330. data/vendor/behave/issue.features/issue0457.feature +65 -0
  331. data/vendor/behave/issue.features/issue0462.feature +38 -0
  332. data/vendor/behave/issue.features/issue0476.feature +39 -0
  333. data/vendor/behave/issue.features/issue0487.feature +92 -0
  334. data/vendor/behave/issue.features/issue0506.feature +77 -0
  335. data/vendor/behave/issue.features/issue0510.feature +51 -0
  336. data/vendor/behave/issue.features/requirements.txt +12 -0
  337. data/vendor/behave/issue.features/steps/ansi_steps.py +20 -0
  338. data/vendor/behave/issue.features/steps/behave_hooks_steps.py +10 -0
  339. data/vendor/behave/issue.features/steps/use_steplib_behave4cmd.py +13 -0
  340. data/vendor/behave/more.features/formatter.json.validate_output.feature +37 -0
  341. data/vendor/behave/more.features/steps/tutorial_steps.py +16 -0
  342. data/vendor/behave/more.features/steps/use_steplib_behave4cmd.py +7 -0
  343. data/vendor/behave/more.features/tutorial.feature +6 -0
  344. data/vendor/behave/py.requirements/README.txt +5 -0
  345. data/vendor/behave/py.requirements/all.txt +16 -0
  346. data/vendor/behave/py.requirements/basic.txt +21 -0
  347. data/vendor/behave/py.requirements/develop.txt +28 -0
  348. data/vendor/behave/py.requirements/docs.txt +6 -0
  349. data/vendor/behave/py.requirements/json.txt +7 -0
  350. data/vendor/behave/py.requirements/more_py26.txt +8 -0
  351. data/vendor/behave/py.requirements/testing.txt +10 -0
  352. data/vendor/behave/pytest.ini +24 -0
  353. data/vendor/behave/setup.cfg +29 -0
  354. data/vendor/behave/setup.py +118 -0
  355. data/vendor/behave/setuptools_behave.py +130 -0
  356. data/vendor/behave/tasks/__behave.py +45 -0
  357. data/vendor/behave/tasks/__init__.py +55 -0
  358. data/vendor/behave/tasks/__main__.py +70 -0
  359. data/vendor/behave/tasks/_setup.py +135 -0
  360. data/vendor/behave/tasks/_vendor/README.rst +35 -0
  361. data/vendor/behave/tasks/_vendor/invoke.zip +0 -0
  362. data/vendor/behave/tasks/_vendor/path.py +1725 -0
  363. data/vendor/behave/tasks/_vendor/pathlib.py +1280 -0
  364. data/vendor/behave/tasks/_vendor/six.py +868 -0
  365. data/vendor/behave/tasks/clean.py +246 -0
  366. data/vendor/behave/tasks/docs.py +97 -0
  367. data/vendor/behave/tasks/requirements.txt +17 -0
  368. data/vendor/behave/tasks/test.py +192 -0
  369. data/vendor/behave/test/__init__.py +0 -0
  370. data/vendor/behave/test/_importer_candidate.py +3 -0
  371. data/vendor/behave/test/reporters/__init__.py +0 -0
  372. data/vendor/behave/test/reporters/test_summary.py +240 -0
  373. data/vendor/behave/test/test_ansi_escapes.py +73 -0
  374. data/vendor/behave/test/test_configuration.py +172 -0
  375. data/vendor/behave/test/test_formatter.py +265 -0
  376. data/vendor/behave/test/test_formatter_progress.py +39 -0
  377. data/vendor/behave/test/test_formatter_rerun.py +97 -0
  378. data/vendor/behave/test/test_formatter_tags.py +57 -0
  379. data/vendor/behave/test/test_importer.py +151 -0
  380. data/vendor/behave/test/test_log_capture.py +29 -0
  381. data/vendor/behave/test/test_matchers.py +236 -0
  382. data/vendor/behave/test/test_model.py +871 -0
  383. data/vendor/behave/test/test_parser.py +1590 -0
  384. data/vendor/behave/test/test_runner.py +1074 -0
  385. data/vendor/behave/test/test_step_registry.py +96 -0
  386. data/vendor/behave/test/test_tag_expression.py +506 -0
  387. data/vendor/behave/test/test_tag_expression2.py +462 -0
  388. data/vendor/behave/test/test_tag_matcher.py +729 -0
  389. data/vendor/behave/test/test_userdata.py +184 -0
  390. data/vendor/behave/tests/README.txt +12 -0
  391. data/vendor/behave/tests/__init__.py +0 -0
  392. data/vendor/behave/tests/api/__ONLY_PY34_or_newer.txt +0 -0
  393. data/vendor/behave/tests/api/__init__.py +0 -0
  394. data/vendor/behave/tests/api/_test_async_step34.py +130 -0
  395. data/vendor/behave/tests/api/_test_async_step35.py +75 -0
  396. data/vendor/behave/tests/api/test_async_step.py +18 -0
  397. data/vendor/behave/tests/api/testing_support.py +94 -0
  398. data/vendor/behave/tests/api/testing_support_async.py +21 -0
  399. data/vendor/behave/tests/issues/test_issue0336.py +66 -0
  400. data/vendor/behave/tests/issues/test_issue0449.py +55 -0
  401. data/vendor/behave/tests/issues/test_issue0453.py +62 -0
  402. data/vendor/behave/tests/issues/test_issue0458.py +54 -0
  403. data/vendor/behave/tests/issues/test_issue0495.py +65 -0
  404. data/vendor/behave/tests/unit/__init__.py +0 -0
  405. data/vendor/behave/tests/unit/test_behave4cmd_command_shell_proc.py +135 -0
  406. data/vendor/behave/tests/unit/test_capture.py +280 -0
  407. data/vendor/behave/tests/unit/test_model_core.py +56 -0
  408. data/vendor/behave/tests/unit/test_textutil.py +267 -0
  409. data/vendor/behave/tools/test-features/background.feature +9 -0
  410. data/vendor/behave/tools/test-features/environment.py +8 -0
  411. data/vendor/behave/tools/test-features/french.feature +11 -0
  412. data/vendor/behave/tools/test-features/outline.feature +39 -0
  413. data/vendor/behave/tools/test-features/parse.feature +10 -0
  414. data/vendor/behave/tools/test-features/step-data.feature +60 -0
  415. data/vendor/behave/tools/test-features/steps/steps.py +120 -0
  416. data/vendor/behave/tools/test-features/tags.feature +18 -0
  417. data/vendor/behave/tox.ini +159 -0
  418. metadata +562 -0
@@ -0,0 +1,57 @@
1
+ Welcome to behave!
2
+ ==================
3
+
4
+ behave is behaviour-driven development, Python style.
5
+
6
+ Behavior-driven development (or BDD) is an agile software development
7
+ technique that encourages collaboration between developers, QA and
8
+ non-technical or business participants in a software project. We have
9
+ a page further describing this :doc:`philosophy <philosophy>`.
10
+
11
+ :pypi:`behave` uses tests written in a natural language style,
12
+ backed up by Python code.
13
+
14
+ Once you've :doc:`installed <install>` *behave*, we recommend reading the
15
+
16
+ * :doc:`tutorial <tutorial>` first and then
17
+ * :doc:`feature test setup <gherkin>`,
18
+ * :doc:`behave API <api>` and
19
+ * :doc:`related software <related>` (things that you can combine with :pypi:`behave`)
20
+ * finally: :doc:`how to use and configure <behave>` the :pypi:`behave` tool.
21
+
22
+ There is also a :doc:`comparison <comparison>` with the other tools available.
23
+
24
+ Contents
25
+ --------
26
+
27
+ .. toctree::
28
+ :maxdepth: 2
29
+
30
+ install
31
+ tutorial
32
+ philosophy
33
+ gherkin
34
+ behave
35
+ api
36
+ django
37
+ comparison
38
+ new_and_noteworthy
39
+ more_info
40
+ appendix
41
+
42
+ .. seealso::
43
+
44
+ * `behave.example`_: `Behave Examples and Tutorials`_ (HTML)
45
+ * Peter Parente: `BDD and Behave <http://tott-meetup.readthedocs.org/en/latest/sessions/behave.html>`_ (tutorial)
46
+
47
+ .. _behave.example: https://github.com/behave/behave.example
48
+ .. _`Behave Examples and Tutorials`: http://behave.github.io/behave.example/
49
+
50
+
51
+ Indices and tables
52
+ ==================
53
+
54
+ * :ref:`genindex`
55
+ * :ref:`modindex`
56
+ * :ref:`search`
57
+
@@ -0,0 +1,60 @@
1
+ Installation
2
+ ============
3
+
4
+ Using pip (or ...)
5
+ ------------------
6
+
7
+ :Category: Stable version
8
+ :Precondition: :pypi:`pip` (or :pypi:`setuptools`) is installed
9
+
10
+ Execute the following command to install :pypi:`behave` with :pypi:`pip`:
11
+
12
+ pip install behave
13
+
14
+ To update an already installed :pypi:`behave` version, use:
15
+
16
+ pip install -U behave
17
+
18
+ As an alternative,
19
+ you can also use :pypi:`easy_install <setuptools>` to install :pypi:`behave`::
20
+
21
+ easy_install behave # CASE: New installation.
22
+ easy_install -U behave # CASE: Upgrade existing installation.
23
+
24
+
25
+ .. hint::
26
+
27
+ See also `pip related information`_ for installing Python packages.
28
+
29
+ .. _`pip related information`: https://pip.pypa.io/en/latest/installing.html
30
+
31
+
32
+ Using a Source Distribution
33
+ ---------------------------
34
+
35
+ After unpacking the :pypi:`behave` source distribution,
36
+ enter the newly created directory "behave-<version>" and run::
37
+
38
+ python setup.py install
39
+
40
+
41
+ Using the Github Repository
42
+ ---------------------------
43
+
44
+ :Category: Bleading edge
45
+ :Precondition: :pypi:`pip` is installed
46
+
47
+ Run the following command
48
+ to install the newest version from the `Github repository`_::
49
+
50
+
51
+ pip install git+https://github.com/behave/behave
52
+
53
+ To install a tagged version from the `Github repository`_, use::
54
+
55
+ pip install git+https://github.com/behave/behave@<tag>
56
+
57
+ where <tag> is the placeholder for an `existing tag`_.
58
+
59
+ .. _`Github repository`: https://github.com/behave/behave
60
+ .. _`existing tag`: https://github.com/behave/behave/tags
@@ -0,0 +1,184 @@
1
+ .. _id.appendix.more_info:
2
+
3
+ More Information about Behave
4
+ ==============================================================================
5
+
6
+
7
+ Tutorials
8
+ ------------------------------------------------------------------------------
9
+
10
+ For new users, that want to read, understand and explore the concepts in Gherkin
11
+ and `behave`_ (after reading the behave documentation):
12
+
13
+ * "`Behave by Example <http://behave.github.io/behave.example/>`_"
14
+ (on `github <https://github.com/behave/behave.example>`_)
15
+
16
+ The following small tutorials provide an introduction how you use `behave`_
17
+ in a specific testing domain:
18
+
19
+ * Phillip Johnson, `Getting Started with Behavior Testing in Python with Behave`_
20
+ * `Bdd with Python, Behave and WebDriver`_
21
+ * Wayne Witzel III, `Using Behave with Pyramid`_, 2014-01-10.
22
+
23
+ .. _`Getting Started with Behavior Testing in Python with Behave`: https://semaphoreci.com/community/tutorials/getting-started-with-behavior-testing-in-python-with-behave
24
+ .. _`Bdd with Python, Behave and WebDriver`: https://testingbot.com/support/getting-started/behave.html
25
+ .. _`Using Behave with Pyramid`: https://www.safaribooksonline.com/blog/2014/01/10/using-behave-with-pyramid/
26
+
27
+ .. warning::
28
+
29
+ A word of caution if you are new to **"behaviour-driven development" (BDD)**.
30
+ In general, you want to avoid "user interface" (UI) details in your
31
+ scenarios, because they describe **how something is implemented**
32
+ (in this case the UI itself), like:
33
+
34
+ * ``press this button``
35
+ * then ``enter this text into the text field``
36
+ * ...
37
+
38
+ In **BDD** (or testing in general), you should describe **what should be done**
39
+ (meaning the intention). This will make your scenarios much more robust
40
+ and stable because you can change the underlying implementation of:
41
+
42
+ * the "system under test" (SUT) or
43
+ * the test automation layer, that interacts with the SUT.
44
+
45
+ without changing the scenarios.
46
+
47
+
48
+ Books
49
+ ------------------------------------------------------------------------------
50
+
51
+ `Behave`_ is covered in the following books:
52
+
53
+ .. [TDD-Python] Harry Percival,
54
+ `Test-Driven Web Development with Python`_, O'Reilly, June 2014,
55
+ `Appendix E: BDD <http://chimera.labs.oreilly.com/books/1234000000754/ape.html>`_
56
+ (covers behave)
57
+
58
+ .. _`Test-Driven Web Development with Python`: http://chimera.labs.oreilly.com/books/1234000000754
59
+
60
+
61
+ Presentation Videos
62
+ ------------------------------------------------------------------------------
63
+
64
+ * Benno Rice: `Making Your Application Behave`_ (30min),
65
+ 2012-08-12, PyCon Australia.
66
+
67
+ * Selenium: `First behave python tuorial with selenium`_ (8min), 2015-01-28,
68
+ http://www.seleniumframework.com/python-basic/first-behave-gherkin/
69
+
70
+ * Jessica Ingrasselino: `Automation with Python and Behave`_ (67min), 2015-12-16
71
+
72
+ * `Selenium Python Webdriver Tutorial - Behave (BDD)`_ (14min), 2016-01-21
73
+
74
+
75
+ .. hidden:
76
+
77
+ PREPARED:
78
+ ---------------------
79
+
80
+ .. ifconfig:: not supports_video
81
+
82
+ * Benno Rice: `Making Your Application Behave`_ (30min),
83
+ PyCon Australia, 2012-08-12
84
+
85
+ * Selenium: `First behave python tuorial with selenium`_ (8min), 2015-01-28,
86
+ http://www.seleniumframework.com/python-basic/first-behave-gherkin/
87
+
88
+ * Jessica Ingrasselino: `Automation with Python and Behave`_ (67min), 2015-12-16
89
+
90
+ * `Selenium Python Webdriver Tutorial - Behave (BDD)`_ (14min), 2016-01-21
91
+
92
+
93
+ .. hint::
94
+
95
+ Manually install `sphinxcontrib-youtube`_
96
+ (from "youtube" subdirectory in sphinx-extensions bundle)
97
+ to have embedded videos on this page (when this page is build).
98
+
99
+
100
+ .. ifconfig:: supports_video
101
+
102
+ Benno Rice: `Making Your Application Behave`_
103
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104
+
105
+ :Conference: PyCon Australia
106
+ :Date: 2012-08-12
107
+ :Duration: 30min
108
+
109
+ .. youtube:: u8BOKuNkmhg
110
+ :width: 600
111
+ :height: 400
112
+
113
+ Selenium: `First behave python tuorial with selenium`_
114
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
115
+
116
+ :Date: 2015-01-28
117
+ :Duration: 8min
118
+
119
+ .. youtube:: D24_QrGUCFk
120
+ :width: 600
121
+ :height: 400
122
+
123
+ RELATED: http://www.seleniumframework.com/python-basic/what-is-python/
124
+
125
+ Jessica Ingrasselino: `Automation with Python and Behave`_
126
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
+
128
+ :Date: 2015-12-16
129
+ :Duration: 67min
130
+
131
+ .. youtube:: e78c7h6DRDQ
132
+ :width: 600
133
+ :height: 400
134
+
135
+ `Selenium Python Webdriver Tutorial - Behave (BDD)`_
136
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
137
+
138
+ :Date: 2016-01-21
139
+ :Duration: 14min
140
+
141
+ .. youtube:: mextSo0UExc
142
+ :width: 600
143
+ :height: 400
144
+
145
+
146
+ .. _`Making Your Application Behave`: https://www.youtube.com/watch?v=u8BOKuNkmhg
147
+ .. _`First behave python tuorial with selenium`: https://www.youtube.com/watch?v=D24_QrGUCFk
148
+ .. _`Automation with Python and Behave`: https://www.youtube.com/watch?v=e78c7h6DRDQ
149
+ .. _`Selenium Python Webdriver Tutorial - Behave (BDD)`: https://www.youtube.com/watch?v=mextSo0UExc
150
+
151
+ .. _sphinxcontrib-youtube: https://bitbucket.org/birkenfeld/sphinx-contrib
152
+
153
+
154
+ Tool-oriented Tutorials
155
+ ------------------------------------------------------------------------------
156
+
157
+ JetBrains PyCharm:
158
+
159
+ * Blog: `In-Depth Screencast on Testing`_ (2016-04-11; video offset=2:10min)
160
+ * Docs: `BDD Testing Framework Support in PyCharm 2016.1
161
+ <https://www.jetbrains.com/help/pycharm/2016.1/bdd-testing-framework.html>`_
162
+
163
+
164
+ .. _`Getting Started with PyCharm`: https://www.youtube.com/playlist?list=PLQ176FUIyIUZ1mwB-uImQE-gmkwzjNLjP
165
+ .. _`PyCharm In-Depth: Testing`: https://youtu.be/nmBbR97Vsv8?list=PLQ176FUIyIUZ1mwB-uImQE-gmkwzjNLjP
166
+ .. _`In-Depth Screencast on Testing`: http://blog.jetbrains.com/pycharm/2016/04/in-depth-screencast-on-testing/
167
+
168
+
169
+
170
+ Find more Information
171
+ ------------------------------------------------------------------------------
172
+
173
+ .. seealso::
174
+
175
+ * google:`python-behave examples <https://www.google.com/?q=python-behave%20examples>`_
176
+ * google:`python-behave tutorials <https://www.google.com/?q=python-behave%20tutorials>`_
177
+ * google:`python-behave videos <https://www.google.com/?q=python-behave%20videos>`_
178
+
179
+
180
+ .. _Behave: https://github.com/behave/behave
181
+ .. _behave: https://github.com/behave/behave
182
+ .. _Selenium: http://docs.seleniumhq.org/
183
+ .. _behave4cmd: https://github.com/behave/behave4cmd
184
+ .. _behave-django: https://github.com/behave/behave-django
@@ -0,0 +1,18 @@
1
+ New and Noteworthy
2
+ ==============================================================================
3
+
4
+ In the good tradition of the `Eclipse IDE`_,
5
+ a number of news, changes and improvements are described here to provide
6
+ better background information about what has changed and how to make use of it.
7
+
8
+ This page orders the information by newest version first.
9
+
10
+ .. _`Eclipse IDE`: http://www.eclipse.org/
11
+
12
+ .. toctree::
13
+ :maxdepth: 2
14
+
15
+ new_and_noteworthy_v1.2.6
16
+ new_and_noteworthy_v1.2.5
17
+ new_and_noteworthy_v1.2.4
18
+
@@ -0,0 +1,11 @@
1
+ Noteworthy in Version 1.2.4
2
+ ==============================================================================
3
+
4
+
5
+ Diagnostics: Start Debugger on Error
6
+ -------------------------------------------------------------------------------
7
+
8
+ :Since: behave 1.2.4a1
9
+
10
+ See also :ref:`debug-on-error` .
11
+
@@ -0,0 +1,814 @@
1
+ Noteworthy in Version 1.2.5
2
+ ==============================================================================
3
+
4
+ Scenario Outline Improvements
5
+ -------------------------------------------------------------------------------
6
+
7
+ .. index::
8
+ single: ScenarioOutline; name annotation
9
+ pair: ScenarioOutline; file location
10
+
11
+ Better represent Example/Row
12
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
13
+
14
+ :Since: behave 1.2.5a1
15
+ :Covers: Name annotation, file location
16
+
17
+ A scenario outline basically a parametrized scenario template.
18
+ It represents a macro/script that is executed for a data-driven set of examples
19
+ (parametrized data). Therefore, a scenario outline generates several scenarios,
20
+ each representing one example/row combination.
21
+
22
+ .. code-block:: gherkin
23
+
24
+ # -- file:features/xxx.feature
25
+ Feature:
26
+ Scenario Outline: Wow # line 2
27
+ Given an employee "<name>"
28
+
29
+ Examples: Araxas
30
+ | name | birthyear |
31
+ | Alice | 1985 | # line 7
32
+ | Bob | 1975 | # line 8
33
+
34
+ Examples:
35
+ | name | birthyear |
36
+ | Charly | 1995 | # line 12
37
+
38
+
39
+ Up to now, the following scenarios were generated from the scenario outline:
40
+
41
+ .. code-block:: gherkin
42
+
43
+ Scenario Outline: Wow # features/xxx.feature:2
44
+ Given an employee "Alice"
45
+
46
+ Scenario Outline: Wow # features/xxx.feature:2
47
+ Given an employee "Bob"
48
+
49
+ Scenario Outline: Wow # features/xxx.feature:2
50
+ Given an employee "Charly"
51
+
52
+ Note that all generated scenarios had the:
53
+
54
+ * same name (scenario_outline.name)
55
+ * same file location (scenario_outline.file_location)
56
+
57
+ From now on, the generated scenarios better
58
+ represent the example/row combination within a scenario outline:
59
+
60
+ .. code-block:: gherkin
61
+
62
+ Scenario Outline: Wow -- @1.1 Araxas # features/xxx.feature:7
63
+ Given an employee "Alice"
64
+
65
+ Scenario Outline: Wow -- @1.2 Araxas # features/xxx.feature:8
66
+ Given an employee "Bob"
67
+
68
+ Scenario Outline: Wow -- @2.1 # features/xxx.feature:12
69
+ Given an employee "Charly"
70
+
71
+ Note that:
72
+
73
+ * scenario name is now unique for any examples/row combination
74
+ * scenario name optionally contains the examples (group) name (if one exists)
75
+ * each scenario has a unique file location, based on the row's file location
76
+
77
+ Therefore, each generated scenario from a scenario outline can be selected
78
+ via its file location (and run on its own). In addition, if one fails,
79
+ it is now possible to rerun only the failing example/row combination(s).
80
+
81
+ The name annoations schema for the generated scenarios from above provides
82
+ the new default name annotation schema.
83
+ It can be adapted/overwritten in "behave.ini":
84
+
85
+ .. code-block:: ini
86
+
87
+ # -- file:behave.ini
88
+ [behave]
89
+ scenario_outline_annotation_schema = {name} -- @{row.id} {examples.name}
90
+
91
+ # -- REVERT TO: Old naming schema:
92
+ # scenario_outline_annotation_schema = {name}
93
+
94
+
95
+ The following additional placeholders are provided within a
96
+ scenario outline to support this functionality.
97
+ They can be used anywhere within a scenario outline.
98
+
99
+ =============== ===============================================================
100
+ Placeholder Description
101
+ =============== ===============================================================
102
+ examples.name Refers name of the example group, may be an empty string.
103
+ examples.index Index of the example group (range=1..N).
104
+ row.index Index of the current row within an example group (range=1..R).
105
+ row.id Shortcut for schema: "<examples.index>.<row.index>"
106
+ =============== ===============================================================
107
+
108
+
109
+ .. index::
110
+ single: ScenarioOutline; name with placeholders
111
+
112
+ Name may contain Placeholders
113
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
114
+
115
+ :Since: behave 1.2.5a1
116
+
117
+ A scenario outline can now use placeholders from example/rows in its name
118
+ or its examples name. When the scenarios a generated,
119
+ these placeholders will be replaced with the values of the example/row.
120
+
121
+ Up to now this behavior did only apply to steps of a scenario outline.
122
+
123
+ EXAMPLE:
124
+
125
+ .. code-block:: gherkin
126
+
127
+ # -- file:features/xxx.feature
128
+ Feature:
129
+ Scenario Outline: Wow <name>-<birthyear> # line 2
130
+ Given an employee "<name>"
131
+
132
+ Examples:
133
+ | name | birthyear |
134
+ | Alice | 1985 | # line 7
135
+ | Bob | 1975 | # line 8
136
+
137
+ Examples: Benares-<ID>
138
+ | name | birthyear | ID |
139
+ | Charly | 1995 | 42 | # line 12
140
+
141
+
142
+ This leads to the following generated scenarios,
143
+ one for each examples/row combination:
144
+
145
+ .. code-block:: gherkin
146
+
147
+ Scenario Outline: Wow Alice-1985 -- @1.1 # features/xxx.feature:7
148
+ Given an employee "Alice"
149
+
150
+ Scenario Outline: Wow Bob-1975 -- @1.2 # features/xxx.feature:8
151
+ Given an employee "Bob"
152
+
153
+ Scenario Outline: Wow Charly-1885 -- @2.1 Benares-42 # features/xxx.feature:12
154
+ Given an employee "Charly"
155
+
156
+ .. index::
157
+ pair: ScenarioOutline; tags with placeholders
158
+
159
+ Tags may contain Placeholders
160
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
161
+
162
+ :Since: behave 1.2.5a1
163
+
164
+ Tags from a Scenario Outline are also part of the parametrized template.
165
+ Therefore, you may also use placeholders in the tags of a Scenario Outline.
166
+
167
+ .. note::
168
+
169
+ * Placeholder names, that are used in tags, should not contain whitespace.
170
+ * Placeholder values, that are used in tags, are transformed to contain
171
+ no whitespace characters.
172
+
173
+
174
+ EXAMPLE:
175
+
176
+ .. code-block:: gherkin
177
+
178
+ # -- file:features/xxx.feature
179
+ Feature:
180
+
181
+ @foo.group<examples.index>
182
+ @foo.row<row.id>
183
+ @foo.name.<name>
184
+ Scenario Outline: Wow # line 6
185
+ Given an employee "<name>"
186
+
187
+ Examples: Araxas
188
+ | name | birthyear |
189
+ | Alice | 1985 | # line 11
190
+ | Bob | 1975 | # line 12
191
+
192
+ Examples: Benares
193
+ | name | birthyear | ID |
194
+ | Charly | 1995 | 42 | # line 16
195
+
196
+
197
+ This leads to the following generated scenarios,
198
+ one for each examples/row combination:
199
+
200
+ .. code-block:: gherkin
201
+
202
+ @foo.group1 @foo.row1.1 @foo.name.Alice
203
+ Scenario Outline: Wow -- @1.1 Araxas # features/xxx.feature:11
204
+ Given an employee "Alice"
205
+
206
+ @foo.group1 @foo.row1.2 @foo.name.Bob
207
+ Scenario Outline: Wow -- @1.2 Araxas # features/xxx.feature:12
208
+ Given an employee "Bob"
209
+
210
+ @foo.group2 @foo.row2.1 @foo.name.Charly
211
+ Scenario Outline: Wow -- @2.1 Benares # features/xxx.feature:16
212
+ Given an employee "Charly"
213
+
214
+ .. index::
215
+ single: ScenarioOutline; select-group-by-tag
216
+
217
+ It is now possible to run only the examples group "Araxas" (examples group 1)
218
+ by using the select-by-tag mechanism:
219
+
220
+ .. code-block:: sh
221
+
222
+ $ behave --tags=@foo.group1 -f progress3 features/xxx.feature
223
+ ... # features/xxx.feature
224
+ Wow -- @1.1 Araxas .
225
+ Wow -- @1.2 Araxas .
226
+
227
+
228
+ .. index::
229
+ single: ScenarioOutline; select-group-by-name
230
+
231
+ Run examples group via select-by-name
232
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
233
+
234
+ :Since: behave 1.2.5a1
235
+
236
+ The improvements on unique generated scenario names for a scenario outline
237
+ (with name annotation) can now be used to run all rows of one examples group.
238
+
239
+ EXAMPLE:
240
+
241
+ .. code-block:: gherkin
242
+
243
+ # -- file:features/xxx.feature
244
+ Feature:
245
+ Scenario Outline: Wow # line 2
246
+ Given an employee "<name>"
247
+
248
+ Examples: Araxas
249
+ | name | birthyear |
250
+ | Alice | 1985 | # line 7
251
+ | Bob | 1975 | # line 8
252
+
253
+ Examples: Benares
254
+ | name | birthyear |
255
+ | Charly | 1995 | # line 12
256
+
257
+
258
+ This leads to the following generated scenarios (when the feature is executed):
259
+
260
+ .. code-block:: gherkin
261
+
262
+ Scenario Outline: Wow -- @1.1 Araxas # features/xxx.feature:7
263
+ Given an employee "Alice"
264
+
265
+ Scenario Outline: Wow -- @1.2 Araxas # features/xxx.feature:8
266
+ Given an employee "Bob"
267
+
268
+ Scenario Outline: Wow -- @2.1 Benares # features/xxx.feature:12
269
+ Given an employee "Charly"
270
+
271
+
272
+ You can now run all rows of the "Araxas" examples (group)
273
+ by selecting it by name (name part or regular expression):
274
+
275
+ .. code-block:: sh
276
+
277
+ $ behave --name=Araxas -f progress3 features/xxx.feature
278
+ ... # features/xxx.feature
279
+ Wow -- @1.1 Araxas .
280
+ Wow -- @1.2 Araxas .
281
+
282
+ $ behave --name='-- @.* Araxas' -f progress3 features/xxx.feature
283
+ ... # features/xxx.feature
284
+ Wow -- @1.1 Araxas .
285
+ Wow -- @1.2 Araxas .
286
+
287
+
288
+ .. index::
289
+ single: Scenario; exclude from test run
290
+ pair: Scenario; exclude from test run
291
+ single: Feature; exclude from test run
292
+ pair: Feature; exclude from test run
293
+
294
+
295
+ Exclude Feature/Scenario at Runtime
296
+ -------------------------------------------------------------------------------
297
+
298
+ :Since: behave 1.2.5a1
299
+
300
+ A test writer can now provide a runtime decision logic to exclude
301
+ a feature, scenario or scenario outline from a test run
302
+ within the following hooks:
303
+
304
+ * ``before_feature()`` for a feature
305
+ * ``before_scenario()`` for a scenario
306
+ * step implementation (normally only: given step)
307
+
308
+ by using the ``skip()`` method before a feature or scenario is run.
309
+
310
+ .. code-block:: python
311
+
312
+ # -- FILE: features/environment.py
313
+ # EXAMPLE 1: Exclude scenario from run-set at runtime.
314
+ import sys
315
+
316
+ def should_exclude_scenario(scenario):
317
+ # -- RUNTIME DECISION LOGIC: Will exclude
318
+ # * Scenario: Alice
319
+ # * Scenario: Alice in Wonderland
320
+ # * Scenario: Bob and Alice2
321
+ return "Alice" in scenario.name
322
+
323
+ def before_scenario(context, scenario):
324
+ if should_exclude_scenario(scenario):
325
+ scenario.skip() #< EXCLUDE FROM RUN-SET.
326
+ # -- OR WITH REASON:
327
+ # reason = "RUNTIME-EXCLUDED"
328
+ # scenario.skip(reason)
329
+
330
+ .. code-block:: python
331
+
332
+ # -- FILE: features/steps/my_steps.py
333
+ # EXAMPLE 2: Skip remaining steps in step implementation.
334
+ from behave import given
335
+
336
+ @given('the assumption "{assumption}" is met')
337
+ def step_check_assumption(context, assumption):
338
+ if not is_assumption_valid(assumption):
339
+ # -- SKIP: Remaining steps in current scenario.
340
+ context.scenario.skip("OOPS: Assumption not met")
341
+ return
342
+
343
+ # -- NORMAL CASE:
344
+ ...
345
+
346
+
347
+
348
+ .. index::
349
+ single: Stage
350
+ pair: Stage; Test Stage
351
+
352
+ Test Stages
353
+ -------------------------------------------------------------------------------
354
+
355
+ :Since: behave 1.2.5a1
356
+ :Intention: Use different Step Implementations for Each Stage
357
+
358
+ A test stage allows the user to provide different step and environment
359
+ implementation for each stage. Examples for test stages are:
360
+
361
+ * develop (example: development environment with simple database)
362
+ * product (example: use the real product and its database)
363
+ * systemint (system integration)
364
+ * ...
365
+
366
+ Each test stage may have a different test environment and needs to
367
+ fulfill different testing constraints.
368
+
369
+ EXAMPLE DIRECTORY LAYOUT (with ``stage=testlab`` and default stage)::
370
+
371
+ features/
372
+ +-- steps/ # -- Step implementations for default stage.
373
+ | +-- foo_steps.py
374
+ +-- testlab_steps/ # -- Step implementations for stage=testlab.
375
+ | +-- foo_steps.py
376
+ +-- environment.py # -- Environment for default stage.
377
+ +-- testlab_environment.py # -- Environment for stage=testlab.
378
+ +-- *.feature
379
+
380
+ To use the ``stage=testlab``, you run behave with::
381
+
382
+
383
+ behave --stage=testlab ...
384
+
385
+ or define the environment variable ``BEHAVE_STAGE=testlab``.
386
+
387
+
388
+ .. _userdata:
389
+ .. index::
390
+ single: userdata
391
+ pair: userdata; user-specific configuration data
392
+
393
+ Userdata
394
+ -------------------------------------------------------------------------------
395
+
396
+ :Since: behave 1.2.5a1
397
+ :Intention: User-specific Configuration Data
398
+
399
+ The userdata functionality allows a user to provide its own configuration data:
400
+
401
+ * as command-line option ``-D name=value`` or ``--define name=value``
402
+ * with the behave configuration file in section ``behave.userdata``
403
+ * load more configuration data in ``before_all()`` hook
404
+
405
+ .. code-block:: ini
406
+
407
+ # -- FILE: behave.ini
408
+ [behave.userdata]
409
+ browser = firefox
410
+ server = asterix
411
+
412
+ .. note::
413
+
414
+ Command-line definitions override userdata definitions in the
415
+ configuration file.
416
+
417
+ If the command-line contains no value part, like in ``-D NEEDS_CLEANUP``,
418
+ its value is ``"true"``.
419
+
420
+
421
+ The userdata settings can be accessed as dictionary in hooks and steps
422
+ by using the ``context.config.userdata`` dictionary.
423
+
424
+ .. code-block:: python
425
+
426
+ # -- FILE: features/environment.py
427
+ def before_all(context):
428
+ browser = context.config.userdata.get("browser", "chrome")
429
+ setup_browser(browser)
430
+
431
+ .. code-block:: python
432
+
433
+ # -- FILE: features/steps/userdata_example_steps.py
434
+ @given('I setup the system with the user-specified server"')
435
+ def step_setup_system_with_userdata_server(context):
436
+ server_host = context.config.userdata.get("server", "beatrix")
437
+ context.xxx_client = xxx_protocol.connect(server_host)
438
+
439
+ .. code-block:: sh
440
+
441
+ # -- ADAPT TEST-RUN: With user-specific data settings.
442
+ # SHELL:
443
+ behave -D server=obelix features/
444
+ behave --define server=obelix features/
445
+
446
+ Other examples for user-specific data are:
447
+
448
+ * Passing a URL to an external resource that should be used in the tests
449
+
450
+ * Turning off cleanup mechanisms implemented in environment hooks,
451
+ for debugging purposes.
452
+
453
+
454
+ Type Converters
455
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
456
+
457
+ The userdata object provides basic support for "type conversion on demand",
458
+ similar to the :mod:`configparser` module. The following type conversion
459
+ methods are provided:
460
+
461
+ * ``Userdata.getint(name, default=0)``
462
+ * ``Userdata.getfloat(name, default=0.0)``
463
+ * ``Userdata.getbool(name, default=False)``
464
+ * ``Userdata.getas(convert_func, name, default=None, ...)``
465
+
466
+ Type conversion may raise a ``ValueError`` exception if the conversion fails.
467
+
468
+ The following example shows how the type converter functions for integers are used:
469
+
470
+ .. code-block:: python
471
+
472
+ # -- FILE: features/environment.py
473
+ def before_all(context):
474
+ userdata = context.config.userdata
475
+ server_name = userdata.get("server", "beatrix")
476
+ int_number = userdata.getint("port", 80)
477
+ bool_answer = userdata.getbool("are_you_sure", True)
478
+ float_number = userdata.getfloat("temperature_threshold", 50.0)
479
+ ...
480
+
481
+ .. hidden:
482
+
483
+ * :py:meth:`behave.configuration.Userdata.getint()`
484
+ * :py:meth:`behave.configuration.Userdata.getfloat()`
485
+ * :py:meth:`behave.configuration.Userdata.getbool()`
486
+ * :py:meth:`behave.configuration.Userdata.getas()`
487
+
488
+
489
+ Advanced Cases
490
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
491
+
492
+ The last section described the basic use cases of userdata.
493
+ For more complicated cases, it is better to provide your own configuration setup
494
+ in the ``before_all()`` hook.
495
+
496
+ This section describes how to load a JSON configuration file and store its
497
+ data in the ``userdata`` dictionary.
498
+
499
+ .. code-block:: py
500
+
501
+ # -- FILE: features/environment.py
502
+ import json
503
+ import os.path
504
+
505
+ def before_all(context):
506
+ """Load and update userdata from JSON configuration file."""
507
+ userdata = context.config.userdata
508
+ configfile = userdata.get("configfile", "userconfig.json")
509
+ if os.path.exists(configfile):
510
+ assert configfile.endswith(".json")
511
+ more_userdata = json.load(open(configfile))
512
+ context.config.update_userdata(more_userdata)
513
+ # -- NOTE: Reapplies userdata_defines from command-line, too.
514
+
515
+
516
+ Provide the file "userconfig.json" with:
517
+
518
+ .. code-block:: json
519
+
520
+ {
521
+ "browser": "firefox",
522
+ "server": "asterix",
523
+ "count": 42,
524
+ "cleanup": true
525
+ }
526
+
527
+ Other advanced use cases:
528
+
529
+ * support configuration profiles via cmdline "... -D PROFILE=xxx ..."
530
+ (uses profile-specific configuration file or profile-specific config section)
531
+ * provide test stage specific configuration data
532
+
533
+
534
+ .. index::
535
+ single: Active Tags
536
+
537
+ Active Tags
538
+ -------------------------------------------------------------------------------
539
+
540
+ :Since: behave 1.2.5a1
541
+
542
+ **Active tags** are used when it is necessary to decide at runtime
543
+ which features or scenarios should run (and which should be skipped).
544
+ The runtime decision is based on which:
545
+
546
+ * platform the tests run (like: Windows, Linux, MACOSX, ...)
547
+ * runtime environment resources are available (by querying the "testbed")
548
+ * runtime environment resources should be used (via `userdata`_ or ...)
549
+
550
+ Therefore, for *active tags* it is decided at runtime if a tag is enabled or
551
+ disabled. The runtime decision logic excludes features/scenarios with disabled
552
+ active tags before they are run.
553
+
554
+ .. note::
555
+
556
+ The active tag mechanism is applied after the normal tag filtering
557
+ that is configured on the command-line.
558
+
559
+ The active tag mechanism uses the :class:`~behave.tag_matcher.ActiveTagMatcher`
560
+ for its core functionality.
561
+
562
+
563
+ .. index::
564
+ single: Active Tag Logic
565
+
566
+ Active Tag Logic
567
+ ~~~~~~~~~~~~~~~~~
568
+
569
+ * A (positive) active tag is enabled,
570
+ if its value matches the current value of its category.
571
+
572
+ * A negated active tag (starting with "not") is enabled,
573
+ if its value does not match the current value of its category.
574
+
575
+ * A sequence of active tags is enabled,
576
+ if all its active tags are enabled (logical-and operation).
577
+
578
+
579
+ .. index::
580
+ single: Active Tag Schema
581
+ pair: @active.with_{category}={value}; active tag schema (dialect 1)
582
+ pair: @not_active.with_{category}={value}; active tag schema (dialect 1)
583
+ pair: @use.with_{category}={value}; active tag schema (dialect 2)
584
+ pair: @not.with_{category}={value}; active tag schema (dialect 2)
585
+ pair: @only.with_{category}={value}; active tag schema (dialect 2)
586
+
587
+ Active Tag Schema
588
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
589
+
590
+ The following two tag schemas are supported for active tags (by default).
591
+
592
+ **Dialect 1:**
593
+
594
+ * @active.with_{category}={value}
595
+ * @not_active.with_{category}={value}
596
+
597
+ **Dialect 2:**
598
+
599
+ * @use.with_{category}={value}
600
+ * @not.with_{category}={value}
601
+ * @only.with_{category}={value}
602
+
603
+
604
+
605
+
606
+ Example 1
607
+ ~~~~~~~~~~
608
+
609
+ Assuming you have the feature file where:
610
+
611
+ * scenario "Alice" should only run when browser "Chrome" is used
612
+ * scenario "Bob" should only run when browser "Safari" is used
613
+
614
+ .. code-block:: gherkin
615
+
616
+ # -- FILE: features/alice.feature
617
+ Feature:
618
+
619
+ @use.with_browser=chrome
620
+ Scenario: Alice (Run only with Browser Chrome)
621
+ Given I do something
622
+ ...
623
+
624
+ @use.with_browser=safari
625
+ Scenario: Bob (Run only with Browser Safari)
626
+ Given I do something else
627
+ ...
628
+
629
+
630
+ .. code-block:: python
631
+
632
+ # -- FILE: features/environment.py
633
+ # EXAMPLE: ACTIVE TAGS, exclude scenario from run-set at runtime.
634
+ # NOTE: ActiveTagMatcher implements the runtime decision logic.
635
+ from behave.tag_matcher import ActiveTagMatcher
636
+ import os
637
+ import sys
638
+
639
+ active_tag_value_provider = {
640
+ "browser": "chrome"
641
+ }
642
+ active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)
643
+
644
+ def before_all(context):
645
+ # -- SETUP ACTIVE-TAG MATCHER VALUE(s):
646
+ active_tag_value_provider["browser"] = os.environ.get("BROWSER", "chrome")
647
+
648
+ def before_scenario(context, scenario):
649
+ # -- NOTE: scenario.effective_tags := scenario.tags + feature.tags
650
+ if active_tag_matcher.should_exclude_with(scenario.effective_tags):
651
+ # -- NOTE: Exclude any with @use.with_browser=<other_browser>
652
+ scenario.skip(reason="DISABLED ACTIVE-TAG")
653
+
654
+
655
+ .. note::
656
+
657
+ By using this mechanism, the ``@use.with_browser=*`` tags become
658
+ **active tags**. The runtime decision logic decides when these tags
659
+ are enabled or disabled (and uses them to exclude their scenario/feature).
660
+
661
+
662
+
663
+
664
+ Example 2
665
+ ~~~~~~~~~~
666
+
667
+ Assuming you have scenarios with the following runtime conditions:
668
+
669
+ * Run scenario Alice only on Windows OS
670
+ * Run scenario Bob only with browser Chrome
671
+
672
+ .. code-block:: gherkin
673
+
674
+ # -- FILE: features/alice.feature
675
+ # TAG SCHEMA: @use.with_{category}={value}, ...
676
+ Feature:
677
+
678
+ @use.with_os=win32
679
+ Scenario: Alice (Run only on Windows)
680
+ Given I do something
681
+ ...
682
+
683
+ @use.with_browser=chrome
684
+ Scenario: Bob (Run only with Web-Browser Chrome)
685
+ Given I do something else
686
+ ...
687
+
688
+
689
+ .. code-block:: python
690
+
691
+ # -- FILE: features/environment.py
692
+ from behave.tag_matcher import ActiveTagMatcher
693
+ import sys
694
+
695
+ # -- MATCHES ANY TAGS: @use.with_{category}={value}
696
+ # NOTE: active_tag_value_provider provides category values for active tags.
697
+ active_tag_value_provider = {
698
+ "browser": os.environ.get("BEHAVE_BROWSER", "chrome"),
699
+ "os": sys.platform,
700
+ }
701
+ active_tag_matcher = ActiveTagMatcher(active_tag_value_provider)
702
+
703
+ # -- BETTER USE: from behave.tag_matcher import setup_active_tag_values
704
+ def setup_active_tag_values(active_tag_values, data):
705
+ for category in active_tag_values.keys():
706
+ if category in data:
707
+ active_tag_values[category] = data[category]
708
+
709
+ def before_all(context):
710
+ # -- SETUP ACTIVE-TAG MATCHER (with userdata):
711
+ # USE: behave -D browser=safari ...
712
+ setup_active_tag_values(active_tag_value_provider, context.config.userdata)
713
+
714
+ def before_feature(context, feature):
715
+ if active_tag_matcher.should_exclude_with(feature.tags):
716
+ feature.skip(reason="DISABLED ACTIVE-TAG")
717
+
718
+ def before_scenario(context, scenario):
719
+ if active_tag_matcher.should_exclude_with(scenario.effective_tags):
720
+ scenario.skip("DISABLED ACTIVE-TAG")
721
+
722
+
723
+ By using the `userdata`_ mechanism, you can now define on command-line
724
+ which browser should be used when you run behave.
725
+
726
+ .. code-block:: sh
727
+
728
+ # -- SHELL: Run behave with browser=safari, ... by using userdata.
729
+ # TEST VARIANT 1: Run tests with browser=safari
730
+ behave -D browser=safari features/
731
+
732
+ # TEST VARIANT 2: Run tests with browser=chrome
733
+ behave -D browser=chrome features/
734
+
735
+
736
+ .. note::
737
+
738
+ Unknown categories, missing in the ``active_tag_value_provider`` are ignored.
739
+
740
+
741
+ User-defined Formatters
742
+ -------------------------------------------------------------------------------
743
+
744
+ :Since: behave 1.2.5a1
745
+
746
+ Behave formatters are a typical candidate for an extension point.
747
+ You often need another formatter that provides the desired output format for a
748
+ test-run.
749
+
750
+ Therefore, behave supports now formatters as extension point (or plugin).
751
+ It is now possible to use own, user-defined formatters in two ways:
752
+
753
+ * Use formatter class (as "scoped class name") as ``--format`` option value
754
+ * Register own formatters by name in behave's configuration file
755
+
756
+ .. note::
757
+
758
+ Scoped class name (schema):
759
+
760
+ * ``my.module:MyClass`` (preferred)
761
+ * ``my.module::MyClass`` (alternative; with double colon as separator)
762
+
763
+
764
+ User-defined Formatter on Command-line
765
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
766
+
767
+ Just use the formatter class (as "scoped class name") on the command-line
768
+ as value for the ``-format`` option (short option: ``-f``):
769
+
770
+ .. code-block:: sh
771
+
772
+ behave -f my.own_module:SimpleFormatter ...
773
+ behave -f behave.formatter.plain:PlainFormatter ...
774
+
775
+ .. code-block:: python
776
+
777
+ # -- FILE: my/own_module.py
778
+ # (or installed as Python module: my.own_module)
779
+ from behave.formatter.base import Formatter
780
+
781
+ class SimpleFormatter(Formatter):
782
+ description = "A very simple NULL formatter"
783
+
784
+
785
+ Register User-defined Formatter by Name
786
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
787
+
788
+ It is also possible to extend behave's built-in formatters
789
+ by registering one or more user-defined formatters by name in the
790
+ configuration file:
791
+
792
+ .. code-block:: ini
793
+
794
+ # -- FILE: behave.ini
795
+ [behave.formatters]
796
+ foo = behave_contrib.formatter.foo:FooFormatter
797
+ bar = behave_contrib.formatter.bar:BarFormatter
798
+
799
+ .. code-block:: python
800
+
801
+ # -- FILE: behave_contrib/formatter/foo.py
802
+ from behave.formatter.base import Formatter
803
+
804
+ class FooFormatter(Formatter):
805
+ description = "A FOO formatter"
806
+ ...
807
+
808
+ Now you can use the name for any registered, user-defined formatter:
809
+
810
+ .. code-block:: sh
811
+
812
+ # -- NOTE: Use FooFormatter that was registered by name "foo".
813
+ behave -f foo ...
814
+