Skip to main content
Wheel Status Python versions Latest Version License Documentation Updates https://img.shields.io/badge/code%20style-black-000000.svg

Morelia is a Python Behavior Driven Development (BDD) library.

BDD is an agile software development process that encourages collaboration between developers, QA and business participants.

Test scenarios written in natural language make BDD foundation. They are comprehensible for non-technical participants who wrote them and unambiguous for developers and QA.

Morelia makes it easy for developers to integrate BDD into their existing unittest frameworks. It is easy to run under nose, pytest, tox, trial or integrate with django, flask or any other python framework because no special code have to be written.

You as developer are in charge of how tests are organized. No need to fit into rigid rules forced by some other BDD frameworks.

Mascot:

http://www.naturfoto.cz/fotografie/ostatni/krajta-zelena-47784.jpg

Installation

pip install morelia

Quick usage guide

Write a feature description:

# calculator.feature

Feature: Addition
    In order to avoid silly mistakes
    As a math idiot
    I want to be told the sum of two numbers

Scenario: Add two numbers
    Given I have powered calculator on
    When I enter "50" into the calculator
    And I enter "70" into the calculator
    And I press add
    Then the result should be "120" on the screen

Create standard Python’s unittest and hook Morelia into it:

# test_acceptance.py

import unittest

from morelia import verify


class CalculatorTestCase(unittest.TestCase):

    def test_addition(self):
        """ Addition feature """
        verify('calculator.feature', self)

Run test with your favourite runner: unittest, nose, py.test, trial. You name it!

$ python -m unittest -v test_acceptance  # or
$ pytest test_acceptance.py  # or
$ nosetests -v test_acceptance.py  # or
$ trial test_acceptance.py  # or
$ # django/pyramid/flask/(place for your favourite test runner)

And you’ll see which steps are missing:

F
======================================================================
FAIL: test_addition (test_acceptance.CalculatorTestCase)
Addition feature.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "(..)test_acceptance.py", line 31, in test_addition
    verify(filename, self)
  File "(..)/morelia/__init__.py", line 120, in verify
    execute_script(feature, suite, scenario=scenario, config=conf)
  File "(..)/morelia/parser.py", line 59, in execute_script
    assert not_found == set(), message
AssertionError: Cannot match steps:

    def step_I_have_powered_calculator_on(self):
        r'I have powered calculator on'

        raise NotImplementedError('I have powered calculator on')

    def step_I_enter_number_into_the_calculator(self, number):
        r'I enter "([^"]+)" into the calculator'

        raise NotImplementedError('I enter "50" into the calculator')

    def step_I_enter_number_into_the_calculator(self, number):
        r'I enter "([^"]+)" into the calculator'

        raise NotImplementedError('I enter "70" into the calculator')

    def step_I_press_add(self):
        r'I press add'

        raise NotImplementedError('I press add')

    def step_the_result_should_be_number_on_the_screen(self, number):
        r'the result should be "([^"]+)" on the screen'

        raise NotImplementedError('the result should be "120" on the screen')

----------------------------------------------------------------------
Ran 1 test in 0.013s

FAILED (failures=1)

Now implement steps with standard TestCases that you are familiar:

# test_acceptance.py

import unittest

from morelia import verify


class CalculatorTestCase(unittest.TestCase):

    def test_addition(self):
        """ Addition feature """
        verify('calculator.feature', self)

    def step_I_have_powered_calculator_on(self):
        r'I have powered calculator on'
        self.stack = []

    def step_I_enter_a_number_into_the_calculator(self, number):
        r'I enter "(\d+)" into the calculator'  # match by regexp
        self.stack.append(int(number))

    def step_I_press_add(self):  # matched by method name
        self.result = sum(self.stack)

    def step_the_result_should_be_on_the_screen(self, number):
        r'the result should be "{number}" on the screen'  # match by format-like string
        self.assertEqual(int(number), self.result)

And run it again:

$ python -m unittest test_acceptance

Feature: Addition
    In order to avoid silly mistakes
    As a math idiot
    I want to be told the sum of two numbers
Scenario: Add two numbers
    Given I have powered calculator on                       # pass  0.000s
    When I enter "50" into the calculator                    # pass  0.000s
    And I enter "70" into the calculator                     # pass  0.000s
    And I press add                                          # pass  0.001s
    Then the result should be "120" on the screen            # pass  0.001s
.
----------------------------------------------------------------------
Ran 1 test in 0.028s

OK

Note that Morelia does not waste anyone’s time inventing a new testing back-end just to add a layer of literacy over our testage. Steps are miniature TestCases. Your onsite customer need never know, and your unit tests and customer tests can share their support methods. The same one test button can run all TDD and BDD tests.

Look at example directory for a little more enhanced example and read full documentation for more advanced topics.

Documentation

Full documentation is available at http://morelia.readthedocs.org/en/latest/index.html

Credits

This package was created with Cookiecutter and the kidosoft/cookiecutter-pypackage project template.

[ ~ Dependencies scanned by PyUp.io ~ ]

Metadata

Release files for morelia 0.10.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for morelia 0.10.1
File Size Uploaded
morelia-0.10.1.tar.gz 30.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for morelia 0.10.1
File Interpreter ABI Platform
morelia-0.10.1-py3-none-any.whl Python 3 none any Details

Total release size: 61.3 kB

Release files / morelia-0.10.1.tar.gz

Download URL morelia-0.10.1.tar.gz
Size 30.0 kB
Tags Source
SHA-256 checksum
How to use checksums
061ce1724e5cc1183be2030a4a160b99b7e04730161c93adebb0da9892664c54
BLAKE2b-256 checksum
How to use checksums
925debfab90d7f21065634708c5b43d15d556a86077724a9cac5c3d8b9e36cfd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.7

Release files / morelia-0.10.1-py3-none-any.whl

Download URL morelia-0.10.1-py3-none-any.whl
Size 31.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e806bfd845aebab84e4daaa9e2ba017a906c744c60b99b47864f33cbeeafba5e
BLAKE2b-256 checksum
How to use checksums
8b68eefc09fb24fcb4077238d58e13648ea3f48c7d5366e90f28d8c77e4a3f2d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.7

Release history Release notifications | RSS feed

This release

0.10.1 This release

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.0

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.6.5

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.1.6

1 release file

0.1.5

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page