2015-11-25 140 views
4

在Django應用程序的測試運行中使用pytest/pytest-django時,如何將數據保存到數據庫?如何使用pytest-django將測試數據保存到數據庫?

我運行pytest py.test --nomigrations --reuse-db -s和Postgres DB test_<configued_db_name>是按預期創建的,但是在測試之間似乎沒有任何東西會持久存在數據庫中,並且在測試運行結束時數據庫爲空。

import pytest 
from django.contrib.auth.models import User 


@pytest.mark.django_db(transaction=False) 
def test_insert_user(): 
    user = User.objects.create_user(username="test_user", email="[email protected]", password="test") 
    users = User.objects.all() 
    assert len(users) > 0 

@pytest.mark.django_db(transaction=False) 
def test_check_user(): 
    users = User.objects.all() 
    assert len(users) > 0 

第一個測試通過,二不使我想知道如果有什麼是持久化到數據庫的。根據pystest-django文檔@pytest.mark.django_db(transaction=False)不會回滾受到裝飾測試影響的任何內容。

謝謝

/大衛

+5

這是測試跑步者的工作原理。如果你想在幾次測試中使用相同的數據,你應該看看pytest文檔中的fixtures。 –

+1

您既可以使用燈具,也可以使用factory_boy之類的軟件在測試之間提供數據。 – jvc26

+0

謝謝。我結束了使用factory_boy和pytest的裝置。 –

回答

0

我已經解決了這個問題 - 預先填入DB的每一個功能 - 通過定義與範圍function夾具(即modelsession將無法​​正常工作)。

這裏是在Django中測試視圖的代碼。

# This is used to fill the database more easily 
from mixer.backend.django import mixer 

import pytest 

from django.test import RequestFactory 

from inventory import views 
from inventory import services 

pytestmark = pytest.mark.django_db 

@pytest.fixture(scope="function") 
def fill_db(): 
    """ Just filling the DB with my data """ 
    for elem in services.Search().get_lookup_data(): 
     mixer.blend('inventory.Enumeration', **elem) 

def test_grid_anonymous(fill_db): 
    request = RequestFactory().get('/grid/') 
    response = views.items_grid(request) 
    assert response.status_code == 200, \ 
     "Should be callable by anyone" 

def test_list_anonymous(fill_db): 
    request = RequestFactory().get('/') 
    response = views.items_list(request) 
    assert response.status_code == 200, \ 
     "Should be callable by anyone" 
2

與每個功能的數據預先填充數據庫的另一種方法是這樣的:

import pytest 

from django.contrib.auth.models import User 

@pytest.fixture(scope='module') 
def django_db_setup(django_db_setup, django_db_blocker): 
    print('setup') 
    with django_db_blocker.unblock(): 
     User.objects.create(username='a') 
     assert set(u.username for u in User.objects.all()) == {'a'} 

@pytest.mark.django_db 
def test1(): 
    print('test1') 
    User.objects.create(username='b') 
    assert set(u.username for u in User.objects.all()) == {'a', 'b'} 

@pytest.mark.django_db 
def test2(): 
    print('test2') 
    User.objects.create(username='c') 
    assert set(u.username for u in User.objects.all()) == {'a', 'c'} 

關於這種方法的好處是,設置功能只能調用一次:

plugins: django-3.1.2 
collected 2 items 

mytest.py setup 
test1 
.test2 
. 
=================== 2 passed in 1.38 seconds ==================== 

不好的一點是,1.38秒對於這樣一個簡單的測試來說有點太過分了。 --reuse-db是一個更快的方式來做到這一點。

+0

@dotz也許會很有趣。 –

相關問題