web-dev-qa-db-ja.com

DjangoテストVSpytest


私はDjango unittestpytestは初めてです。しかし、pytestテストケースの方が多いと感じ始めました。コンパクトでクリア。

これが私のテストケースです:

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'))

そしてこれがpytestバージョンです

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'))

pytestの利点は、別のファイルのfixtureです。テストケースを入力パラメータにすることで、テストケースをコンパクトにします。

unittestよりもDjango pytestを使用する利点はありますか?

更新:1July2017
更新:2017年7月5日
更新:1Sep2017
更新:2017年9月29日
更新:2017年12月26日

  1. Pytestは、フィクスチャがテスト中に変更された場合の問題を軽減します。個別に実行されるtestcasesを取得しましたが、完全に実行すると失敗します。
  2. エラーが発生した場合、Pytestはアサーション出力を表示します。 Django unittestはしません。自分でブレークポイントを設定し、エラーを調査する必要があります。
  3. Pytestを使用すると、単純なデコレータで実際のデータベースを使用できます。 Djangoテストはしません。あなたはあなたの仕事のためにあなた自身のカスタマイズされたコマンドを作成しなければなりません
  4. Pytestはジェネリックです。ジェネリックであるということは、Djangoの外部のプロジェクトで快適に作業できることを意味します。たとえば、Flask + APScheduler、PyRadなどのサードパーティなどのマイクロサービスを構築する必要がある場合。私のバックエンドライフではDjango 50%残りはPythonと以下です
  5. Pytestは、フィクスチャの作成に多重継承を使用していません
  6. Unittestは、Dockerをランナーとして使用すると、追加の構成なしでスムーズに実行できるため、Pytestよりもgitlab-ciを利用できます。 問題
13
Sarit

私は生涯Djangoテストを使用してきましたが、現在はPy.testを使用しています。 pytestはDjango自体よりもはるかにクリーンであることに同意します。

Pytestの利点は、別のファイルに固定することです。テストケースを入力パラメータにすることで、テストケースをコンパクトにします。

Django unittestでは、属性_fixtures = ['appname/fixtures/my_fixture.json']_を使用して、他のファイルのフィクスチャを引き続き使用できます。

エラーが発生した場合、Pytestはアサーション出力を表示します。 Djangounittestはしません。自分でブレークポイントを設定して、エラーを調査する必要があります。

_--verbose_の_python manage.py tests_パラメータを変更しようとしましたか?

いくつかのヒント:

  1. Djangoをpytestと統合して使用するのに役立つ_pytest-Django_というパッケージがあります。

  2. クラスを使用する場合、factory = APIRequestFactory()を使用する必要はないと思います。テストメソッド自体には、pythonへのインターフェイスであるclientというパラメータがあります。ビューにアクセスするためのrequestsモジュール。

    _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
                }]
            }
    _
1
Luan Fonseca