Neo4j数据库的Django测试
Django testing of neo4j database
我使用 django 和 neo4j 作为数据库,使用 noemodel 作为 OGM。我该如何测试?
当我运行 python3 manage.py test
所有的改变,我的测试都剩下了。
以及如何制作两个数据库,一个用于测试,另一个用于生产,并指定如何使用哪个?
我认为保留所有更改的原因是因为使用与开发中使用的相同的 neo4j 数据库进行测试。由于 neomodel 没有与 Django 紧密集成,因此它在测试时的行为与 Django 的 ORM 不同。当您 运行 使用其 ORM 进行测试时,Django 会做一些有用的事情,例如创建一个测试数据库,该数据库将在完成时销毁。
对于 neo4j 和 neomodel,我建议执行以下操作:
创建自定义测试运行程序
Django 允许您通过设置 TEST_RUNNER
设置变量来定义 custom test runner。一个非常简单的版本是:
from time import sleep
from subprocess import call
from django.test.runner import DiscoverRunner
class MyTestRunner(DiscoverRunner):
def setup_databases(self, *args, **kwargs):
# Stop your development instance
call("sudo service neo4j-service stop", shell=True)
# Sleep to ensure the service has completely stopped
sleep(1)
# Start your test instance (see section below for more details)
success = call("/path/to/test/db/neo4j-community-2.2.2/bin/neo4j"
" start-no-wait", shell=True)
# Need to sleep to wait for the test instance to completely come up
sleep(10)
if success != 0:
return False
try:
# For neo4j 2.2.x you'll need to set a password or deactivate auth
# Nigel Small's py2neo gives us an easy way to accomplish this
call("source /path/to/virtualenv/bin/activate && "
"/path/to/virtualenv/bin/neoauth "
"neo4j neo4j my-p4ssword")
except OSError:
pass
# Don't import neomodel until we get here because we need to wait
# for the new db to be spawned
from neomodel import db
# Delete all previous entries in the db prior to running tests
query = "match (n)-[r]-() delete n,r"
db.cypher_query(query)
super(MyTestRunner, self).__init__(*args, **kwargs)
def teardown_databases(self, old_config, **kwargs):
from neomodel import db
# Delete all previous entries in the db after running tests
query = "match (n)-[r]-() delete n,r"
db.cypher_query(query)
sleep(1)
# Shut down test neo4j instance
success = call("/path/to/test/db/neo4j-community-2.2.2/bin/neo4j"
" stop", shell=True)
if success != 0:
return False
sleep(1)
# start back up development instance
call("sudo service neo4j-service start", shell=True)
添加辅助 neo4j 数据库
这可以通过多种方式完成,但要按照上面的测试 运行 进行操作,您可以从 neo4j's website 下载社区分发版。有了这个辅助实例,您现在可以利用测试 运行ner 中 call
s 中使用的命令行语句在您想要使用的数据库之间切换。
总结
此解决方案假设您使用的是 linux 盒子,但只需稍作修改即可移植到不同的 OS。此外,我建议查看 Django's Test Runner Docs 以扩展测试 运行ner 可以做什么。
目前没有在 neomodel 中使用测试数据库的机制,因为 neo4j 每个实例只有 1 个模式。
但是你可以覆盖环境变量 NEO4J_REST_URL 当 运行 这样的测试时
导出NEO4J_REST_URL=http://localhost:7473/db/datapython3manage.py测试
我使用 django 和 neo4j 作为数据库,使用 noemodel 作为 OGM。我该如何测试?
当我运行 python3 manage.py test
所有的改变,我的测试都剩下了。
以及如何制作两个数据库,一个用于测试,另一个用于生产,并指定如何使用哪个?
我认为保留所有更改的原因是因为使用与开发中使用的相同的 neo4j 数据库进行测试。由于 neomodel 没有与 Django 紧密集成,因此它在测试时的行为与 Django 的 ORM 不同。当您 运行 使用其 ORM 进行测试时,Django 会做一些有用的事情,例如创建一个测试数据库,该数据库将在完成时销毁。
对于 neo4j 和 neomodel,我建议执行以下操作:
创建自定义测试运行程序
Django 允许您通过设置 TEST_RUNNER
设置变量来定义 custom test runner。一个非常简单的版本是:
from time import sleep
from subprocess import call
from django.test.runner import DiscoverRunner
class MyTestRunner(DiscoverRunner):
def setup_databases(self, *args, **kwargs):
# Stop your development instance
call("sudo service neo4j-service stop", shell=True)
# Sleep to ensure the service has completely stopped
sleep(1)
# Start your test instance (see section below for more details)
success = call("/path/to/test/db/neo4j-community-2.2.2/bin/neo4j"
" start-no-wait", shell=True)
# Need to sleep to wait for the test instance to completely come up
sleep(10)
if success != 0:
return False
try:
# For neo4j 2.2.x you'll need to set a password or deactivate auth
# Nigel Small's py2neo gives us an easy way to accomplish this
call("source /path/to/virtualenv/bin/activate && "
"/path/to/virtualenv/bin/neoauth "
"neo4j neo4j my-p4ssword")
except OSError:
pass
# Don't import neomodel until we get here because we need to wait
# for the new db to be spawned
from neomodel import db
# Delete all previous entries in the db prior to running tests
query = "match (n)-[r]-() delete n,r"
db.cypher_query(query)
super(MyTestRunner, self).__init__(*args, **kwargs)
def teardown_databases(self, old_config, **kwargs):
from neomodel import db
# Delete all previous entries in the db after running tests
query = "match (n)-[r]-() delete n,r"
db.cypher_query(query)
sleep(1)
# Shut down test neo4j instance
success = call("/path/to/test/db/neo4j-community-2.2.2/bin/neo4j"
" stop", shell=True)
if success != 0:
return False
sleep(1)
# start back up development instance
call("sudo service neo4j-service start", shell=True)
添加辅助 neo4j 数据库
这可以通过多种方式完成,但要按照上面的测试 运行 进行操作,您可以从 neo4j's website 下载社区分发版。有了这个辅助实例,您现在可以利用测试 运行ner 中 call
s 中使用的命令行语句在您想要使用的数据库之间切换。
总结
此解决方案假设您使用的是 linux 盒子,但只需稍作修改即可移植到不同的 OS。此外,我建议查看 Django's Test Runner Docs 以扩展测试 运行ner 可以做什么。
目前没有在 neomodel 中使用测试数据库的机制,因为 neo4j 每个实例只有 1 个模式。
但是你可以覆盖环境变量 NEO4J_REST_URL 当 运行 这样的测试时
导出NEO4J_REST_URL=http://localhost:7473/db/datapython3manage.py测试