Python 如何将pytest与Django一起使用?

Python 如何将pytest与Django一起使用?,python,django,pytest,Python,Django,Pytest,在Django中使用pytest时,不会创建任何测试 最小可复制示例: 在Django项目中: ./manage.py startapp测试\u pytest 在models.py中 class Snippet(models.Model): created = models.DateTimeField(auto_now_add=True) title = models.CharField(max_length=100, blank=True, default='') c

在Django中使用pytest时,不会创建任何测试

最小可复制示例:

在Django项目中:

./manage.py startapp测试\u pytest

在models.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的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
in 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)
在tests.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)
和在/settings.py中

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'loc_db',
        'USER': '<some name>',
        'PASSWORD': '<some pass>',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
数据库={
“默认值”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
“名称”:“loc_db”,
“用户”:“,
“密码”:“,
'主机':'本地主机',
“端口”:“5432”,
}
}
在pytest.ini中

[pytest]
DJANGO_SETTINGS_MODULE = <project_dir>.settings
python_files = tests.py test_*.py *_tests.py
[pytest]
DJANGO_设置_模块=.SETTINGS
python_files=tests.py test.*.py*.\u tests.py

我希望在执行这些测试时运行pytest可以创建test_loc_db,然后通过批量创建来保存代码段数组。但是,没有创建测试数据库。相反,它只是通过了测试。但我不知道为什么。这些代码片段保存在哪里?

我认为
pytest
没有这样一个功能,db事务被输出到一个文件中。我还检查了文档,但似乎不存在该功能

它通常(和您的行为一样)只输出测试是否通过。最后一行是这样的

============================== <N Tests> passed in 0.27s ==============================
==========================================================以0.27秒的速度传递==============================
失败的测试也会在测试控制台上报告。下面最贴切地提到了任何类型的数据库保存

此数据将可用于标有pytest.mark.django_db()标记的测试,或使用db fixture的测试。测试数据将保存在数据库中,不会重置


你可以从照片上看到这一点。您还可以查看Django的测试框架,看看它是否受支持。

我不明白。问题是pytest是否会像Django测试框架那样创建该测试数据库并将记录保存到其中。这就是您所说的pytest缺少的功能吗?这是否证实了只有Django的测试模块才能进行数据库测试,而不是pytest?@BigBoy1337是的,这是正确的。我认为pytest不支持它。