brunch

매거진 Django doc

You can make anything
by writing

C.S.Lewis

by 장영석 Jan 16. 2020

Django TestCases

Provided test case classes


SimpleTestCase

class SimpleTestCase

unittest.TestCase 에서 기능을 확장합니다.   

유용한 assertion 들이 있습니다.

수정된 설정 값으로 테스트가 실행되게  할 수 있습니다.

client 와 Client 를 사용할 수 있습니다.


데이터베이스 쿼리를 사용하여 테스트를 실행 하려면 서브클래스인 TransactionTestCase 나 TestCase 를 사용해야 합니다.




TransactionTestCase

class TransactionTestCase

SimpleTestCase 를 상속하고 몇 가지 데이터베이스 관련 기능을 추가합니다.   

ORM 을 좀 더 쉽게 사용하기 위해 데이터베이스를 초기 상태로  재설정 할 수 있습니다.

데이터베이스 fixtures 를 제공합니다.

데이터베이스 백엔드 기능을 기반으로 하는 테스트를 스킵합니다.

이 외 특별한 assert* 함수들을 제공합니다.


Django의 TestCase 클래스는 자주 쓰이며 각 테스트 마다 데이터베이스 트랜잭션 기능을 사용하여 초기 상태를 빠르게 만들어 주는 TransactionTestCase 의 서브클래스 입니다. 하지만 그로 인해 Django TestCase 클래스를 사용하면 특정 데이터베이스의 행위를 테스트하지 못합니다. 예를 들면, select_for_update() 를 사용할 때 트랜잭션 내에서 코드 블록이 실행되고 있는지 테스트할 수 없습니다. 이런 경우 TransactionTestCase 를 사용해야 합니다.


TransactionTestCase 와 TestCase 는 데이터베이스를 테스트 상태로 리셋하는 방식과 커밋과 롤백의 영향 테스트를 위한 테스트 코드 기능을 제외하고는 동일합니다.   

TransactionTestCase 테스트 실행 후 모든 테이블을 truncate 하여 데이터베이스를 리셋합니다. TransactionTestCase 는 커밋과 롤백을 호출하고 이들이 데이터베이스에 미치는 영향을 관찰할 수 있습니다.


반면에 TestCase 는 테스트 후 truncate 테이블을 사용하지 않습니다. 대신, 테스트 종료시에 롤백되는 데이터베이스 트랜잭션에 테스트 코드를 포함시킵니다. 이는 테스트 종료시 초기 상태로 데이터베이스가 복원된는 롤백을 보장합니다.



롤백이 지원되지 않는 데이터베이스에서 실행되는 TestCase 와 모든 TransactionTestCase 의 인스턴스는 테스트 종료 시 테스트 데이터베이스의 모든 데이터를 지우는 방식으로 롤백 될 것입니다.

TestCase 본문에 serialized_rollback=True 를 설정하여 초기 데이터를 다시 로드할 수 있습니다.




TestCase

class TestCase

Django에서 테스트 작성 시 가장 일반적으로 사용하게 되는 클래스입니다. TransactionTestCase 를 상속합니다. 당신의 Django 애플리케이션이 데이터베이스를 사용하지 않는다면 SimpleTestCase 를 사용합니다.   

두 개의 중첩 atomic() 블락으로 테스트를 감싸고 있습니다. 각 테스트 마다 하나, 전체 클래스에 하나 존재합니다. 따라서, 특정 데이터베이스의 트랜잭션 동작 테스트를 원한다면 TransactionTestCase 를 사용합니다.

각 테스트가 종료될 때 지연가능한 데이터베이스 제약사항들을 확인합니다.

또한 추가적인 기능들을 메소드로 제공합니다.


classmethod TestCase.setUpTestData()

위에서 설명된 클래스 수준의 atomic 블락을 사용하여 전체 TestCase 대상으로 클래스 수준으로 초기 데이터를 한 번만 만들 수 있습니다.

이 기술을 사용하면 setUp() 을 사용할 때보다 더 빠른 테스트가 가능합니다.


트랜잭션을 지원하지 않는 데이터베이스(예, MySQL에서 MyISAM 엔진을 사용)에서 테스트를 실행한다면 setUpTestData() 는 각 테스트 전에 매번 호출되고 성능 상 이점을 갖지 못합니다.


테스트 메소드에서 **setUpTestData()**에서 생성된 어떠한 객체도 수정하지 않도록 주의해야 합니다. 클래스 수준의 설정 작업에서 메모리 객체의 수정은 테스스 메소드 간에 유지됩니다. 이것들의 수정이 필요하다면, setUp() 메소드에서 refresh_from_db() 를 사용하여 리로드 할 수 있습니다.




LiveServerTestCase

class LiveServerTestCase

LiveServerTestCase 는 기본적으로 한 가지 기능을 제외하고 TransactionTestCase 와 비슷합니다. 시작 시 백그라운드에서 setup 시 라이브 Django 서버를 시작하고 teardown 시 서버를 종료합니다. Django dummy client 이외의 자동화된 테스트 클라이언트(Selenium 클라이언트 같은)를 사용 가능하게 하여 브라우저에 일련의 기능 테스트를 실행하고 실제 유저의 행동을 시뮬레이션 할 수 있습니다.

라이브 서버는 localhost


매거진의 이전글 Writing and running tests
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari