Librería de steps reusable para behave con soporte multitecnología e i18n.
Project description
behave-steplib
Reusable step libraries for Behave BDD — share, discover and install step definitions across projects. Zero mandatory dependencies; each technology is an optional extra.
Why behave-steplib?
Writing BDD step definitions for HTTP APIs, web browsers, databases and Kafka is repetitive. Every project re-implements the same "send a request", "check the status code", "query the database" steps. behave-steplib provides a curated, typed, multilingual library of reusable steps that you install once and share across projects.
- Modular —
api,web,db,kafkamodules activated via extras and lazy imports. Install only what you need. - Auto-registered —
autoload(context)discovers every installed step via Python entry points and registers it with behave in one line. - Multilingual — steps defined in English with
esandpttranslations; all patterns are registered with behave so matching works regardless of the language used in feature files. - Typed — full type hints,
mypy --strictclean,py.typedmarker included. - CLI —
steplib list / show / validate / initpowered by Typer for inspecting and validating your step library from the terminal. - Pluggable — third-party packages can register steps via the
steplib.pluginsentry point group;autoloaddiscovers them automatically. - Ecosystem — integrates with
behave-kit(soft assertions),behave-tables(table conversion) andbehave-data(test data loading) when installed. - Backends — each module supports multiple backends (e.g. stdlib/httpx/requests for API, selenium for web) selectable at autoload time.
Installation
pip install behave-steplib # core only (behave, parse, typer)
pip install behave-steplib[api] # + httpx HTTP client
pip install "behave-steplib[api,web,db,kafka]" # + all technology extras
pip install "behave-steplib[all]" # + every technology extra
pip install behave-steplib[dev] # + pytest, ruff, mypy, build, twine
| Extra | Packages | Description |
|---|---|---|
[api] |
httpx |
HTTP API testing with httpx |
[web] |
selenium |
Browser testing with Selenium |
[db] |
sqlalchemy |
Database testing with SQLAlchemy |
[kafka] |
kafka-python-ng |
Kafka producer/consumer testing |
[kit] |
behave-kit |
Soft assertions, typed context, fixtures |
[data] |
behave-data |
Test data loading (CSV, JSON, YAML, Excel) |
[tables] |
behave-tables |
Table conversion helpers |
[dev] |
pytest, ruff, mypy, build, twine | Development tools |
[docs] |
sphinx, furo, myst-parser | Documentation tools |
[all] |
api, web, db, kafka, kit, data, tables | Everything except dev/docs |
Quickstart
Level 1 — Automatic wiring
Add three hooks to your environment.py and every installed step is wired automatically:
# features/environment.py
from steplib.behave import autoload
def before_all(context):
context.steplib = autoload(context)
def before_scenario(context, scenario):
context.steplib.reset()
def after_scenario(context, scenario):
context.steplib.cleanup()
Or generate it with the CLI:
steplib init
Level 2 — Explicit load
Load only the modules you need by dotted path:
from steplib.behave import load
def before_all(context):
context.steplib = load(context, "steplib.modules.api.steps")
Level 3 — Filtered autoload
When multiple extras are installed, narrow which steps are active:
from steplib.behave import autoload
def before_all(context):
context.steplib = autoload(
context,
categories=["api"],
backends={"api": "httpx"},
)
Example feature
Feature: API health check
Scenario: GET users returns 200
Given the API base url is "https://api.example.com"
When I send a GET request to "/users"
Then the response status is 200
And the response body is valid JSON
And the JSON path "$.users[0].name" equals "Ada"
Multilingual features
Steps are defined in English and translated to Spanish and Portuguese. All patterns are registered with behave — no language switch needed:
# es
Cuando envío una petición GET a "/users"
Entonces el estado de la respuesta es 200
# pt
Quando envio uma requisição GET para "/users"
Então o status da resposta é 200
Modules
API
HTTP API testing with stdlib (urllib), httpx or requests backends.
Given the API base url is "https://api.example.com"
When I send a GET request to "/users"
Then the response status is 200
And the JSON path "$.users[0].name" equals "Ada"
And the response header "Content-Type" is "application/json"
Web
Browser testing with Selenium (Chrome, Firefox, headless).
Given the web base url is "https://example.com"
When I navigate to "/login"
Then the page title is "Login"
And the element id "username" is present
And the page contains "Sign In"
DB
Database testing with SQLAlchemy (SQLite, PostgreSQL, MySQL, ...).
Given the database connection string is "sqlite:///test.db"
When I execute the SQL query "SELECT * FROM users"
Then the query returns 3 rows
And the column "name" in the first row equals "Ada"
Kafka
Kafka producer and consumer testing with kafka-python-ng.
Given the Kafka bootstrap servers are "localhost:9092"
When I produce a message to topic "events" with key "id" and value "hello"
And I consume messages from topic "events"
Then the consumed messages count is 1
And a consumed message contains "hello"
CLI
steplib list # list all registered steps
steplib list --category api # filter by category
steplib list --backend httpx # filter by backend
steplib list --json # output as JSON
steplib show "I send a {method} request to {url}"
steplib validate # validate step contracts
steplib init # generate features/environment.py
Writing custom steps
Use the @step decorator to define your own steps with full metadata:
from steplib import Param, step
@step(
"the invoice total is {total:f}",
category="invoice",
description="Assert the invoice total matches.",
parameters=[Param("total", type=float, required=True)],
example='Then the invoice total is 19.99',
i18n={
"es": "el total de la factura es {total:f}",
"pt": "o total da fatura é {total:f}",
},
tags=["invoice"],
version="1.0.0",
)
def step_invoice_total(context, total):
assert context.invoice.total == total
Register steps in a register(registry) function and declare an entry point:
# pyproject.toml
[project.entry-points."steplib.plugins"]
mycompany = "mycompany.steps:register"
Once installed, autoload(context) discovers your package automatically.
Development
make dev # install with api, dev and docs extras
make lint # ruff + mypy --strict
make test-cov # pytest with >=80% coverage gate
make docs-build # build Sphinx documentation
make build # build sdist + wheel
Documentation
Full documentation is available at https://mathiaspaulenko.github.io/behave-steplib.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file behave_steplib-1.0.1.dev0.tar.gz.
File metadata
- Download URL: behave_steplib-1.0.1.dev0.tar.gz
- Upload date:
- Size: 56.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bca165f5fea60a54cb72a2ee8a57676a6bb1f1ee1217ab9c33629e3d23de1192
|
|
| MD5 |
4df1aa20f20d724df8558e2637288e8a
|
|
| BLAKE2b-256 |
becbe9488faa0f3cd67dc8a8eedef6376960c2a83677e68cf98e2fe4da00429f
|
Provenance
The following attestation bundles were made for behave_steplib-1.0.1.dev0.tar.gz:
Publisher:
release.yml on MathiasPaulenko/behave-steplib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
behave_steplib-1.0.1.dev0.tar.gz -
Subject digest:
bca165f5fea60a54cb72a2ee8a57676a6bb1f1ee1217ab9c33629e3d23de1192 - Sigstore transparency entry: 2257698807
- Sigstore integration time:
-
Permalink:
MathiasPaulenko/behave-steplib@4034ddf984cf8523e75c9d710ebfdad55357dfa5 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/MathiasPaulenko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4034ddf984cf8523e75c9d710ebfdad55357dfa5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file behave_steplib-1.0.1.dev0-py3-none-any.whl.
File metadata
- Download URL: behave_steplib-1.0.1.dev0-py3-none-any.whl
- Upload date:
- Size: 43.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
676eb4095bf85698c3f9ed27f74c8b0503f91bacb59240faf70770a09c90f8bf
|
|
| MD5 |
fd39a802484301c93fd6617d1ee6f5f2
|
|
| BLAKE2b-256 |
6b2589931fa1e3675ff322b8dfbe116d21da226e449c5951a785a0dec665c507
|
Provenance
The following attestation bundles were made for behave_steplib-1.0.1.dev0-py3-none-any.whl:
Publisher:
release.yml on MathiasPaulenko/behave-steplib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
behave_steplib-1.0.1.dev0-py3-none-any.whl -
Subject digest:
676eb4095bf85698c3f9ed27f74c8b0503f91bacb59240faf70770a09c90f8bf - Sigstore transparency entry: 2257699052
- Sigstore integration time:
-
Permalink:
MathiasPaulenko/behave-steplib@4034ddf984cf8523e75c9d710ebfdad55357dfa5 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/MathiasPaulenko
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4034ddf984cf8523e75c9d710ebfdad55357dfa5 -
Trigger Event:
push
-
Statement type: