首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内存中运行Django MySQL测试

问在内存中运行Django MySQL测试
EN

Stack Overflow用户
提问于 2013-03-05 21:40:45
回答 3查看 3.8K关注 0票数 4

我有一个django 1.4项目,使用mysql作为后端。我要在内存中运行测试设置

代码语言:javascript
复制
if 'test' in sys.argv:
  DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}

问题是我需要使用mysql功能(全文索引)。

有办法让django在内存中运行MySQL进行测试吗?

我的项目依赖全文索引。当项目正在I syncdb上开发时,然后使用sql执行一个.sql文件来创建全文索引。

我想在我测试的函数中使用django orm全文搜索。我试图在每个测试的初始化中手动添加全文索引,如下所示:

cursor.execute('alter table mytable add fulltext(one, two)')

这在使用sqlite时不起作用(我相信是因为sqlite不支持全文索引)

当我移除内存中的测试时,上面的sql确实有效。我喜欢记忆测试的速度。有办法在内存中运行mysql吗?

人们如何测试依赖于数据库特定功能的应用程序?比如全文索引或gis等等..。他们是否必须在文件系统上正常运行测试?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-05 23:33:17

不要测试MySQL。MySQL已经通过了开发人员的测试。您的工作是以这种方式编写代码,这样您就可以用模拟Python对象替换MySQL连接,该对象将返回任何MySQL返回的内容(或者断言,如果发送给MySQL的查询是您希望的)

票数 -4
EN

Stack Overflow用户

发布于 2013-03-05 23:06:38

MySQL有一个MEMORY存储引擎。您可以使用OPTIONS键激活它:

代码语言:javascript
复制
if 'test' in sys.argv:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': 'localhost',
            'NAME': 'foo',
            'USER': 'bar',
            'PASSWORD': 'baz',
            'OPTIONS': {
                'init_command': 'SET storage_engine=MEMORY'
            }
        }
    }

但根据文档

代码语言:javascript
复制
MEMORY tables cannot contain BLOB or TEXT columns.

因此,我认为它对于您的(和许多其他)用例来说是非常无用的。

我发现了一些在这条线中加速这条线测试的其他技巧。确保阅读丹尼尔罗斯曼关于使用INNODB引擎的答案。

票数 15
EN

Stack Overflow用户

发布于 2013-03-06 00:05:08

正如monkut在问题评论中所建议的那样,您可以通过将测试数据库存储在RAM驱动器上来获得一些MySql加速。如果在Linux上运行tmpfs文件系统。但是,如果您在测试期间关注速度,这可能不会提供太多的速度改进,因为MySql通常会将其数据缓存在内存中。

我使用的方法是编写一个测试装饰器,它将跳过给定数据库后端不支持的测试,然后使用不同的settings.py文件对不同的后端进行测试。

在这里,我使用了姜戈-鼻子功能来帮助编写一个装饰器来跳过测试,如果任何测试数据库使用SQLite。

代码语言:javascript
复制
from nose import SkipTest
from django.conf import settings

def skip_if_sqlite(test_fn):
    """Nose test decorator to skip test if testing using sqlite databases.

    This may be useful when we know that a test will fail when using sqlite,
    possibly because the test uses functionality not supported on sqlite such
    as database views or full text indexes.

    This decorator can be used as follows:
    @skip_if_sqlite
    def my_test_that_shouldnt_run_if_sqlite_database(self):
        pass
    """

    @functools.wraps(test_fn)
    def wrapper(*args, **kwargs):
        # Skip test if any database contain a sqlite engine.
        for alias, db_settings in settings.DATABASES.iteritems():
            if 'sqlite' in db_settings['ENGINE']:
                raise SkipTest()
            return test_fn(*args, **kwargs)

    return wrapper

然后,设置具有不同settings.test.mysql设置的settings.test.sqlite和DATABASE。如果使用settings.test.sqlite执行测试,则将跳过依赖于MySql特定功能的测试,但如果针对settings.test.mysql运行测试,则将执行测试。

这种方法允许您在特定的数据库后端专门针对测试,但仍然提供了在开发过程中针对更快的SQLite数据库运行大多数测试的灵活性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15234679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档