簡體   English   中英

如何將 pytest 與 Django 一起使用?

[英]How to use pytest with Django?

當我將 pytest 與 Django 一起使用時,沒有創建 test_<db_name>。

最小可重現示例:

在 Django 項目中:

./manage.py startapp testing_pytest

在模型.py

class Snippet(models.Model):

    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    external_id = models.CharField(max_length=100, default='0')

    class Meta:
        ordering = ['created']

然后在 Postgres 中創建一個名為 loc_db 的數據庫,

./manage.py makemigrations
./manage.py migrate 

在 serializers.py 中

class BulkUpdateOrCreateListSerializer(serializers.ListSerializer):
    def create(self, validated_data):
        result = [self.child.create(attrs) for attrs in validated_data]
        try:
            res = self.child.Meta.model.objects.bulk_create(result)
        except IntegrityError as e:
            raise ValidationError(e)
        return res

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ['id','title', 'code', 'linenos']
        read_only_fields = ['id']
        list_serializer_class = BulkUpdateOrCreateListSerializer

    def create(self, validated_data):
        instance = Snippet(**validated_data)
        if isinstance(self._kwargs["data"], dict):
            instance.save()
        return instance

在views.py中

class SnippetGetView(generics.ListAPIView):
    serializer_class = SnippetSerializer
    queryset = Snippet.objects.all()

class SnippetUpdateView(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def get_serializer(self, *args, **kwargs):
        if isinstance(kwargs.get("data", {}), list):
            kwargs["many"] = True
        return super(SnippetUpdateView, self).get_serializer(*args, **kwargs)

在測試.py

@pytest.fixture(scope='session',autouse=True)
def my_faker():
    return Faker()

@pytest.fixture(scope='session',autouse=True)
def factory():
    return APIRequestFactory()

@pytest.fixture(scope='session',autouse=True)
def snippets():
    snippets = []
    for i in range(TEST_SIZE):
        snippets.append({'title':'snippet'+str(i),'code':'print(True)','linenos':False,'external_id':'1'})
    return snippets

@pytest.mark.django_db
def test_update_snippet(factory,snippets):
    request = factory.post('/add-snippets/',snippets)
    view = SnippetUpdateView.as_view()
    response = view(request)
    response.render()
    assert status.is_success(response.status_code)

並在 <project_name>/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'loc_db',
        'USER': '<some name>',
        'PASSWORD': '<some pass>',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

並在 pytest.ini

[pytest]
DJANGO_SETTINGS_MODULE = <project_dir>.settings
python_files = tests.py test_*.py *_tests.py

我希望在執行這些測試時運行 pytest 會創建 test_loc_db 然后保存該片段數組以進行批量創建。 但是沒有創建 test_db。 相反,它只是通過了該測試。 但我不確定為什么。 這些片段保存在哪里?

我不認為pytest有這樣的功能,將數據庫事務輸出到文件。 我還檢查了文檔,似乎不存在該功能。

它通常(和你的行為一樣)只是輸出測試是否通過。 最后一行看起來像這樣

============================== <N Tests> passed in 0.27s ==============================

失敗的測試也會在測試控制台上報告。 最接近任何類型的數據庫保存的提及如下

此數據將可用於標有 pytest.mark.django_db() 標記的測試,或使用 db 夾具的測試。 測試數據將保存在數據庫中,不會被重置。

你可以從這里看到。 您還可以查看Django's test framework以查看它是否受支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM