[英]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.