Unit Test 세션기록
진정한 개발자가 되려면 유닛 테스트를 통해서 내가 가진 코드를 검증할 줄 알아야 한다.
Unit Test
- 자동화의 중요성
- 개발자라면 버그를 발견하는 테스트 조차 자동화 해야된다.
- 1차 프로젝트때는 메뉴얼 테스트로 했었음. => 사용자 입장에서 테스트하는 거라, 사용자 입장에서 시험을 해볼 수 있음. 어떤 버그가 나오는지 바로 명확하게 확인가능함.
- 메뉴얼 테스트의 단점: 테스트 실행속도 저하, 인력 소모, 인건비 상승, 불안정성, 비용 증가
- 메뉴얼 테스트 => E2E, End to End
- 구글 선정, e2e 10% unittest 70%, integrating test = 20%
- 시스템 테스트 방법
- (1) End to End Test: 사람이 누르는 시나리오를 코드를 짜는 것임. 프론트엔드 측면의 Cypress 사이트 확인해 볼 것.프론트엔드 측면의 Cypress 사이트 확인해 볼 것.
=> 백, 프 모두가 완성되어야 하는 테스트임
- (2) Integrating Test: 시스템 테스트 방법 3가지 (postman, httpie) - 로컬 서버가 돌아가야한다는 한계가 있다.
=> 합쳐져 있을 때 보다 어느 곳에서 에러가 났는지 확인하기가 편하다. 더 단위가 쪼개질수록 문제 확인에 용이하기 때문에...
=> 백, 프 각각 테스트 하는 것
- (3) Unit Test: 코드로 코드를 테스트하는 과정이다. 보통 함수, 또는 메소드를 테스트하게 된다.
=> Test Case, Test Fixture, assertion 이 3가지 요소로 이루어짐:
- Test Case: 테스트 조직의 기본단위
- 픽스쳐: 테스트용 데이터 설정
- 어설션: 테스트 하는 부분이 제대로 됬는지를 확인하는 부분. 어설션 실패하면 테스트도 실패함.
- 시험해봐야 되는 것: 성공할 때, 실패할 때, 예외처리 잘 되어 있는지..
- 유닛테스트 원칙:
- 각 기능의 가장 작은 단위에 집중할 것
- 각 테스트 유닛은 반드시 독립적이어야 한다.
- 카카오 소셜 로그인 예시: 카카오 서버의 도움이 없이도 코드가 될수 있게 해야 한다.
- 각 테스트 유닛은 반드시 독립적이어야 한다.
- 테스트가 빠르게 돌 수 있도록 만들기 위해 노력한다. 너무 느리면 개발 속도가 더뎌짐
- 테스트는 자주 돌게 되서 테스트 케이스는 최대한 빨리 만들어야 한다.
- 내가 속한 기업이 사용하는 유닛테스트 툴을 잘 이해하고 쓸 줄 알아야 한다.
- 그 날 코딩을 시작하기 전에 항상 풀 테스트 슈트를 돌려야 한다.
- 코드를 디버깅할 떄 가장 먼저 시작할 일은 버그를 찝어내는 새로운 테스트를 작성하는 것이다.
- 테스트 함수는 길고 서술적인 이름을 사용해야한다. 어떤 기능에 대한 테스트를 하고 있는지 나도 남도 잘 알수 있게 확실히 기술해줘야 한다.
- 테스트 코드의 또 다른 용례는 다른 개발자들을 위한 안내서로 쓰는 방법이다.
- 유닛 테스트가 더 빠른 이유?
- 42개 테스트 케이스를 테스트 하는데 단 4초밖에 안걸림
- 클래스명은 xxxTest 라고 뒤에 테스트라고 붙인다. TestCase(파이썬 제공)을 상속받게 해야한다. 메소드 함수는 test_ 테스트 언더바로 시작을 해야한다!!!, 그 후 클라이언트 지정해야함. 클라이언트가 포스트맨 역할을 하게됨. Get, Post 메소드등을 보내는 역할.
- 테스트는 인풋과 아웃풋을 미리 정해서, 인풋을 내가 정한 로직에 넣고 내가 에상하는 아웃풋이 나오는지 확인해야한다. 그렇다면 통과, 아니면 에러라고 알려줌.
- 직접 임포트 하는 게 아니고 클라이언트 객체를 이용해 우리가 설정한 엔드포인트 경로를 통해 함수를 호출한다.
- 테스트 데이터 셋업 -> teardown -> 계속 반복(매 테스트 케이스마다 테어다운이 실행됨)
- content_type = application/json으로 되어있음.
- 테스트 코드를 나중에 만들 것을 생각하고 views.py를 짜야함
- 노션 7주차 유닛테스트 란 들어가서 클론 받아보자. 모범사례 미리 확인해보기.
- python manage.py test 명령어 = 장고 프로젝트 전체 test.py 실행, 하나만 쓰고 싶으면 python manage.py test users 라고 쓰면 users 앱만함
- Mocking = 소셜로그인할 때 써봐야 하는 기능이다. 카카오 서버가 끊겨도 우리 쪽은 테스트를 돌려볼 줄 알아야 하니까!!!
@patch("users.views.requests")
def test_google_signin_new_user_success(self, mocked_requests):
client = Client()
class MockedResponse:
def json(self):
return {
}
mocked_requests.get = MagicMock(return_value = MockedResponse())
headers = {""}
response = client.get("/users/signin/google", **headers)
self.assertEqual(response.status_code, 201)
- @patch("users.views.requests") => 저 따옴표 requests를 가짜로 만들겠다는 의미.
self, mocked_requests =>
client = Client()
- 기본 구조만 쓰여있는 코드인데 위를 참고하며 직접 기본원리 탐구해보자!
좋은정보 얻어갑니다 귣귣