Integrations¶
grappa is library/framework agnostic, so you can use it with your preferred
testing framework, such as nose, pytest, behave…
This page provides some useful information and configuration tips
for a better and more friendly integration between grappa and
testing framework.
pytest¶
Friendly error traceback¶
pytest, by default, provides a custom error reporting based on the traceback
analysis, pretty much as grappa does, but unfortunately in a less friendly way
for the developer.
You can partially or completely disable this in pytest behavior in order to have
more friendly errors generated by grappa.
In order to do that you should simply pass the following flag to:
$ pytest --tb=native
Or alternatively, you can simply partially disable it:
$ pytest --tb=short
The difference would be from this:
________________ test_expect_context_manager ________________
tests/should_test.py:277: in test_expect_context_manager
should('foo').be.equal('bar')
grappa/assertion.py:16: in __call__
return self._fn(expected, *args, **kw)
grappa/resolver.py:60: in wrapper
return self.test._trigger()
grappa/test.py:145: in _trigger
raise err
E AssertionError: Oops! Something went wrong!
E
E The following assertion was not satisfied
E subject "foo" should be equal "bar"
E
E What we expected
E a value that is equal to "foo"
E
E What we got instead
E an value of type "str" with data "foo"
E
E Where
E File "tests/should_test.py", line 277, in test_expect_context_manager
E
E 269| with pytest.raises(AssertionError):
E 270| 10 | should.not_be.between.to(5, 10)
E 271|
E 272| with pytest.raises(AssertionError):
E 273| None | should.be.between.numbers(10, 10)
E 274|
E 275|
E 276| def test_expect_context_manager():
E 277| > should('foo').be.equal('bar')
E 278|
E 279| with should('foo'):
E 280| should.be.equal('foo')
E 281| should.have.length.of(3)
E 282| should.have.type('string')
E 283|
E 284| with should('foo'):
Into this:
Traceback (most recent call last):
File "tests/should_test.py", line 277, in test_expect_context_manager
should('foo').be.equal('bar')
File "grappa/assertion.py", line 16, in __call__
return self._fn(expected, *args, **kw)
File "grappa/resolver.py", line 60, in wrapper
return self.test._trigger()
File "grappa/test.py", line 145, in _trigger
raise err
AssertionError: Oops! Something went wrong!
The following assertion was not satisfied
subject "foo" should be equal "bar"
What we expected
a value that is equal to "foo"
What we got instead
an value of type "str" with data "foo"
Where
File "tests/should_test.py", line 277, in test_expect_context_manager
269| with pytest.raises(AssertionError):
270| 10 | should.not_be.between.to(5, 10)
271|
272| with pytest.raises(AssertionError):
273| None | should.be.between.numbers(10, 10)
274|
275|
276| def test_expect_context_manager():
277| > should('foo').be.equal('bar')
278|
279| with should('foo'):
280| should.be.equal('foo')
281| should.have.length.of(3)
282| should.have.type('string')
283|
284| with should('foo'):
Dependency injection using fixtures¶
In order to minimize boilerplate across tests, you can create a pytest fixture
that would be automatically injected via across test functions/methods in your test suites:
First, create a conftest.py file in the directory where your test files lives with the following content:
# tests/conftest.py
import pytest
from grappa import should as _should, expect as _expect
@pytest.fixture
def should():
return _should
@pytest.fixture
def expect():
return _expect
Then, from a test file module, you can simply declare a test function that accepts a fixture argument, such as:
# tests/sample_test.py
def test_should_fixture(should):
'foo' | should.have.length.of(3) | should.be.equal.to('foo')
def test_expect_fixture(expect):
'foo' | expect.to.have.length.of(3) | expect.to.be.equal.to('foo')