2017-12-16 6 views
1

좋아요. 장고 앱에 대한 테스트를 작성하고 있습니다. 적절한 응답에 대한 ajax 등록 요청 테스트를 반복 할 수있는 방법을 찾으려고합니다. 작동하지만 더 효율적인 방법으로 수행 할 수 있습니다.pythonic 테스트하는 방법

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

코드가 작동하는 경우 [codereview.se]에 대한 질문을 고려하십시오. – usr2564301

답변

0

테스트를 별도의 방법으로 분리하면됩니다. 각각은 접두어 test_을 가지고있는 한 트리거되며, 각 테스트는 독립 실행 형 테스트로 실행될 수도 있습니다. 아무것도 미리 설정해야하는 경우 setUp 및 tearDown 메서드를 사용하십시오.

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

감사합니다. 그게 내가 생각하고 있었지만 테스트 응답을 반복 할 지 확신 할 수 없었습니다. – doughboy

0

일반적으로, 논리적으로 큰 테스트를 분할하고 UnitOfWork_StateUnderTest_ExpectedBehavior test method naming practice을 따라야합니다.

데이터 기반 테스트의 개념은 개인적으로 과거에 ddt package을 사용하고 pytest parameterized tests로 전환했습니다, 또한 관련 아이디어이다 - 즉 함수의 같은 특정 "증상"을 테스트 할 수있는 좋은 방법입니다 다른 입력 데이터를 사용하여 테스트합니다. 코드 중복을 방지하고 테스트를보다 체계적이며 읽기 쉽게 만듭니다.

관련 문제