2016-07-28 20 views
0

Ich versuche, einen Bericht von den Unit-Tests in Django zu generieren. Für die Tests laufen und das Abrufen der Ergebnisse, die ich eine benutzerdefinierte Testresult Klasse verwende, der gut arbeitet:So erhalten Sie Ergebnisse von Python-Unit-Tests in Django mit benutzerdefinierten Einstellungen

results = TestResult() 
loader = unittest.TestLoader() 
suites = loader.discover('test_folder') 
for suite in suites: 
    suite(results) 

Mein einziges Problem ist, dass ich nicht die Einstellungsdatei in Speicher-Datenbank verwenden überschreiben können. Ich dekorierte meine Testfälle mit override_settings von django.test, die für mich nur in der Befehlszeile funktioniert. Wenn ich es laufe die Lader mit der my_app.settings-Datei verwendet, aber es sieht aus wie es außer Kraft gesetzt wird:

>>> from django.conf import settings 
>>> settings.DATABASES 
{'default': {'TEST_CHARSET': 'UTF8', 'NAME': ':memory:', 'ENGINE': 'django.db.backends.sqlite3', 'TEST_NAME': ':memory:'}} 

ich meine eigenen override_settings Datei auch eine Funktion in meinem Projekt zu überschreiben erstellt und das Ergebnis ist die gleich. Ich habe versucht, die DJANGO_SETTINGS_MODULE in os.environ zu überschreiben, aber immer noch das gleiche Problem. Vielleicht fehlt mir eine django.setup() -Funktion, um die Einstellungsdatei erneut zu laden.

Ich möchte in der Lage sein:

  • erhalten Ergebnisse aus dem Gerät testen
  • Verwendung benutzerdefinierte Einstellungen
  • Last spezifische Testmodul (genau wie mit dem loader.discover (start_dir))

Testcase Beispiel:

from rest_framework import status 
from rest_framework.test import APITestCase 

class TestCase(APITestCase): 
    fixtures = ('dump',) 
    url = '/api/post' 

    def test_post(self): 
     # returns post from existing database not from fixture 
     post = Post.objects.get(pk=3) 
     data = { 
      'name': 'test', 
      'post': post.content 
     } 
     response = self.client.post(self.url + '/1', data=data) 
     self.assertEquals(response.status_code, status.HTTP_201_CREATED) 

Verwendung:

  • Python 3.4
  • Django 1,9

Vielen Dank für Ihre Hilfe.

Antwort

0

Nun, wenn Sie Befehl verwenden ./manage.py test, dann könnte man nur das Kommandozeilen-Argument analysieren und sehen, ob es ein test ist, dann haben eine if Anweisung in settings.py:

if 'test' in sys.argv: 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3' 
     } 
    } 
+0

Ich bin nicht über die Befehlszeile . Ich möchte die Ergebnisse als HTML-Bericht anzeigen und die Tests aus meiner Sicht ausführen. – regiea

+2

Das macht nicht viel Sinn. Sie können das Projekt nicht ausführen, während Sie Ihr Projekt selbst testen lassen, weil Ihr einziges Projekt nicht gleichzeitig mit der Produktionsdatenbank und der Testdatenbank verbunden werden kann. Sie sollten immer eine separate Prozedur erstellen, um Ihren Code zu testen. –

+0

Guter Punkt. Vielen Dank. Endlich bekomme ich die Testergebnisse mit der call_command Funktion. – regiea