토비의 스프링 3.1 - (2)


Published on September 07, 2021 by Eunbi.N

Spring Toby

Vol.1 스프링의 이해와 원리

2장. 테스트

2.1) UserDaoTest 문제점

  • 수동 확인 작업의 번거로움 - 테스트 자동화 과정마다 체크, 수동적 검증 필요
  • 실행 작업의 번거로움 - main()메소드
  • DAO, Service, Controller, view 등의 레이어 기능을 다 만든후에야 테스트 가능
    → 단위 테스트의 필요성
  • 대상, 조건을 명확하게, 작은 단위로 제한해서 기능 테스트

2.2) 개선 및 테스트 검증

  • 테스트 검증 자동화
  • add() 등록, get() 검증, print() 결과값 확인 - xUnit
  • 테스트 메소드 ( main -> 일반 메소드)
  • @Test
  • public void addAndGet() { }
  • assertThat() : Param - mathcer 비교해서 일치하면 패스, 실패하면 테스트 실패처리
  • ex. assertThat(user2.pwd(), is(user1.pwd()));

2.3) JUnit - 개발자를 위한 테스팅 프레임워크

JUnit 테스트 실행

public static void main(String[] args){
    JUnitCore.main("spingboot.user.dao.UserDaoTest"); }
  • assertThat() 검증 : 성공, 실패, 에러 갯수, 총 테스트 갯수, 수행시간
  • 자바의 표준 테스팅 프레임워크 (이클립스 내장된 JUnit 테스트 지원 도구 사용)

빌드 툴

  • ANT, Maven - JUnit 플러그인, 테스트 -> 실행결과는 HTML / txt.
  • 테스트결과의 일관성
  • 외부 상태에 따라 성공/실패 - 앞의 테스트 DB삭제 필요(중복)
  • addAndGet()테스트 후 반드시 등록자 정보 삭제, 테스트 이전상태로 리셋해주기 권장
    -> deleteAll, getCount() - 테스트 순서 보장X 순서에 상관없이 동일한 결과 보장X(개선할 점)

addAndGet()

  • .add() 후 레코드 갯수 확인, get() 값 비교 검증
  • user1, user2 테스트 갯수를 하나 더 늘려서 연속 동작 기능 검증

get() 예외조건에 대한 테스트

  • 전달된 정보가 없는 경우의 결과값 출력
  • 1.EmptyResultDataAccessException 예외 이용
  • 2.초기화, if(is.next()){} 조건절로 예외발생 방지

TDD (Test Driven Development)

  • 테스트 주도 개발 : 만들고자 하는 기능 + 코드 검증이 가능한 테스트 코드 먼저 생성
  • ‘실패한 테스트를 성공시키기 위한 목적이 아닌 코드는 만들지 않는다’ 원칙
  • 장점 : 누락된 테스트 없이 꼼꼼하게 체크, 에러 파악 용이, 테스트작성 주기 감소
  • 테스트 작성 후 성공시키는 코드를 만드는 작업 주기를 가능한 짧게 가지도록 권장

리팩토링 + JUnit

  • @Before : JUnit 제공 어노테이션(@Test실행되기 전 먼저 실행해야하는 메소드 정의)
  • public void setUp(){} :중복 코드를 넣을 메소드, 로컬변수는 인스턴스변수로 변경(private dao)
  • JUnit 테스트 수행방식
  • 1.@Test public void, 파라미터 없는 테스트 메소드 모두 찾기
  • 2.@테스트 클래스의 NEW 오브젝트 1개 생성 (독립적 실행, 서로 영향X)
  • 3.@Before 메소드가 있으면 먼저 실행
  • 4.@Test 메소드 1개 호출, 테스트 결과 저장
  • 5.@After 메소드가 있으면 실행
  • 6.나머지 테스트 메소드에 대해 2~5번 반복
  • 7.모든 테스트의 결과를 종합해서 리턴.

2.4) 스프링 테스트 적용

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/applicationContext.xml")
public class UserDaoTest {
	@Autowired
	private ApplicationContext context;
	private MemberDAO dao;
	
	@Before
	public void setUp() {
		System.out.println(this.context);
		System.out.println(this);
		this.dao = this.context.getBean("MemberDAO",MemberDAO.class);
	}
}   
@DirtiesContext
public class UserDaoTest {
    @Autowired
    UserDao dao;

    @Before
    public void setup() {
        DataSource dataSource = new SingleConnectionDataSource(
            "jdbc:mysql://localhost/testdb", "spring", "book", true);
        dao.setDataSource(dataSource); //수동 DI 
    }
}