2016-05-29 4 views

Antwort

0

yeah Sie können die Einstellungen auf dem Setup überschreiben setzen Sie die echte Datenbank für die Tests und laden Sie Ihre Datenbanken Fixtures .. aber ich denke, es ist keine gute Praxis, da Sie Ihre Tests ausführen möchten, ohne zu ändern "echte" App env.

sollten Sie den Pytest-Django versuchen.

mit dieser lib können Sie wiederverwenden, erstellen Drop Ihre Datenbanken Test.

2

Ich denke Ederson Badeca Recht, sollten Sie nicht Ihre Projekt_DB als test_db verwenden. Stattdessen würde ich vorschlagen, eine Kopie der aktuellen project_db beim Einrichten der Datenbank zu erstellen und stattdessen Tests dagegen auszuführen. In Django-Tests müssen Sie dazu einen eigenen Test-Runner erstellen. Aber in py.test gibt es eine Fixture namens db, die alle db setup/teardown Logik ausführt. Sie müssten also ein benutzerdefiniertes db-Fixture erstellen, das das macht, was Sie wollen. Hier ist die Quelle der Standard-Db-Vorrichtung https://github.com/pytest-dev/pytest-django/blob/master/pytest_django/db_reuse.py

P.S. Wenn Sie den Test auf der Projektdatenbank weiterhin ausführen möchten.

Ich habe dies getan, nur in django Standardtests mit benutzerdefinierten Läufer unten (django Version 1.6, wird auch in anderen Versionen nicht getestet)

# coding: utf-8 

from __future__ import unicode_literals, absolute_import 

from django.conf import settings 
from django.core.exceptions import ImproperlyConfigured 
from django.core.management import call_command 
from django.db import connection 
from django.test.runner import DiscoverRunner, setup_databases 
from django.test.testcases import connections_support_transactions 

# configure(default_settings=settings, 
settings.DEBUG = True 
settings.TEMPLATE_DEBUG = True 


class KeepDatabaseTestRunner(DiscoverRunner): 
    """ 
    Skips creating test database and uses default database for tests. 
    """ 

    def setup_databases(self, **kwargs): 
     """Setups databases to run and migrate on settings.DATABASES['default']['TEST']['NAME']""" 
     old_name = settings.DATABASES['default']['NAME'] 
     try: 
      test_name = settings.DATABASES['default']['TEST']['NAME'] 
     except KeyError: 
      raise ImproperlyConfigured("TEST NAME is not defined in settings.DATABASES['default']") 
     connection.settings_dict["NAME"] = test_name 
     connection.settings_dict['SUPPORTS_TRANSACTIONS'] = connections_support_transactions() 
     call_command('syncdb') 
     call_command('migrate') 
     return [connection, old_name, False], [] 

    def teardown_databases(self, old_config, **kwargs): 
     """Will not do anything""" 
     pass 

aktualisiert

Ok, hier ist die Grundidee, wie Sie es tun könnten. Zuerst müssten Sie den Standard db fixiture komplett überladen. Die Codezeile, nach der Sie suchen, lautet https://github.com/pytest-dev/pytest-django/blob/master/pytest_django/fixtures.py#L39. Dies ist, wo py.test seinen test_db Namen zuweist, der _get_test_db_name zuweist. Also im Grunde müssen Sie benutzerdefinierte _get_test_db_name erstellen und darin sollten Sie Pfad zu Ihrem Projekt_DB angeben. Auch danach müssten Sie --reuse-db bei Tests verwenden.

P.S. Sie könnten auch test_db mit dem Dump Ihrer Projekt_DB füllen und danach Tests mit --reuse-db durchführen und py.test führt Ihren Test gegen die letzte project_db Version aus, die sich in test_db befindet.

+0

Ja, danke für die Hilfe, ich habe ähnlichen Code gesehen und dachte, es wäre mit py.test auch möglich, aber kann kein Beispiel finden oder es selbst funktionieren .. py.test Code ist schwer zu lesen. – eugene

+0

@eugene lesen update, kann es Ihnen bei Ihrem Problem helfen –