어떤 input에 대해서 원하는, 예상하는 output이 나오지 않을 경우 수정(Modify&Fix)을 한다.
3 -> 2 -> 1 순서대로 복잡도가 올라간다.
테스트 비중: E2E 10%, integration 20%, Unit 70%의 비중으로 테스트하는 것이 일반적으로 올바르다.
즉, 테스트는 유닛 테스트의 비중이 제일 크다
Test Pyramid
End-to-End Tests
ex) cypress
Integration Tests
ex) postman
Unit Tests
유닛 테스트가 있는 코드에서는 작업 시작 전에 코드를 다 돌려보고,
작업 후에 테스트를 다시 돌려서 이상이 없는지를 확인한다!
유닛 테스트를 통해서 input/output이 한번에 보이기 때문에 기능의 확인이 쉽다.
Python의 unittest 모듈을 사용
TestCase :
unittest 프레임 워크의 테스트 조직의 기본 단위
Fixture :
테스트를 진행할때 필요한 테스트용 데이터 혹은 설정 등을 이야기 한다.
주로 테스트 가 실행되기 전이나 후에 생긴다.
(테스트하기 위해 미리 넣어주는 데이터, 테스트용 table은 빈 상태로 시작한다.)
assertion :
unittest에서 테스트 하는 부분이 제대로 됬는지를 확인하는 부분.
Assertion이 실패하면 테스트도 실패한다.
테스트 케이스는 독립적이어야 한다.
그래서 unit Test를 Fixture로 할 때,
준비는 setUp()메서드로, clean up 처리는 tearDown()메서드로 처리한다.
django에서는 자동으로 생성되는 tests.py를 통해 unit test를 진행한다.
기본적으로 unittest를 위해 TestCase 클래스와 Client() 객체를 제공한다.
test.py에서 테스트용 클래스를 import하고
테스트 class를 만든 후에 제일 먼저 setUp메서드로 테스트할 수 있는 데이터를 DB에 만들어 줘야한다.
DB 자체는 django에서 테스트할 때 자동으로 생성하고 없애준다.
여러개의 테스트 데이터 입력할 때는 그냥 create말고도 bulk_create를 사용할 수 있다.
원래는 id가 자동 생성이지만 테스트할 때는 id도 입력해줘야 혼선을 막을 수 있다.
Client() 클래스 사용을 위해 인스턴스를 생성하고 그 인스턴스화된 객체로 테스트를 진행한다.
여기서의 client가 프론트엔드의 기능을 하게된다.
post메서드와 같은 것은 바디에 데이터가 들어가 있어야하므로 post의 바디에 들어갈 data를 dict에적고 그것을 dumps(dict) 메서드로 json 바디를 만들어 준다.
requests는 외부 API를 사용하기 위한 메서드!
@patch("users.views.requests") 부분에서 requests를 만나면 실행하지말고 이쪽으로 돌려서처리
우리는 카카오로부터 response로 카카오 계정정보를 받아서 response.json 으로 풀어서 쓰고싶은건데
그 데이터가 없으니까, Mockedresponse가 실행되게 한다.
이 안에서 json 메서드 안에서 실제 내가 카카오로 부터 받고 싶은 데이터를 mock으로 만들어준다.