2016-04-13 13 views
0

Hier das Snippet, das ich für meine End-to-End-Tests mit Selen verwende (ich bin völlig neu im Selen-Django-Test);Persistenter Login während der Django-Selen-Tests

from django.contrib.auth.models import User 
from django.contrib.staticfiles.testing import StaticLiveServerTestCase 
from selenium.webdriver.chrome.webdriver import WebDriver 

class MyTest(StaticLiveServerTestCase): 

    @classmethod 
    def setUpClass(cls): 
     super(DashboardTest, cls).setUpClass() 

     cls.selenium = WebDriver() 
     cls.user = User.objects.create_superuser(username=..., 
               password=..., 
               email=...) 
     time.sleep(1) 
     cls._login() 

    @classmethod 
    def _login(cls): 
     cls.selenium.get(
      '%s%s' % (cls.live_server_url, '/admin/login/?next=/')) 
     ... 

    def test_login(self): 
     self.selenium.implicitly_wait(10) 
     self.assertIn(self.username, 
         self.selenium.find_element_by_class_name("fixtop").text) 

    def test_go_to_dashboard(self): 
     query_json, saved_entry = self._create_entry() 
     self.selenium.get(
      '%s%s' % (
       self.live_server_url, '/dashboard/%d/' % saved_entry.id)) 
     # assert on displayed values 

    def self._create_entry(): 
     # create an entry using form and returns it 

    def test_create(self): 
     self.maxDiff = None 
     query_json, saved_entry = self._create_entry() 
     ... assert on displayed values 

Mir ist aufgefallen, dass zwischen den einzelnen Tests die Anmeldung nicht persistent ist. So kann ich _login im setUp verwenden, aber mache meine Tests langsamer.

So, wie man dauerhaft zwischen den Tests anmelden? Was sind die besten Praktiken zum Testen dieser Tests (Djnago-Selen-Tests)?

Antwort

0

kevinharvey wies mich auf die Lösung! Schließlich fand einen Ausweg aus der Zeit der Prüfung und die Verfolgung aller Tests zu reduzieren:

ich alle Methoden umbenannt mit test..-_test_.. und hat eine Hauptmethode beginnen, die jede _test_ Methode aufruft:

def test_main(self): 
    for attr in dir(self): 
     # call each test and avoid recursive call 
     if attr.startswith('_test_') and attr != self.test_main.__name__: 
      with self.subTest("subtest %s " % attr): 
       self.selenium.get(self.live_server_url) 
       getattr(self, attr)() 

Diese So kann ich jede Methode einzeln testen (debuggen) :)

1

Durch-den-Browser-Tests mit Selen sind langsam, Punkt. Sie sind jedoch sehr wertvoll, da sie die beste Möglichkeit darstellen, die wahre Benutzererfahrung zu automatisieren.

Sie sollten nicht versuchen, echte Einheitentests mit Selenium zu schreiben. Verwenden Sie es stattdessen, um ein oder zwei große Funktionstests zu schreiben. Versuchen Sie, eine vollständige Benutzerinteraktion von Anfang bis Ende zu erfassen. Dann strukturieren Sie Ihre Testsuite so, dass Sie Ihre schnellen Nicht-Selenium-Unit-Tests separat ausführen können und nur gelegentlich die langsamen Funktionstests durchführen müssen.

Ihr Code sieht gut aus, aber in diesem Szenario würden Sie test_go_to_dashboard und test_create in einer Methode kombinieren.

+0

Danke :) Ich habe die Tests gegen die Hauptanwendungsfunktionalitäten aufgeteilt und weil wenn ich einen großen Test verwende; Es wird nach dem ersten Fehler beendet und ich werde den Rest meines Szenarios nicht testen können. –

+1

Rechts. Das ist der Grund, warum Selenium-Tests brüchig sind, aber ich würde immer noch sagen, dass der richtige Weg, dies zu tun, darin besteht, eine einzelne Funktion zu schreiben, die eine Menge von wiederholter Action-Assertion-Action-Assertion hat. Wenn Sie eine schnelle Rückmeldung über die gewünschte Funktionalität wünschen, schreiben Sie den Komponententest OHNE Selen. Hier ist ein Beispiel, dass ich viel benutze: https://github.com/kevinharvey/jmad/blob/test-driven-django-development/jmad/jmad/tests.py#L47 – kevinharvey

Verwandte Themen