테스트코드에서 setUp 함수와 setupClass의 차이는 무엇입니까?
setUp()
각각의 테스트 메서드가 실행될 때마다 실행, 각 테스트메서드는 방금 생성된 fresh한 오브젝트를 입력받는다!
각 테스트가 끝나면 롤백되기 때문에 데이터베이스에 대한 변경 사항을 정리하지 않아도 된다.
테스트 중 내용이 변경될 수 있는 객체를 이곳에서 생성한다.
단점 :
테스트당 한 번 호출됨 => 시간이 오래 걸리는 경우 테스트 속도가 크게 느려질 수 있다.
setUpClass()
@classmethod 데코레이터를 달아 함께 사용, 메서드 인자로 cls를 넘겨준다
모든 테스트 함수들을 아울러 데이터를 한 번만 설정한다
한 곳에 테스트에 필요한 데이터들을 정의하고 관리할 수 있다는 장점이 있다
단점 :
테스트 클래스가 시작되기 이전에 전체를 한 번 호출하기때문에 테스트 도중에 자동 롤백이 되지 않는다
작성한 내용을 되돌리기 위해서는 tearDownClass에서 직접 롤백해주어야 하는 단점이 있다
setUp 과 setUpClass 함수의 차이점
- 데코레이터
setUpClass는 @classmethod 데코레이터를 달아주고 cls를 메서드 인자로 넘겨주는 반면
setUp은 따로 데코레이터 설정이 필요없는 것 - 실행 시기
setUpClass는 테스트클래스가 시작되기 이전에 한 번 호출되므로 테스트 도중 롤백되지 않는다
setUp은 각각의 테스트메서트마다 한 번씩 호출되며 호출 시에 생성된 오브젝트를 바로 적용한다
테스트가 끝나면 롤백되므로 변경사항이 저장되지 않는다
이외의 테스트코드 Fixture
tearDown()
각 테스트가 끝난 이후에 호출되는 메서드
setUp 메소드가 성공했을 경우에만 호출되며, 테스트 과정에서 exception이 발생해도 실행된다
tearDownClass()
해당 테스트 클래스가 종료된 이후 단 한번 호출되는 메서드
tearDown메소드는 각 테스트 메소드가 끝난 이후 항상 호출된다
@classmethod 데코레이터를 달아줘야하고 메서드 인자로 cls를 넘겨준다.
setUpTestData()
unittest 모듈은 아니지만 1.8ver 부터 django.test.TestCase에 포함
클래스 전체에서 사용되는 설정을 위해서 테스트가 시작할때 한 번만 실행된다
테스트 메서드가 실행되면서 수정되거나 변경되지 않을 객체들을 이곳에서 생성할 수 있다
데이터, 객체 타입 | 실행 시기 | 롤백 여부 | @classmethod | |
setUp | 테스트 중 내용 변경O 객체 |
각 테스트 메서드마다 테스트가 끝나면 즉시 롤백 |
O | X |
setUpClass | 클래스 전체에서 사용되는 테스트 데이터 메서드 실행 시 수정, 변경X 객체 |
테스트 시작 전 한 번 주어진 클래스의 모든 인스턴스에 대해 한 번 호출 |
X | O |
setUpTestData | 클래스 전체에서 사용되는 테스트 데이터 메서드 실행 시 수정, 변경X 객체 |
테스트 시작 전 한 번 시행한 기능은 모든 테스트케이스 작동 후 롤백 |
O | X |
tearDown | 각 테스트 케이스 종료시 마다 |
setUp() 호출 성공 시 호출 |
. | X |
tearDownClass | 해당 테스트 클래스 종료 시 한 번만 사용 (테스트 종료시 자원 정리 등) |
주어진 클래스의 모든 인스턴스에 대해 한 번 호출됨 |
. | O |
[참고] :
https://docs.python.org/3/library/unittest.html#unittest.TestCase.tearDown
Template Engine을 사용할 때, 발생하는 CSRF Error가 무엇이고 어떻게 해결합니까?
- CSRF cross site request forgery 사이트간 요청 위조
사이트간 요청 위조는 웹사이트 공격 취약점 중 하나
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하여 공격하는데,
이를 방지하기 위해 CSRF Error가 있는 것!
CSRF Error는 사용자가 의도치 않은 행위를 하도록 만드는 일종의 사이트 혹은 사용자에 대한 공격을 방지하기 위해 존재한다 - 공격을 방지하기 위해서 Django서버는 middleware 설정에서 csrf 토큰을 헤더에 담아 통신하도록 설정되어있다
따라서 장고 백엔드 서버와 통신하기 위해서는 CSRF토큰이 필수적
- @csrf_exempt 데코레이터를 사용하거나 미들웨어를 수정하는 경우를 제외 - CSRF Error를 해결하기 위해서는 csrftoken을 헤더에 담아 보내주면 된다
Django Template Engine을 사용할 경우 {% csrf_token %} 으로 감싼 form 태그를 사용하거나 hidden_input에 csrf_token을 담아서 같이 보내주는 방법이 있다
'취대넓얕' 카테고리의 다른 글
[기술면접] 7일차 문답 | Status Code, 소프트 삭제 (0) | 2023.07.27 |
---|---|
[기술면접] 6일차 문답 | Django ORM (0) | 2023.07.26 |
[기술면접] 4일차 문답 | FBV CBV 테스트코드 TDD (2) | 2023.07.24 |
[기술면접] Django 문답 | DRF, sqlite (0) | 2023.07.24 |
[기술면접] 3일차 문답 | FK O2O M2M (0) | 2023.07.21 |