рдФрд░ рдХреЛрдб рдХреЗ рдмрд╛рд╣рд░ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рдСрдЯреЛрдореЗрд╢рди рдФрд░ рдкрд╛рдпрдерди рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА рдЬреЛ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдереЗред рдФрд░ рдЕрдиреНрдп рдЯреАрдореЛрдВ рдкрд░ рднреА рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛ рдереА, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдПред
рдкреНрд░рддрд┐рдЧрдорди рдкрд░реАрдХреНрд╖рдг рдЕрдзрд┐рдХ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрджрдо рдерд╛ред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрддрд┐рдо рдХреИрдиреЛрдиреАрдХреГрдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╣реИред
python . .
:
- . , Python xml, json . ,
textwrap.dedent
. - . .
- . , . . .
, . testoot 3.4+.
. .
foo
. :
def foo():
return {'a': 1}
def test_simple(testoot: Testoot):
testoot.test(foo())
pytest
:
pytest -s tests
. . testoot Testoot .
:
def foo():
return {'a': 2}
def test_simple(testoot: Testoot):
testoot.test(foo())
AssertionError
:
...тАиdef test_simple(testoot: Testoot):
> testoot.test(foo()))
cls = <class 'testoot.ext.pytest.PytestComparator'>, test_obj = {'a': 2}, canon_obj = {'a': 1}
@classmethod
def compare(cls, test_obj: any, canon_obj: any):
"""Compares objects"""
> assert test_obj == canon_obj
E AssertionError
. - .
--canonize
.
pytest -s tests --canonize
, pytest ( --verbose ):
tests/test_console/test_console.py [tests/test_console/test_console.py::test_simple]
{'a': 2} == {'a': 1}
~Differing items:
~{'a': 2} != {'a': 1}
~Use -v to get the full diff
Canonize [yn]? y
.
. .
. :
- pickle. Python. VCS pickle
- bytes. , .
- str. utf-8 , .
- json . json, , .
, VCS .
. .
def test_filename(testoot: Testoot):
d = Path(testoot.storage.root_dir / 'hello.json')
d.write_text('{}')
testoot.test_filename(str(d))
Testoot. :
import pytest
from testoot.ext.pytest import PytestContext
from testoot.ext.simple import DefaultBaseTestoot
from testoot.pub import AskCanonizePolicy, PickleSerializer, \
LocalDirectoryStorage, ConsoleUserInteraction, Testoot
@pytest.fixture(scope='module')
def base_testoot():
regress = DefaultBaseTestoot(
storage=LocalDirectoryStorage('.testoot'),
)
regress.storage.ensure_exists()
yield regress
@pytest.fixture(scope='function')
def testoot(base_testoot, request):
fixture = Testoot(base_testoot, PytestContext(request))
yield fixture
DefaultBaseTestoot . Testoot (scope='function'). pytest request , .
DefaultBaseTestoot BaseTestoot -: .testoot pickle-, --canonize
.
-:
regress = DefaultBaseTestoot(
serializer=JsonSerializer(),
)
. pytest :
class PytestComparator(Comparator):
@classmethod
def compare(cls, test_obj: any, canon_obj: any):
"""Compares objects"""
assert test_obj == canon_obj
PytestContext(request, serializer=BinarySerializer(), comparator=PytestComparator())
. :
def test_str(testoot: Testoot):
result = 'abc'
regress.test(result, serializer=StringSerializer(), comparator=PytestComparator())
, BaseTestoot.
, . , .
рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд┐рдерд┐ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓рддреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддрд╛рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рди рдХрд░реЗрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдерд╛ред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреА!
рд╕реНрдерд╛рдкрдирд╛: pip3 install testoot
рдкреНрд░рд▓реЗрдЦрди: https://testoot.readthedocs.io
рд╕реНрд░реЛрдд рдХреЛрдб: https://github.com/aptakhin/testoot