for "Behavior Driven Development" (BDD) -- a client-facing scripting language to put the squeeze on all your features
Project description
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:
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 run
class CalculatorTestCase(unittest.TestCase):
def test_addition(self):
""" Addition feature """
run('calculator.feature', self, verbose=True)
Run test with your favourite runner: unittest, nose, py.test, trial. You name it!
$ python -m unittest -v test_acceptance # or
$ nosetests -v test_acceptance.py # or
$ py.test -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 45, in test_addition
run('calculator.feature', self, verbose=True)
File "(..)/morelia/__init__.py", line 22, in run
return ast.evaluate(suite, **kwargs)
File "(..)/morelia/grammar.py", line 31, in evaluate
feature.evaluate_steps(matcher_visitor)
File "(..)/morelia/grammar.py", line 76, in evaluate_steps
self._method_hook(visitor, class_name, 'after_')
File "(..)/morelia/grammar.py", line 85, in _method_hook
method(self)
File "(..)/morelia/visitors.py", line 125, in after_feature
self._suite.fail(to_docstring(diagnostic))
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 "20" 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 "140" on the screen')
----------------------------------------------------------------------
Ran 1 test in 0.029s
Now implement steps with standard TestCases that you are familiar:
# test_acceptance.py
import unittest
from morelia import run
class CalculatorTestCase(unittest.TestCase):
def test_addition(self):
""" Addition feature """
run('calculator.feature', self, verbose=True)
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
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
File details
Details for the file Morelia-0.6.5.tar.gz
.
File metadata
- Download URL: Morelia-0.6.5.tar.gz
- Upload date:
- Size: 44.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6ad1be866fe3294c968af0ff04ca944f584fff1dec156cf2defd5437c704289e |
|
MD5 | dc97bc838e48c0197733db446f4cf60a |
|
BLAKE2b-256 | f32bc1cff7724ad246430cd87a994d458fe9800da834172f869eff5986fa5e33 |
File details
Details for the file Morelia-0.6.5-py2.py3-none-any.whl
.
File metadata
- Download URL: Morelia-0.6.5-py2.py3-none-any.whl
- Upload date:
- Size: 51.9 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 472bd65331ab96400386c858f65583a6f26a4338757c02c14db3c0e24fe01e9b |
|
MD5 | 6e7efde4ad78c27e082cc56993039613 |
|
BLAKE2b-256 | e5c7079b5765514cb9993b65f7cead4865c3a4eba81bf62dbd43cb273e41e3d5 |