ttoolly provides tests generation based on form and fields params. There are two main ways how to use it:
For example we have a functinality of creating a product with two attributes: name and count
Generate template for field "name" with type str and field "count" with type int:
tt_get_field_template name:str count:int
The result:
{'count': {'lt': [],
'lte': [],
'max_value': 9223372036854775807,
'min_value': -9223372036854775808,
'not_empty': False,
'only': None,
'required': False,
'step': 1,
'type': 'int',
'unique': False},
'name': {'max_length': None,
'min_length': 0,
'not_empty': False,
'null_allowed': True,
'only': None,
'required': False,
'str_format': None,
'type': 'str',
'unique': False}}
We can left only valuable attributes
form_data = {'fields':
{'count': {'max_value': 1000,
'min_value': 0,
'not_empty': True,
'required': True,
'type': 'int'},
'name': {'max_length': 500,
'not_empty': True,
'required': True,
'type': 'str'}}}
This example uses pytest
from ttoolly.adapters.pytest import Actions
from ttoolly.generator import TestCaseMeta
from ttoolly.testcases import CasesAdd
class TestPytest(Actions, metaclass=TestCaseMeta):
cases = [
CasesAdd,
]
form = Form(**form_data)
def send_add(self, params: dict):
<...>
def get_objects_count(self):
<...>
def get_objects_pks(self):
<...>
def get_all_form_errors(self, response):
<...>
def prepare_for_add(self, **kwargs):
<...>
These methods must be defined in the test class:
send_add
- should send data to the create object endpoint, return responseget_objects_count
- should return count of existing objectsget_objects_pks
- should return a list of identificators of existing objectsget_all_form_errors
- should parse and return errors from the responseprepare_for_add
- should contains any preparation actions, like remove old objects, authorize user, etc.
If create tests for a Django project, use from ttoolly.adapters.django import Actions
for Django TestCase or from ttoolly.adapters.django_pytest import Actions
for pytest, where most of these methods already defined.
Run tests as usual:
pytest tests.py
If you prefer more explicit result, you might want to use test code generation:
tt_generate_cases form_description.json
The output will contain code:
def test_add_all_filled_0_count_name(self):
kwargs = {}
fields = ('count', 'name')
self.prepare_for_add(**kwargs)
params = {'count': 588, 'name': 'TvGomekHwcTvGomekHwcTvGomekHwczsAjEvn'}
snapshot = self.take_snapshot()
response = self.send_add(params, **kwargs)
self.check_success_add(response, snapshot)
def test_add_without_not_required_0_name_count(self):
kwargs = {}
additional = {}
fields = ('name', 'count')
self.prepare_for_add(**kwargs)
params = {'count': 248, 'name': 'DGtbxEpStFDGtbxEpStFDGtbxEpStFDGtbxEpStF'}
snapshot = self.take_snapshot()
response = self.send_add(params, **kwargs)
self.check_success_add(response, snapshot)
Note that in this case tests contain hardcoded input data for form.
More human readable output also available with parameter --humanable
:
NAME: All possible fields are filled
DETAILS: Send create request with filled fields:
* count
* name
RESULT: Object should be created successfully
NAME: Non required fields are not filled
DETAILS: Send create request with
# fields filled with any correct data:
* count
* name
RESULT: Object should be created successfully