BackEnd/Spring & Springboot Study

[토비의 스프링] 2.5 학습 테스트로 배우는 스프링

학습 테스트란?

자신이 만들지 않은 프레임워크나 다른 개발팀에서 만들어서 제공한 라이브러리 등에 대해서도 테스트를 작성한다.
이런 테스트를 학습 테스트 (learning test)라고 한다.
학습 테스트의 목적은 자신이 사용할 API나 프레임워크의 기능을 테스트로 보면서 사용 방법을 익히려는 것이다.
프레임워크 기능에 대한 검증이 아닌 자신이 만들려는 기술이나 기능에 이해와 사용방법을 위한 검증이 목적이다.

 

학습 테스트의 장점

 

  • 다양한 조건에 따른 기능을 손쉽게 확인해볼 수 있다.
  • 학습 테스트 코드를 개발 중에 참고할 수 있다.
  • 프레임워크나 제품을 업그레이드할 때 호환성 검증을 도와준다.
  • 테스트 작성에 대한 좋은 훈련이 된다.
  • 새로운 기술을 공부하는 과정이 즐거워진다.

 

학습 테스트 예제

 

JUnit 테스트 오브젝트 테스트

더보기

JUnit 테스트 오브젝트 생성에 대한 학습 테스트

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class JUnitTest {

    static JUnitTest testObject;
    @Test
    public void test1() {
        assertEquals(this, testObject);
        testObject = this;
    }

    @Test
    public void test2() {
        assertEquals(this, testObject);
        testObject = this;
    }

    @Test
    public void test3() {
        assertEquals(this, testObject);
        testObject = this;
    }
}

 

개선한 JUnit 테스트 오브젝트 생성에 대한 학습 테스트

@SpringBootTest
public class JUnitTest {

    static Set<JUnitTest> testObjects = new HashSet<JUnitTest>();
    //static JUnitTest testObject;
    @Test
    public void test1() {
       assertEquals(testObjects, not(hasItem(this)));
       testObjects.add(this);
    }

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

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

 

스프링 테스트 컨텍스트 테스트

@ContextConfiguration
public class JUnitTest {
	@AutoWired
    ApplicationContext context;
    
    static Set<JUnitTest> testObjects = new HashSet<JUnitTest>();
    static ApplicationContext = contextObject = null;
    
    @Test
    public void test1() {
    	assertEquals(testObjects, not(hasItem(this)));
        testObjects.add(this);
        assertEquals(contextObject == null || contextObject == this.context, true);
        contextObject = this.context;
    }
    
    @Test
    public void test2() {
    	assertEquals(testObjects, not(hasItem(this)));
        testObjects.add(this);
        assertEquals(contextObject == null || contextObject == this.context, true);
        contextObject = this.context;
    }
    
    @Test
    public void test3() {
    	assertEquals(testObjects, not(hasItem(this)));
        testObjects.add(this);
        assertThat(contextObject, either(is(nullValue())).or(is(this.context)));
        //assertEquals(contextObject == null || contextObject == this.context, true);
        // JUnit5로 either or 구문을 어떻게 쓰는지 모르겠어서 주석처리
        contextObject = this.context;
    }
}

매번 동일한 애플리케이션 컨텍스트가 context 변수에 주입됐는지 확인하는 테스트 코드

학습 테스트로 만들어 볼만한 예제

스프링이 싱글톤 방식으로 빈의 오브젝트를 만든다는 것을 검증

@Autowired로 가져온 빈 오브젝트가 어플리케이션 컨텍스트에서 직접 getBean()으로 가져오는 것과 동일한지

xml에서 스트링 타입의 프로퍼티 값을 설정한 것이 정말 빈에 잘 주입되는지 등등

 

버그 테스트

코드에 오류가 있을때 그 오류를 가장 잘 드러내줄 수 있는 테스트

이를 위해 실패하도록 만들어야 한다. 버그가 원인이 되서 테스트가 실패하는 코드를 만들자.

 

버그테스트의 장점

 

  • 테스트의 완성도를 높여준다.
    • 기존 테스트에서 검증하지 못하는 부분에 대한 불충분한 테스트를 보완해줌 (추적 용이)
  • 버그의 내용을 명확하게 분석하게 해준다.
    • 테스트의 중요한 기법 중의 하나인 동등분할이나 경계값 분석등을 적용해볼 수 있다.
  • 기술적인 문제를 해결하는데 도움이 된다.
    • 원인 파악이 힘들때 단순한 코드와 그에 대한 버그 테스트를 활용하면 찾는데 도움이 됌

 

용어정리

동등분할과 경계값 분석

동등분할(equivalence partitioning)
같은 결과를 내는 값의 범위를 구분해서 각 대표 값으로 테스트를 하는 방법
어떤 작업의 결과의 종류가 true, false 또는 예외발생 세 가지라면 각 결과를 내는 입력 값이나 상황의 조합을 만들어 모든 경우에 대한 테스트를 해보는 것이 좋다.

경계값 분석(boundary value analysis)
에러는 동등분할 범위의 경계에서 많이 발생한다는 특징을 이용해서 경계의 근처에 있는 값을 이용해 테스트를 하는 방법이다. 보통 숫자의 입력 값인 경우 0이나 그 주변 값 또는 정수의 최대값, 최소값 등으로 테스트를 해보면 도움이 될 때가 많다.