TIL[78].Unit test

jake.log·2020년 10월 11일
0

1.유닛테스트란?

유닛테스트는 소스 코드의 기본 단위인 모듈, 메소드가 의도한 대로 작동하는지 확인하는 절차이다.

2.End to End Test, Integration Test 와의 차이점

아래 이미지는 Google Test Automation Conference에서 제안된 테스트 피라미드이다.

UI Testing은 10%, Integrating Testing은 20%, 그리고 Unit Testing을 70% 전체 테스트 coverage를 구현 하는것이 권장된다고 한다.

  • 프로그램을 테스트하는 3가지 방법

    • UI Testing / End-To-End Testing

      • 크롬 브라우저를 띄운다음 검색페이지로 들어가서 검색을 해보고, 검색한 내용이 제대로 나오는지 화면상에서 확인한다.
      • 직접 회원가입을 해보고 회원가입후에 로그인되는지 직접 브라우저 상에서 값을 입력해서 확인한다.
      • 즉 모든 과정을 직접 테스트 하는방법이라고 할 수 있다.
    • Integration Testing

      • 최소 두개이상의 클래스 또는 서브 시스템의 결합을 테스트하는 방법이다.

      • ex) 장고로 서버를 띄우고 모델 클래스와 결합하여 데이터베이스 시스템과 연동한 테스트

      • Postman 또는 httpie로 호출해서 Json response가 제대로 출력되는지 확인한다.

    • Unit Testing

      • 유닛테스트는 소스 코드의 기본 단위인 모듈이 의도한 대로 작동하는지 확인하는 절차다.
  • UI Testing이 가장 어렵고 까다롭다.
    또한 자동화와 실행하기가 까다롭다.

  • Manual Testing은 실행하기 쉽다는 장점이 있지만 비용이 많이 들고 부정확 하며 실행 시간이 오래 걸린다.

  • Integration Testing이 그 다음으로 공수가 많이 든다.

  • Unit Testing이 가장 쉬우며 비용이 싸고 효과가 좋다.

3.유닛 테스트의 장점

  • 비용이 싸다.
    ui test 는 백엔드 서버와 프론트를 연동해 직접 테스트해야하지만 유닛 테스트는 스크립트로 한번에 자동으로 실행하기 때문이다.

  • 실행속도가 빠르다.
    유닛테스트를 활용하면 배포도 여러번 할 수 있어 최대한 많이 활용하는게 좋다.

  • 유지보수가 쉽다.
    유닛테스르를 잘 작성해 놓는다면, 새로운 기능을 구현 할 때 중장기적으로 유지보수가 쉽다. 이렇게 이전에 테스트를 반복하는 것을 regression 테스트라고 한다.

  • 버그를 방지한다.
    유닛테스트 코드가 잘 짜여져 있으면 버그가 거의 발견되지 않고, 보통 유닛테스트가 없어서 버그가 많이 발견 된다.

4.실제 작성해본 로그인, 회원 가입 unit test

class EmailCheckTest(TestCase):
    
    def setUp(self):
        Account.objects.create(
            email = 'hongse@naver.com'
        )

    def tearDown(self):
        Account.objects.all().delete()

    def test_emailcheck_post_aleady_exists(self):
        client = Client()
        account = {
            'email' : 'hongse@naver.com',
        }
        response = client.post('/account/emailcheck', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,200)
        self.assertEqual(response.json(),
            {
                'message':'ALEADY_EXISTS'  
            }
        )

    def test_emailcheck_post_need_signup(self):
        client = Client()
        account = {
            'email' : 'hong@gmail.com'
        }
        response = client.post('/account/emailcheck', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,200)
        self.assertEqual(response.json(),
            {
                'message':'NEED_SIGNUP'  
            }
        )

    def test_emailcheck_post_invalid_keys(self):
        client = Client()
        account = {
            'e-mail' : 'hong@gmail.com'
        }
        response = client.post('/account/emailcheck', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,400)
        self.assertEqual(response.json(),
            {
                'message':'INVALID_KEY'
            }
        )

    def test_emailcheck_post_invalid_email(self):
        client = Client()
        account = {
            'email': 'honggmailcom' 
        }
        response = client.post('/account/emailcheck', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,400)
        self.assertEqual(response.json(),
            {
                'message':'INVALID_EMAIL'
            }
        )


