-
1- make tests folder
-
2- install pytest -> pip install pytest-django
-
3- make pytest.ini file and add:
- [pytest]
- DJANGO_SETTINGS_MODULE = test.settings
- python_files = tests.py test_*.py *_tests.py
-
4- write your tests
-
5- for running:
- pytest -> run all tests
- pytest a_directory -> directory
- pytest test_something.py -> tests file
- pytest test_something.py::single_test -> single test function
- prepare any state you need to perform the action you want to try.
- trying to prepare and ready test to perform the action at the second stage the act.
- does the test require any objects? or sepecially settings?
- does it need any DB at all to run the test?
- do we need to login in any web, app?
- do we need to connect to any API?
- we're performing an action.
- this could calling a functional method or maybe calling a REST-API or inteacting with a web page.
- typically this step should listen to some sort of response
- this step should have some sort of response
- hhtp response or data which return from an API
- assert expected outcomes
- take the response from the act step and test it agenst the expected outcome of performing the action
- if we were mean to return some data from act step then the assert is going to test to see if that data was indeed returned.
- if we do assert the action or the act and we have return the expected outcome then return True.
- are functions
- run before/after each test function to which the fixture is applied.
- we use fixtures to collect data from DB or for prepare a DB connection so then we can perform a function in the act to return response and then we can assert the response to check to see if we return an expected outcome.
- fixtures are used to feed data to the tests such as DB connections, URLs to test and input data.
If the project is in a large scale, it becomes hard to manage tests with fixtures. In this case it is better to use factory boy.
- fixture replacement tool
- factories are define in a clean and readable manner.
- easy to use factories for complex objects.
- class-based approach
- SubFactories
- ForeignKey, reverse ForeignKey, ManyToMany
- install packages:
- pip install pytest-factoryboy
- pip install Fake
- for more information about Fake check this repository: https://github.com/septa-ma/Django-Generate-Fake-Data.git
- build classes -> connect the class in factories to a model.
- register the factory
Factory boy can provide us to built-in strategies.
- If we want factories to produce an object, use build.
- EX: user_factory.build()
- But if we want to save data to our test db, here we use create.
- need db access -> @pytest.mark.django_db
- EX: user_factory.create()
pytest parametrization allows us to define multiple sets of arguments and fixtures and test functional class