behave
behave is behaviour-driven development, Python style
Description
====== behave ====== .. |badge.latest_version| image:: https://img.shields.io/pypi/v/behave.svg :target: https://pypi.python.org/pypi/behave :alt: Latest Version .. |badge.license| image:: https://img.shields.io/pypi/l/behave.svg :target: https://pypi.python.org/pypi/behave/ :alt: License .. |badge.CI_status| image:: https://github.com/behave/behave/actions/workflows/test.yml/badge.svg :target: https://github.com/behave/behave/actions/workflows/test.yml :alt: CI Build Status .. |badge.docs_status| image:: https://readthedocs.org/projects/behave/badge/?version=latest :target: https://behave.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status .. |badge.discussions| image:: https://img.shields.io/badge/chat-github_discussions-darkgreen :target: https://github.com/behave/behave/discussions :alt: Discussions at https://github.com/behave/behave/discussions .. |badge.gitter| image:: https://badges.gitter.im/join_chat.svg :target: https://app.gitter.im/#/room/#behave_behave:gitter.im :alt: Chat at https://gitter.im/behave/behave .. |badge.gurubase| image:: https://img.shields.io/badge/Gurubase-Ask%20behave%20Guru-006BFF :target: https://gurubase.io/g/behave :alt: Ask behave Guru at https://gurubase.io/g/behave .. |logo| image:: https://raw.github.com/behave/behave/master/docs/_static/behave_logo1.png |badge.latest_version| |badge.license| |badge.CI_status| |badge.docs_status| |badge.discussions| |badge.gitter| |badge.gurubase| behave is behavior-driven development, Python style. |logo| Behavior-driven development (or BDD) is an agile software development technique that encourages collaboration between developers, QA and non-technical or business participants in a software project. *behave* uses tests written in a natural language style, backed up by Python code. First, `install *behave*.`_ Now make a directory called "features/". In that directory create a file called "example.feature" containing: .. code-block:: gherkin # -- FILE: features/example.feature Feature: Showing off behave Scenario: Run a simple test Given we have behave installed When we implement 5 tests Then behave will test them for us! Make a new directory called "features/steps/". In that directory create a file called "example_steps.py" containing: .. code-block:: python # -- FILE: features/steps/example_steps.py from behave import given, when, then, step @given('we have behave installed') def step_impl(context): pass @when('we implement {number:d} tests') def step_impl(context, number): # -- NOTE: number is converted into integer assert number > 1 or number == 0 context.tests_count = number @then('behave will test them for us!') def step_impl(context): assert context.failed is False assert context.tests_count >= 0 Run behave: .. code-block:: console $ behave Feature: Showing off behave # features/example.feature:2 Scenario: Run a simple test # features/example.feature:4 Given we have behave installed # features/steps/example_steps.py:4 When we implement 5 tests # features/steps/example_steps.py:8 Then behave will test them for us! # features/steps/example_steps.py:13 1 feature passed, 0 failed, 0 skipped 1 scenario passed, 0 failed, 0 skipped 3 steps passed, 0 failed, 0 skipped, 0 undefined Now, continue reading to learn how to get the most out of *behave*. To get started, we recommend the `tutorial`_ and then the `feature testing language`_ and `api`_ references. .. _`Install *behave*.`: https://behave.readthedocs.io/en/stable/install/ .. _`tutorial`: https://behave.readthedocs.io/en/stable/tutorial/ .. _`feature testing language`: https://behave.readthedocs.io/en/stable/gherkin/ .. _`api`: https://behave.readthedocs.io/en/stable/api/ More Information ------------------------------------------------------------------------------- * `behave documentation`_: `latest edition`_, `stable edition`_, `PDF`_ * `behave.example`_: Behave Examples and Tutorials (docs, executable examples). * `changelog`_ (latest changes) .. _behave documentation: https://behave.readthedocs.io/ .. _changelog: https://github.com/behave/behave/blob/main/CHANGES.rst .. _behave.example: https://github.com/behave/behave.example .. _`latest edition`: https://behave.readthedocs.io/en/latest/ .. _`stable edition`: https://behave.readthedocs.io/en/stable/ .. _PDF: https://behave.readthedocs.io/_/downloads/en/latest/pdf/
Release History
| Version | Changes | Urgency | Date |
|---|---|---|---|
| 1.3.3 | Imported from PyPI (1.3.3) | Low | 4/21/2026 |
| v1.3.3 | FIXED: * issue #1270: v1.3.2: Broke Python 2.7 support (submitted by: silent-observer) | Low | 9/4/2025 |
| v1.3.2 | CHANGED: * Recursive discovery and import in `steps` directory is now disabled by default. An expert user can enable this feature again (if he/she knows what he/she is doing). RELATED TO: #1210 -- Multiple, nested steps directories under steps directory. - REASON: Too many problems w/ Python packages using relative-imports in the `steps` directory. - BEST PRACTICE: Put a Python package or step-library on the Python search path, but not in the `steps` directory. DOCUMENTATION: | Low | 8/29/2025 |
| v1.3.1 | FIXED: * issue #1255: ImportError: cannot import name 'asynccontextmanager' not found in python 3.6 (submitted by: rzuckerm) * issue #1239: AmbiguousStep error on step import with "re" step-matcher (submitted by: VolodymyrDan00) DOCUMENTATION: * Appendix: Add section with description of "Runners" extension point. * Appendix: Add section with "Cucumber-Expressions". * pull #1256: docs: userdata (provided by: Therdel, fixes: #1234) * issue #1234: userdata_defines configuration file p | Low | 8/11/2025 |
| v1.3.0 | * Gherkin v6 support * Native support for `cucumber-expressions` as step matcher * Native support for `async-steps` * Support for `tag-expressions v2` * Distinguish in outcome between failures (`assert-failed`) and errors (`unexpected exceptions` at runtime) * Improved captured-output support * Improved logging support and log-to-file support * And many things more ... CHANGELOG: * [v1.3.0](https://github.com/behave/behave/blob/main/CHANGES.rst#version-130-2025-08-04) * [v1.2.7](ht | Low | 8/4/2025 |
| v1.2.7.dev8 | * FIX #1251: Installation with pip does not install dependencies | Low | 7/16/2025 |
| v1.2.7.dev7 | ENHANCEMENTS: * async-steps: Support async-step functions directly * async-steps: Add test from PR #1249 (provided by: jeteve) * ActiveTags: Add support to override an enabled active-tag * Feature: Improved capture support * issue #1246 ScenarioOutline: Placeholders in Examples.tags * Improve logging support, simplify logging to file (releated to; issue #948) * Support for Python 3.13 CHANGES: * In behave: Replace assert statements w/ require statements/calls * FIX: Spelling mist | Low | 7/15/2025 |
| v1.2.7.dev6 | * Status: Distinguish between failures and errors * Pending steps * Support for cucumber-expressions * Use StepNotImplementedError (was: NotImplementedError) * ADDED: steps.code formatter -- Shows steps with code-section. * ... ISSUES: * issue #1047: Step type is inherited for generic step if possible (submitted by: zettseb) * ... BACKWARD INCOMPATIBLE: * parser: No longer strips trailing colon from steps with text/table section. | Low | 9/24/2024 |
| v1.2.7.dev4 | behave: * CLEANUP: configuration -- tag_expression_protocol, show_bad_formats() * CLEANUP: configuration -- Refactor internals to make it more readable * REFACTOR: behave.matchers (StepMatcherFactory, ...) * NEW: behave.api.step_matchers * UPDATE: gherkin-languages.json / behave.i14n (language=be was added) * Use assertpy as assert-matcher (in some cases) * FIXED #1116: behave erroring in pretty format in pyproject.toml * FIXED #1120: Logging ignoring level set in setup_logging (submit | Low | 7/12/2023 |
| v1.2.7.dev3 | For details, see [CHANGES.rst](https://github.com/behave/behave/blob/main/CHANGES.rst#version-127-unreleased). | Low | 7/9/2023 |