class SingupTest(TestCase):

    def setUp(self):
        bytes_pw = bytes('12345678','utf-8')
        hashed_pw = bcrypt.hashpw(bytes_pw, bcrypt.gensalt())
        
        Account.objects.create(
            name = 'hong',
            password = hashed_pw.decode('UTF-8'),
            email = 'hong@gmail.com',
            phone_number = '01012341234'
        )
    
    def tearDown(self):
        Account.objects.all().delete()

    def test_signupview_post_success(self):
        client = Client()
        account = {
            'name'         : 'hong2',
            'password'     : '12345678',
            'email'        : 'hong2@gmail.com',
            'phone_number' : '01012345678'
        }
        response = client.post('/account/emailcheck/signup', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,200)

    def test_signup_post_aleady_exists(self):
        client = Client()
        account = {
            'name'        : 'hong',
            'password'    : '12345678',
            'email'       : 'hong@gmail.com',
            'phone_number': '01012341234'
        }
        response = client.post('/account/emailcheck/signup', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,400)
        self.assertEqual(response.json(),
            {
                'message':'ALREADY_EXISTS_PHONE_NUMBER'  
            }
        )

    def test_signup_post_invalid_keys(self):
        client = Client()
        account = {
            'first_name'  : 'hong',
            'pasword'     : '12345678',
            'email'       : 'hong@gmail.com',
            'phone_number': '01012341234' 
        }
        response = client.post('/account/emailcheck/signup', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,400)
        self.assertEqual(response.json(),
            {
                'message':'INVALID_KEY'
            }
        )


class SignInTest(TestCase):

    def setUp(self):
        bytes_pw = bytes('12345678','utf-8')
        hashed_pw = bcrypt.hashpw(bytes_pw,bcrypt.gensalt())
        
        account = Account.objects.create(
            name = 'hong',
            password = hashed_pw.decode('UTF-8'),
            email = 'hong@gmail.com',
            phone_number = '01012341234'
        )
        
        self.token = jwt.encode({'email':account.email},SECRET,algorithm=ALGORITHM).decode('utf-8') 

    def tearDown(self):
        Account.objects.all().delete()    
    
    def test_signinview_get_success(self):
        client = Client()
        account = {
            'id'           : 'id',
            'name'         : 'hong',
            'password'     : '12345678',
            'email'        : 'hong@gmail.com',
            'phone_number' : '01012341234'
        }
       
        response = client.post('/account/emailcheck/signin', json.dumps(account), content_type='application/json')
        self.assertEqual(response.status_code,200)
        self.assertEqual(response.json(),
            {
                'ACCESS_TOKEN': self.token
            }
        )

    def test_signinview_get_invalid_password(self):
        client = Client()
        account = {
            'name'        : 'hong',
            'password'    : '12341234',
            'email'       : 'hong@gmail.com',
            'phone_number': '01012341234'
        }
        response = client.post('/account/emailcheck/signin', json.dumps(account), content_type='application/json')

        self.assertEqual(response.status_code,400)
        self.assertEqual(response.json(),
            {
                'message':'INVALID_PASSWORD'  
            }
        )

    def test_signinview_get_invalid_keys(self):
        client = Client()
        account = {
            'name'         : 'hong',
            'passwrd'      : '12345678',
            'email'        : 'hong@gmail.com',
            'phone_number' : '01012341234' 
        }
        response = client.post('/account/emailcheck/signin', json.dumps(account), content_type='application/json')
        self.assertEqual(response.json(),
            {
                'message':'INVALID_KEY'
            }
        ) 
        self.assertEqual(response.status_code,400)
profile
꾸준히!

0개의 댓글