오상우
오상우

Categories

  • java
  • spring

2. 테스트

스프링의 가장 중요한 두 가지 요소가 객체 지향과 테스트이다. 또한 이 두 가지는 서로 분리되어 있지 않다. 객체 지향적으로 잘 설계된 코드는 단위 테스트를 하기 좋고, 반대로 단위 테스트를 작성하기 어려운 코드는 객체 지향적으로 설계되지 않은 코드이다.

  • 테스트는 자동화 되어야 하고, 빠르게 실행되어야 한다.

오늘날 사실상 개발의 정석 방법론이라 할 수 있는 TDD는 테스트와 개발을 아주 짧은 간격으로 반복하며 코드르 작성한다. 만약 테스트를 수동으로 진행해야 하거나, 테스트를 실행하는데 긴 시간이 걸린다면 TDD를 적용하기 어렵다.

  • 테스트 결과는 일관성이 있어야 한다.

각 테스트 케이스가 순서나 기존 환경에 따라 성공,실패가 달라져서는 안 된다. 이를 위해 우리는 테스트용 환경을 따로 설정하거나, 목업을 활용한 단위 테스트를 진행해야 한다.

@RunWith(SpringJUnit4ClassRunner.class) // 테스트 컨텍스트를 전체 테스트에서 싱글턴으로 사용하기 위함.
@ContextConfiguration(locations = "/junit.xml") // 위 텍스트 컨텍스트 설정파일.
public class JUnitTest {
    @Autowired
    ApplicationContext context;

    static Set<JUnitTest> testObjects = new HashSet<JUnitTest>();
    static ApplicationContext contextObject = null;

    @Test
    public void test1() {
        assertThat(testObjects, not(hasItem(this))); // 각 테스트마다 새로운 객체 생성
        testObjects.add(this);

        // 모든 테스트에 대해 하나의 테스트 컨텍스트 사용.
        assertThat(contextObject == null || context == contextObject, is(true));
        contextObject = context;
    }

    @Test
    public void test2() {
        assertThat(testObjects, not(hasItem(this)));
        testObjects.add(this);

        assertTrue(contextObject == null || context == contextObject);
        contextObject = context;
    }

    @Test
    public void test3() {
        assertThat(testObjects, not(hasItem(this)));
        testObjects.add(this);

        assertThat(contextObject == null || context == contextObject, is(true));
        contextObject = context;
    }
}