2017-08-22 76 views
0

我想知道在Django中测试时是否可以访问存储在数据库中的当前模型。在测试时访问Django模型

谢谢!

+0

您是指当前模型的值?你为什么想这样做? –

+0

您可以从应用程序对象中获取模型。 –

+0

我该怎么做?我如何启动应用程序对象?我想检查一下我的测试中有多少行在我的已填充表中,因为我解析了一个csv来填充数据库。这就是为什么我访问 – ddomingo

回答

0

您可以使用IPDB:

pip install ipdb 

然后在测试功能放在一个破发点:

import ipdb; ipdb.set_trace() 

运行测试时,你可以访问所有你会有一个交互的shell值与您在代码中使用的方式相同Model.object.....

+0

只使用'./manage.py shell'有什么区别? – Risadinha

+0

当您使用“manage.py test”测试您的代码时Django创建测试数据库并在测试结束时将其销毁=>您无法使用shell访问它。 – user2021091

0

如果您需要测试中的数据,则应为其创建fixtures。最好的方法是使用./manage.py dumpdata --help

将输出存储在项目树中以便能够从测试中加载它。您可以使用像FIXTURES_DIR这样的设置,但这不是必需的。您还可以将夹具文件存储在他们所属的测试附近。

我的经历让我创建了几个只包含某些模型的小夹具文件。例如,我有一个小夹具文件,其中只包含我在测试中需要的一些用户。该夹具在需要认证的任何地方加载。当然,包含与用户对象相关数据的所有其他灯具都需要更改为这些测试用户,或者需要将相关用户添加到灯具。您将不得不尝试四处修复您的夹具数据,以使其完成测试。您很可能不希望将所有生产数据都作为测试装置。

在你测试你指定这样的灯具:

from django.test import TestCase 

class SomeTest(TestCase): 
    USER_DICT = { 
     'username': 'django-test', 
     'password': 'XXX' 
    } 

    fixtures = [ 
     # fixture for django-test and other users 
     os.path.join(settings.FIXTURE_DIR, 'auth_fixture.json'), 
     # core models for some app 
     os.path.join(settings.FIXTURE_DIR, 'core.json'), 
    ] 

def test_one(self): 
    # uses clean fixtures 
    # modify, delete or add data 
    pass 

def test_two(self): 
    # uses clean fixtures 
    # the changes of test_one have been reset 
    pass 

这会自动加载灯具为每个测试。您可以在一次测试(单一测试方法)期间修改,删除和添加数据,并且所有数据都将重置为下一次测试的原始数据(下一个方法)。

0

是的!

这是一个好主意吗?希望有更简单和更安全的方法来实现你的目标。

默认情况下,django测试运行器creates a database前加test_,部分是为了防止您的数据库意外执行破坏性测试!

因为django的模型与测试运行器集成测试紧密集成(编写与数据库实际交互的测试非常快)。这主要是因为每个测试都是在一个事务中执行的,并且在测试拆卸期间,事务被回滚。由于测试速度如此之快,因此惯例是根据需要在每个测试中创建测试数据(固件),而不是依赖全局数据库状态。这也会让您的测试更加孤立和专注。


当然,在很多情况下,您可能想测试生产。要做到这一点,您可以使用常规测试运行器(unittest.TestCase,因此不会出现测试数据库),然后直接导入模型并查询数据库。

但是,如果您的意图是“我想检查我的测试中有多少行在我的已填充表中,因为我解析了一个csv来填充数据库”。那么为什么你不能创建一个Django的单元测试,在那里你有一个虚假的CSV,执行代码解析/加载它,然后在你的测试用例的上下文中查询你的数据库?它在django测试用例的上下文中提供了很多保护和速度。

如果您最终创建了某种直接查询数据库的功能/自动化测试,那么创建READ ONLY数据库用户可能是一个好主意。