본문 바로가기
취대넓얕

[기술면접] 5일차 문답 | 테스트코드 Fixture CSRF

by 째깍단 2023. 7. 25.

 

테스트코드에서 setUp 함수와 setupClass 차이는 무엇입니까?

 

setUp()

각각의 테스트 메서드가 실행될 때마다 실행, 각 테스트메서드는 방금 생성된 fresh한 오브젝트를 입력받는다!

각 테스트가 끝나면 롤백되기 때문에 데이터베이스에 대한 변경 사항을 정리하지 않아도 된다.

테스트 중 내용이 변경될 수 있는 객체를 이곳에서 생성한다.

 

단점 :

테스트당 한 번 호출됨 => 시간이 오래 걸리는 경우 테스트 속도가 크게 느려질 수 있다.

 

 

setUpClass()

@classmethod 데코레이터를 달아 함께 사용, 메서드 인자로 cls 넘겨준다

모든 테스트 함수들을 아울러 데이터를 한 번만 설정한다 

한 곳에 테스트에 필요한 데이터들을 정의하고 관리할 있다는 장점이 있다

 

단점 :

테스트 클래스가 시작되기 이전에 전체를 한 번 호출하기때문에 테스트 도중에 자동 롤백이 되지 않는다

작성한 내용을 되돌리기 위해서는 tearDownClass에서 직접 롤백해주어야 하는 단점이 있다

 

 

 

 

 

setUp 과 setUpClass 함수의 차이점

  1. 데코레이터
    setUpClass는 @classmethod 데코레이터를 달아주고 cls를 메서드 인자로 넘겨주는 반면
    setUp은 따로 데코레이터 설정이 필요없는 것

  2. 실행 시기
    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://medium.com/an-engineer-a-reader-a-guy/django-test-fixture-setup-setupclass-and-setuptestdata-72b6d944cdef

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 담아서 같이 보내주는 방법이 있다