2017-12-16 2 views
1

Ok Ich schreibe Tests für meine Django App. Ich versuche, einen Weg zu finden, um über die Tests für einen Ajax-Register-Aufruf für die entsprechenden Antworten zu iterieren. Es funktioniert, aber ich weiß, dass es auf eine effizientere Weise getan werden kann.mehr Pythonic Weg zu testen

def test_ajax_register(self): 
    c = Client() 
    # Check register success 
    response = c.post('/register/', { 
     'register-username': 'testuser', 
     'register-email': '[email protected]', 
     'register-password': 'password' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'success') 
    self.assertEqual(response.status_code, 200) 

    # Check register failed username taken 
    response = c.post('/register/', { 
     'register-username': 'testuser', 
     'register-email': '[email protected]', 
     'register-password': 'password' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'fail') 
    self.assertEqual(json.loads(response.content)['error_msg'], 'username already in use') 

    # Check register failed email in use 
    response = c.post('/register/', { 
     'register-username': 'testuser1', 
     'register-email': '[email protected]', 
     'register-password': 'password' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'fail') 
    self.assertEqual(json.loads(response.content)['error_msg'], 'email already in use') 

    # Check register failed password length 
    response = c.post('/register/', { 
     'register-username': 'testuser2', 
     'register-email': '[email protected]', 
     'register-password': 'pass' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'fail') 
    self.assertEqual(json.loads(response.content)['error_msg'], 'password must be atleast 8 characters long') 
+1

Wenn Ihr Code funktioniert, denken Sie an [codereview.se]. – usr2564301

Antwort

0

Trennen Sie Ihre Tests einfach in separate Methoden. Jeder von ihnen wird ausgelöst, solange sie das Präfix test_ haben, und jeder Test kann auch als eigenständiger Test ausgeführt werden. Verwenden Sie die Methoden setUp und tearDown, wenn Sie etwas voreinstellen müssen.

def test_ajax_register(self): 
    # Test registration 
    c = Client() 
    # Check register success 
    response = c.post('/register/', { 
     'register-username': 'testuser', 
     'register-email': '[email protected]', 
     'register-password': 'password' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'success') 
    self.assertEqual(response.status_code, 200) 


def test_failed_registration(self): 
    # Check register failed username taken 
    response = c.post('/register/', { 
     'register-username': 'testuser', 
     'register-email': '[email protected]', 
     'register-password': 'password' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'fail') 
    self.assertEqual(json.loads(response.content)['error_msg'], 'username already in use') 


def test_email_in_use(self): 
    # Check register failed email in use 
    response = c.post('/register/', { 
     'register-username': 'testuser1', 
     'register-email': '[email protected]', 
     'register-password': 'password' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'fail') 
    self.assertEqual(json.loads(response.content)['error_msg'], 'email already in use') 


def test_password_length(self): 
    # Check register failed password length 
    response = c.post('/register/', { 
     'register-username': 'testuser2', 
     'register-email': '[email protected]', 
     'register-password': 'pass' 
    }) 
    self.assertEqual(json.loads(response.content)['status'], 'fail') 
    self.assertEqual(json.loads(response.content)['error_msg'], 'password must be atleast 8 characters long') 
+0

ok danke, das ist, was ich dachte, aber ich war mir nicht sicher, ob ich über die Test-Antworten iterieren würde – doughboy

0

Im Allgemeinen sollten Sie die große Bewährungsprobe logisch aufgeteilt und die UnitOfWork_StateUnderTest_ExpectedBehavior test method naming practice folgen.

Das Konzept der datengetriebene Tests ist auch eine entsprechende Idee, ich persönlich ddt package in der Vergangenheit verwendet habe und dann geschaltet pytest parameterized tests - das ist eine gute Möglichkeit, die gleichen spezifischen „Symptom“ eine Funktion zu testen unter Test mit verschiedenen Eingabedaten - dies würde helfen, Code-Duplikation zu verhindern (DRY principle) und Ihre Tests organisierter und lesbarer zu machen.

Verwandte Themen