* Mock Aren't Stubs ('04.07.08)
> http://martinfowler.com/articles/mocksArentStubs.html
(번역 : https://sites.google.com/a/jabberstory.net/testing/mocksArentStubs)
> 마틴 파울러는 위의 글에서 Mock 과 Stub 은 2가지 차이점이 있다고 설명하고 있다
1. Mock Objects 는 모의 객체로써 Behavior Verification 을 사용하고, Test Stub 은 실제 객체로써 State Verification 을 사용한다
2. 테스팅과 설계가 함께 이뤄지는 방법에 대한 철학이 다르다 (Classical TDD vs Mockist TDD)
* Test Double
> 실제 객체처럼 테스트 목적으로 사용되는 객체들을 의미한다 (제라드 메스자로스)
> 아래 5가지 종류를 정의했다
1. Dummy
- 전달되지만 실제로 사용되지는 않는다. 일반적으로 parameter 를 채우기 위해 사용한다
2. Fake Objects
- 실제 실행되는 구현부가 있지만, 실제 동작을 하기에는 간단한 형태로 적합하지 않을 수 있다 (In Memory Database 의 예처럼)
3. Test Stubs
- 일반적으로, 외부로부터 응답받을 수 없는 상황에서 미리 준비된 응답을 받기 위해 사용한다.
테스트 시 필요한 것 이외에는 응답하지 않는다
5. Mocks
- 응답 받을 것으로 예상되는 Spec 으로 미리 프로그래밍된 객체이다
> 이 중, Mock 만 Behavior Verification 을 사용한다
* Classical vs Mockist TDD
> Classical TDD
- Test 작성 시, Target 이외에 필요한 모든 Class 들을 Real Object 혹은 공통적으로 사용되는 Fixture를 이용하여 만들어나가는 방식이다
- Real Object 를 사용하고, 그렇지 못할 경우에는 Test Double 을 이용한다
- Fixture 를 만드는 노력이 크지만, 재사용할 수있다
- 공통으로 사용되는 코드가 문제가 생기는 경우, 전체 테스트에 영향을 미친다
- Middle-out Style
: 특정 기능을 선택하고, 필요한 도메인을 설정한다. 도메인에 포함된 객체들이 모두 생성되어 동작하게 되면, UI 를 만들 수 있다. 이렇게 되면
Test Double 과 같은 것들이 필요 없다
- 모든 Collaborators 를 만들어야 한다 (Cost 가 크지만 재사용 될 수 있다)
- 하나의 테스트가 실패하면, 다른 테스트들도 같이 실패할 수가 있다. 클러스터의 규모를 적정선으로 하면 이러한 문제를 줄일 수 있다.
- 테스트 작성 시에도 구현에 대해 생각하게 된다.
> Mockist TDD
- Test 작성 시, Target 이외에 필요한 모든 것들은 Mock 으로 대체하여 만들어나가는 방식이다
- Interesting behavior 을 가진 모든 객체에 Mock 을 사용한다.
- Test 마다 Fixture 를 만들어야 한다
- 모의 객체를 이용하기 때문에 문제가 생기더라도 해당 테스트에만 영향을 준다
- Outside-in Style
: 하나의 테스트를 작성하고, 그와 관련된 Mock 의 기대 동작을 Spec 으로 하여 다음 테스트를 작성해 나간다
- 필요한 Collaborator 만 Mock 으로 만들면 된다 (Test 마다 각각 Mocking 해야 되지만, 이런 작업이 반복되면 마찬가지로 Cost 가 클 수 있다)
- 구현 코드가 바뀌게 되면 Classical 방식보다 테스트가 깨지기 쉽다
- 테스트 작성 시에는 구현에 대한 고민이 줄어들게 된다. (Test 작성 후에 생각하게 만들기 때문에)
'SW 공학 > 테스팅' 카테고리의 다른 글
CORRECT (경계 조건 찾기) (0) | 2020.09.26 |
---|---|
Right-BICEP (무엇을 테스트 할지) (0) | 2020.09.26 |
FIRST (좋은 테스트 조건) (0) | 2020.09.26 |
//category (0) | 2020.09.19 |
Mock Objects (작성중) (0) | 2019.08.24 |