Skip to content

Statistics Guide

behave-model provides built-in statistics for any project, giving you instant insight into the size and composition of your feature suite.

Quick statistics

from behave_model import load_project

project = load_project("features/")
stats = project.statistics()

print(f"Features:     {stats['features']}")
print(f"Scenarios:    {stats['scenarios']}")
print(f"Steps:        {stats['steps']}")
print(f"Avg steps:    {stats['average_steps_per_scenario']:.1f}")
print(f"Tags:         {stats['tags']}")

Available metrics

Metric Type Description
features int Total number of features
scenarios int Total scenarios (including those in Rules)
scenario_outlines int Number of Scenario Outlines
rules int Number of Gherkin v6 Rules
steps int Total steps across all scenarios and backgrounds
average_steps_per_scenario float Mean steps per scenario
tags int Total unique tags in the project
total_tag_usages int Total tag occurrences (counting duplicates)
examples int Total example rows across all outlines

Detailed breakdown

stats = project.statistics()

# Overview
print("=== Project Overview ===")
print(f"  Features:          {stats['features']}")
print(f"  Rules:             {stats['rules']}")
print(f"  Scenarios:         {stats['scenarios']}")
print(f"  Scenario Outlines: {stats['scenario_outlines']}")
print(f"  Examples:          {stats['examples']}")
print(f"  Steps:             {stats['steps']}")
print(f"  Tags:              {stats['tags']}")
print(f"  Avg steps/scenario: {stats['average_steps_per_scenario']:.1f}")

Per-feature statistics

for feature in project.features:
    scenario_count = len(feature.scenarios)
    for rule in feature.rules:
        scenario_count += len(rule.scenarios)

    step_count = sum(len(s.steps) for s in feature.scenarios)
    for rule in feature.rules:
        step_count += sum(len(s.steps) for s in rule.scenarios)
        if rule.background:
            step_count += len(rule.background.steps)

    print(f"\n{feature.name}:")
    print(f"  Scenarios: {scenario_count}")
    print(f"  Steps:     {step_count}")
    print(f"  Rules:     {len(feature.rules)}")
    print(f"  Tags:      {len(feature.tags)}")

Tag distribution

from collections import Counter

tag_counts = Counter()
for tag in project.all_tags():
    tag_counts[tag.name] += 1

print("Tag distribution:")
for tag, count in tag_counts.most_common():
    bar = "█" * count
    print(f"  {tag:20s} {bar} ({count})")

Output:

Tag distribution:
  @smoke               ████ (4)
  @auth                ███ (3)
  @api                 ██ (2)
  @happy               █ (1)

Step keyword distribution

from collections import Counter

from behave_model import CountingVisitor

class KeywordStats(CountingVisitor):
    def __init__(self):
        super().__init__()
        self.keywords = Counter()

    def visit_step(self, step):
        self.keywords[step.keyword.strip()] += 1

stats = KeywordStats()
project.accept(stats)

print("Step keywords:")
for kw, count in stats.keywords.most_common():
    print(f"  {kw:10s} {count}")

Export statistics as JSON

import json
from behave_model import load_project

project = load_project("features/")
stats = project.statistics()

with open("stats.json", "w") as f:
    json.dump(stats, f, indent=2)

Next steps