Unit Test에 나오는 Fixture와 Mock은 무엇일까?
Test Fixture
Fixture는 '고정되어 있는 물체'를 의미한다.
Junit 팀에서 말하는 테스트 픽스처란?
의역하자면, 테스트 실행을 위해 베이스라인으로서 사용되는 객체들의 고정된 상태이다. 테스트 픽스처의 목적은 결과를 반복가능할 수 있도록 알 수 있고, 고정된 환경에서 테스트할 수 있음을 보장하기 위함이다.
예시
ㅇ 목 또는 가짜 객체의 세팅이나 생성 그리고 삽입할 데이터의 준비
ㅇ 구체적이며 알고있는 데이터를 지닌 데이터베이스 로딩
ㅇ 테스트 픽스처를 만들어내는 특정 파일들을 복사하면 특정 상태로 초기화된 객체들 생성됨.
Junit은 테스트 클래스들이 매번 테스트 실행 전/후 아니면 한번만 픽스처를 가질 수 있도록 애노테이션으로 제공한다.(JUnit4이 제공하는 4가지 픽스처 애노테이션: @Before, @BeforeClass, @After, @AfterClass)
내 의견
테스트를 위해 객체나 데이터들이 가지고 있는 변경되지 않는 상태를 Test Fixture로 표현하는 것 같다.
Mock, Mocking
주로 객체 지향 프로그래밍으로 개발한 프로그램을 테스트 할 경우 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제의 모듈을 "흉내"내는 "가짜" 모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다. 사용자 인터페이스(UI)나 데이터베이스 테스트 등과 같이 자동화된 테스트를 수행하기 어려운 때 널리 사용된다. - wiki pedia
What is Mocking?에 대한 StackOverFlow에 올라온 답변
서문
명사로서 Mock을 찾고 있다면, '가짜로 만들어진 어떤 것'이라는 사전적 의미를 찾을 수 있을 것이다.
본문
Mocking은 유닛 테스트에서 주로 사용된다.
테스트 하는 객체는 보통 다른 객체들과 의존성을 가지고 있을 것이다. 원하는 객체의 행동을 고립시키기 위해(의존성 없이) 다른 객체들을 실제 객체의 행동을 시뮬레이션하는 mock들로 대체시켜야한다.
이것은 실제 객체를 단위 테스트에 통합하기에 실용적이지 않을 때 유용하다.
간략히 말해, Mocking이란 실제 객체들의 행동을 시뮬레이션하는 객체들을 만드는 것이다.
추가
Stubbing과 Mocking을 구분하고 싶을 수도 있다. 아마 이 주제에 대해서 몇몇은 반대할 것이지만, 내 의견(답변자)으로는 Stub이란 최소한 정도로 시뮬레이션된 객체이다.
Stub은 테스트가 실행되고 통과할 정도로만 구현된다.
Stub과 유사하지만, Mock은 기대하는 또는 예상하는 mock을 맞게 호출했는지까지 검증한다. 테스트의 일부는 mock이 정확하게 사용되는지 검증하는 것이다.(실제 객체를 대체하는지)
예를 들자면, 데이터를 저장하기 위해 인메모리 DB를 사용하여 간단하게 DB를 stubbing할 수 있다.
테스트하는 객체는 테스트를 실행하기 위해 데이터베이스에 읽고 쓸 수 있다. 이 경우 객체의 몇몇 행동은 DB와 관계없는 테스트를 할 수 있고, DB Stub은 이 테스트들 또한 테스트 실행에 포함될 것이다.
하지만, DB에 구체적인 데이터를 작성하는 객체를 검증하고 싶다면 그 DB를 Mocking 해야한다.
테스트들은 Mocking한 DB에 무엇이 작성되었는지 통합적인 검증을 할 수 있다.
내 의견
Stub은 단순한 테스트용, 대체한 객체에 대한 정확한 검증이라는 과정이 없고(인메모리로 쓰고 읽기만 하면 ok)
Mock은 내가 실제 사용하는 객체를 정확하게 흉내내고 있는지까지 검증(이 데이터에 실제 사용하려는 DB에 정확하게 동작하는가)
출처:
What is Mocking - StackOverFlow
Test Fixture - junit-team GitHub
모의 객체(Mock Object) - Wiki pedia