如何在Django中使用pytest?

大男孩1337

当我将pytest与Django一起使用时,不会创建test_ <db_name>。

最小可复制示例:

在Django专案中:

./manage.py startapp testing_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的数据库,

./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)

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

并在<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。相反,它只是通过了该测试。但我不确定为什么。这些摘要保存在哪里?

AzyCrw4282

我认为没有pytestdb事务输出到文件的功能。我还检查了文档,但似乎该功能不存在。

通常(和您的行为一样)仅输出测试是否通过。最后一行看起来像这样

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

测试控制台上还会报告失败的测试。以下是对任何类型的数据库保存的最接近的提及:

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

您可以从这里看到您也可以调查一下Django's test framework是否支持该功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Django中使用pytest?

来自分类Dev

如何在Pytest中使用灯具的替代参数?

来自分类Dev

如何在多个异常中使用pytest.raises?

来自分类Dev

如何在批量pytest执行中使用对象的__subclasses __()方法?

来自分类Dev

如何在pytest中使用monkeypatch或mock删除库?

来自分类Dev

如何在基类中使用@ pytest.mark?

来自分类Dev

如何在Django中使用MySQL视图?

来自分类常见问题

如何在模板中使用Django DeleteView

来自分类Dev

如何在Django表单中使用CSS?

来自分类Dev

如何在Django测试中使用AssertRaisesMessage()

来自分类Dev

如何在Django中使用FormView

来自分类Dev

如何在Django中使用Datepicker

来自分类Dev

如何在Django中使用Bootstrap主题?

来自分类Dev

如何在Django中使用Gulp Browsersync?

来自分类Dev

如何在Django中使用opencv?

来自分类Dev

如何在django中使用crud操作?

来自分类Dev

如何在Django中使用验证器

来自分类Dev

如何在Django中使用Graypy

来自分类Dev

如何在Django中使用TailwindCSS?

来自分类Dev

如何在模板中使用Django DeleteView

来自分类Dev

如何在Django模板中使用“ for”语句

来自分类Dev

如何在Django中使用关系

来自分类Dev

如何在Django模板中使用instaceof?

来自分类Dev

我如何在Django中使用分页

来自分类Dev

如何在Django中使用FormView

来自分类Dev

我如何在Django中使用聚合

来自分类Dev

如何在Django表单中使用CSS?

来自分类Dev

如何在Django中使用AJAX发布

来自分类Dev

如何在Django中使用pysqlcipher?