* 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

- 일반적으로, 외부로부터 응답받을 수 없는 상황에서 미리 준비된 응답을 받기 위해 사용한다.
    테스트 시 필요한 것 이외에는 응답하지 않는다

4. Spies
- 어떻게 호출 되었는지에 따라 일부 정보를 기록하는 Stub 이다

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 작성 후에 생각하게 만들기 때문에)


* BDD (Behavior Driven Development)

'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

+ Recent posts