Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django test VS pytest

Tags:


I am new to django unittest and pytest. However, I started to feel that pytest 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 version

def 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 is fixture in another file. It makes my test case compact by let them be my input parameters.

Are they any benefit of using Django unittest than pytest?

Update: 1July2017
Update: 5July2017
Update: 1Sep2017
Update: 29Sep2017
Update: 26Dec2017

  1. Pytest reduces your problem when fixtures got mutated over the test. I got testcases that run individually passed, but fail when run thoroughly.
  2. 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.
  3. 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
  4. 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
  5. Pytest is not using multiple inheritance to create my fixtures
  6. Unittest takes advantage on gitlab-ci over Pytest when used with Docker as a runner by smoothly execute without any extra configurations. problem
like image 914
joe Avatar asked Jun 15 '17 03:06

joe


People also ask

Does Django test use pytest?

pytest-django Documentation. pytest-django is a plugin for pytest that provides a set of useful tools for testing Django applications and projects.

Does Django use pytest or Unittest?

Django's unit tests use a Python standard library module: unittest . This module defines tests using a class-based approach.

Is Django used for testing?

Django provides a test framework with a small hierarchy of classes that build on the Python standard unittest library. Despite the name, this test framework is suitable for both unit and integration tests. The Django framework adds API methods and tools to help test web and Django-specific behavior.

Why pytest is the best?

The pytest framework makes it easy to write small, readable tests, and can scale to support complex functional testing for applications and libraries.


1 Answers

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!

like image 52
Slava Avatar answered Oct 21 '22 15:10

Slava