Django test VS pytest
Solution 1
My experience contradicts what you can see on the Internet.
I have a lot of experience with both Pytest and Unittest, and I've laid out my perspective on this issue in the article.
I hope this helps someone and would appreciate any feedback!
Solution 2
i've used Django test for my entire life and now i am using Py.test. I agree that pytest is much cleaner than django itself.
The benefit from pytest is fixture in another file. It makes my test case compact by let them be my input parameters.
In Django unittest you can still use fixtures in other file by using the attribute fixtures = ['appname/fixtures/my_fixture.json']
Pytest will show you the assertion output if the error occur. Django unittest does not. I have to put the breakpoint on my own and investigate the error.
Did you tried to change the --verbose
param on python manage.py tests
?
A few tips:
There is a package called
pytest-django
that will help you integrate and using django with pytest.-
I think that if you use classes will you not need to use the
factory = APIRequestFactory()
, the test methods itself they have a parameter calledclient
that is a interface to the pythonrequests
module to access your views.import pytest from model_mommy import mommy @pytest.fixture() def user(db): return mommy.make(User) class SiteAPIViewTestSuite: def test_create_view(self, client, user): assert Site.objects.count() == 0 post_data = { 'name': 'Stackoverflow' 'url': 'http://stackoverflow.com', 'user_id': user.id, } response = client.post( reverse('sites:create'), json.dumps(post_data), content_type='application/json', ) data = response.json() assert response.status_code == 201 assert Site.objects.count() == 1 assert data == { 'count': 1, 'next': None, 'previous': None 'results': [{ 'pk': 1, 'name': 'Stackoverflow', 'url': 'http://stackoverflow.com', 'user_id': user.id }] }
Related videos on Youtube
joe
PyTorch/Django lover and Flutter newbie. Dream to make my own cooking business
Updated on June 07, 2022Comments
-
joe almost 2 years
I am new to djangounittest
andpytest
. However, I started to feel thatpytest
test case is more compact and clearer.Here is my test cases:
class OrderEndpointTest(TestCase): def setUp(self): user = User.objects.create_superuser(username='admin', password='password', email='[email protected]') mommy.make(CarData, _quantity=1) mommy.make(UserProfile, _quantity=1, user=user) def test_get_order(self): mommy.make(Shop, _quantity=1) mommy.make(Staff, _quantity=1, shop=Shop.objects.first()) mommy.make(Order, _quantity=1, car_info={"color": "Black"}, customer={"name": "Lord Elcolie"}, staff=Staff.objects.first(), shop=Shop.objects.first()) factory = APIRequestFactory() user = User.objects.get(username='admin') view = OrderViewSet.as_view({'get': 'list'}) request = factory.get('/api/orders/') force_authenticate(request, user=user) response = view(request) assert 200 == response.status_code assert 1 == len(response.data.get('results'))
And here is the
pytest
versiondef test_get_order(car_data, admin_user, orders): factory = APIRequestFactory() user = User.objects.get(username='admin') view = OrderViewSet.as_view({'get': 'list'}) request = factory.get('/api/orders/') force_authenticate(request, user=user) response = view(request) assert 200 == response.status_code assert 1 == len(response.data.get('results'))
The benefit from
pytest
isfixture
in another file. It makes my test case compact by let them be my input parameters.Are they any benefit of using Django
unittest
thanpytest
?Update: 1July2017
Update: 5July2017
Update: 1Sep2017
Update: 29Sep2017
Update: 26Dec2017- Pytest reduces your problem when fixtures got mutated over the test.
I got
testcases
that run individually passed, but fail when run thoroughly. - Pytest will show you the assertion output if the error occur. Django unittest does not. I have to put the breakpoint on my own and investigate the error.
- Pytest allow you to use real database with simple decorator. Django test does not. You have to create your own customized command for your job
- Pytest is generic. Being an generic it means you feel comfortable to
work with project outside the Django. For example when you have to
build micro-service such as Flask + 3rd parties like APScheduler,
PyRad, ... etc. I mention this because my backend life uses Django 50%
The rest of the is
Python
and infra - Pytest is not using multiple inheritance to create my fixtures
- Unittest takes advantage on
gitlab-ci
over Pytest when used withDocker
as a runner by smoothly execute without any extra configurations. problem
-
spectras almost 7 yearsDjango tests do support fixtures. Just saying...
-
joe almost 7 years@spectras Hi. please correct if my information is outdated. I really want to know and choose right tools for right situation. Right now I do both of them base on project leader. If I lead I use
pytest
. The others useDjango test
I do follow it. Therefore I am start the question on here and discuss. -
joe almost 7 yearsI create fixtures in the method
setUp()
and reuse by inheritance. Are you talking on the same fixtures? -
spectras almost 7 yearsNo, I'm talking about Django fixtures
-
joe almost 7 yearsThank you for your reply. I have not use it because I can not use it with
mommy
-
joe over 6 yearsstackoverflow.com/questions/47904245/… I am unable to find
reset_transaction
inpytest
. After certain time I will put it here and it might change my mind! -
Vladimir Prudnikov over 4 yearsBy the way,
mommy.make
returns created instance. So this code is cleanershop = mommy.make(Shop, _quantity=1); mommy.make(Staff, _quantity=1, shop=shop)
- Pytest reduces your problem when fixtures got mutated over the test.
I got
-
joe about 6 years+1 Thank you for sharing your experience with me. I had tried
fixture.json
. It is not flexible.model_mommy
is fit for my need. For--verbose
this is my bad. I did't know about this. Your given example onclient
is clean! Let me try it with incoming project. -
Luan Fonseca about 6 yearsI also use
model_mommy
, its awesome and work fine. -
medihack almost 4 yearsInstead of fixtures I prefer factories with factory_boy. I also use those to generate some test data (faker built in) during development.
-
Oğuzhan over 2 yearsModel Mommy is no longer maintained and was replaced by Model Bakery.