2017-02-02 8 views
4

Я использую Django и Neo4j вместе с neomodel как OGM (ORM для графиков). Он работает хорошо, но когда дело доходит до тестирования, Neomodel не поддерживает обычное поведение Django с реляционными базами данных. Я имею в виду, что он не создает временный экземпляр Neo4j, который создается в начале тестирования и уничтожается после его завершения.Neo4j и Django тестирование

Я делал некоторые исследования, и я нашел два возможных решения:

  • Во-первых, это создание пользовательских DISCOVER бегун, где вы остановить базу данных разработки, а затем запустить тестовую базу данных из другого путь, запустить ваши тесты и, наконец, остановить экземпляр теста и снова запустить экземпляр разработки. Это решение предлагается в потоке Django testing of neo4j database. Следующий код был адаптирован для 3.1.1 версии Neo4j:

    from time import sleep 
    from subprocess import call 
    
    from django.test.runner import DiscoverRunner 
    from py2neo import authenticate 
    
    class DiscoverRunner(DiscoverRunner): 
    def setup_databases(self, *args, **kwargs): 
        # Stop your development instance 
        call("sudo neo4j 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("neo4j_test/neo4j-community-3.1.1/bin/neo4j" 
            " start", shell=True) 
        # Need to sleep to wait for the test instance to completely come up 
        sleep(10) 
        if success != 0: 
         return False 
    
        # These lines have been commented because I've set the configuration 
        # dbms.security.auth_enabled=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") 
    
        # authenticate("localhost:7474", "neo4j", "my-password") 
    
        #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(DiscoverRunner, 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("neo4j_test/neo4j-community-3.1.1/bin/neo4j" 
            " stop", shell=True) 
        if success != 0: 
         return False 
        sleep(1) 
        # start back up development instance 
        call("sudo neo4j start", shell=True) 
    

    Он отлично работает, пока он не пытается подключиться к тестовой базе данных и сделать запрос, поскольку он использует соединение шифрует и смотрит в '~/.neo4/known_hosts' для подключения ключа, но он конфликтует с одним из базы данных разработки и аварией со следующей ошибкой:

    neo4j.v1.exceptions.ProtocolError: Server certificate does not match known certificate for 'localhost'; check details in file '~/.neo4j/known_hosts' 
    

    Итак, есть ли способ избежать этой проверки сертификации?

  • Второе решение создает тот же маршрут поиска и создает базу данных ImpermanentDatabase, доступную в Neo4j. Проблема в том, что вся информация, которую я нашел, находится в Java exceot this, Neo4j ImpermanentDatabase in python unittests, и это не дает мне понять, как реализовать это в python. Есть ли кто-то имеет некоторое представление о том, как использовать его в питон (это не имеет значения, если это с neomodel, py2neo или даже непосредственно с драйвером питона)

Спасибо очень много заранее.

ответ

1

После некоторого исследования я придумал решение, используя первый подход.

Официальный драйвер питон для Neo4j имеет настраиваемый параметр (зашифрованное) при подключении к водителю:

GraphDatabase.driver('bolt://' + hostname, auth=basic_auth(username, password), encrypted=True) 

Если зашифрованная параметр установлен в значение False, то '~/.neo4/known_hosts' будет игнорироваться и не будет никаких ошибок , К сожалению, инфраструктура neomodel еще не поддерживает настройку этого параметра, но я разветвил репозиторий в github и добавил переменную в глобальные параметры ENCRYPTED_CONNECTION, которые могут быть переопределены для достижения этой цели.

Я ожидаю, что запрос на тягу будет принят, я сообщу, либо принято, либо нет.

Кстати, если кто-то может дать нам некоторую личность второго подхода, прокомментированного в вопросе, который был бы потрясающим.

Спасибо.

Смежные вопросы