본문 바로가기
Dev/etc

TDD에서 테스트 문서 대체 가능이란?

by 펭귄안에 온천 2022. 10. 30.
728x90
반응형

 

각종 IT블로그, 서적에서 테스트의 중요성을 강조하고 있다.

특히 TDD를 통한 개발을 소개하고 있고,

많은 회사에서 면접을 볼때 TDD에 대한 의견을 물어볼 정도로 Test, TDD는 중요하다

 

그럼에도 불구하고 TDD 심지어 테스트 코드조차 작성하지 않는 개발자들이 많다.

필자도 SI프로젝트를 진행하면서 SI프로젝트 기한을 맞추기 위해 바쁘다는 핑계로 TDD를 실천하지 않았고

심지어 테스트의 중요성을 알지 못했다.

 

그렇게 3년이란 시간이 지나

이직한 회사의 개발자들이 TDD을 통해 개발을 진행했고

늦게나마 TDD를 실천하기 위해 공부를 했고 이해하기 어려웠던 부분을 공유하려고 이렇게 글을 쓴다.

 

TDD란?

테스트 주도 개발(test-driven development, TDD)은 소프트웨어 개발 방법론 중의 하나로,

선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법을 말한다.

다시 말해 먼저 자동화된 테스트 코드를 작성한 후 테스트를 통과하기 위한 코드를 개발하는 방식의 개발 방식을 말한다.

=> 테스트 코드 작성 => 테스트 => 개발 => 테스트 코드 작성 => 테스트 => 개발 ....

 

TDD의 장점과 단점은 많은 블로그에서도 확인 할 수있으니 여기서는 생략하고

필자가 이해가 되지 않았던 TDD의 장점중에서 "테스트 문서 대체 가능"에 대해서 생각해보자

 

 

테스트 문서 대체 가능에 대한 오해

- 필자는 공공기관SI, 국가 프로젝트를 진행하면서 단위테스트, 통합테스트 작성등의 문서를 작성했다.

- 사실 이러한 문서는 눈 가리고 아웅식으로 작성하는 경우가 많아 실제로 테스트 하지 않고 작성했다( 엑셀, 한글파일 )

=> TDD를 하면 Test프레임워크(Junit)이 엑셀 파일을 자동으로 만들어주나? 라고 오해 했었음

- TDD에서 말하는 "테스트 문서 대체 가능"이라는 것은 최종감리보고서에 제출하기 위한 단위테스트,통합테스트 문서가 아니다.

 

 

샘플코드

	@Test(expected = EmptyResultDataAccessException.class)
	public void getUserFail() throws ClassNotFoundException, SQLException {
		ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
		UserDao dao = context.getBean("userDao", UserDao.class);
		dao.deleteAll();
		assertThat(dao.getCount(),is(0));
		dao.get("unknown_id");

	}

위 코드는 "unknown_id" 라는 아이디로 사용자를 조회하고

해당 사용자가 없을 경우 EmptyResultDataAccessException 뱉는지 확인하는 테스트 코드이다.

  단계 내용 코드
조건 어떤 조건을 가지고 가져올 사용자 정보가 존재하지 않을 경우에 dao.deleteAll();
assertThat(dao.getCount(),is(0));
행위 무엇을 할때 존재하지 않는 ID로 
get()을 실행하면
dao.get("unknown_id");
결과 어떤 결과가 나온다. 특별한 예외가 던져진다. @Test(expected = EmptyResultDataAccessException.class)

해당 샘플 코드를 정리한 표를 보면 마치 하나의 기능정의서 처럼 보인다.

이렇게 테스트코드를 보면 어떤 목적으로 개발을 진행했고

어떤 조건을 가졌고 어떤 결과를 원하는지 알 수 있다.

이것이 테스트 문서를 대체 할 수 있다는 의미다.

 

테스트 문서를 대체하고 이것에 새로운 문서를 만들어준다는 뜻이 아니였음...

 

결론은 TDD를 잘하자

 

개발자들이 낭만이라고도 생각하는 '눈물 젖은 커피와 함께 며칠간 밤샘을 하며 오류를 잡으려고 애쓰다가 전혀 생각지도 못했던 곳에서

간신히 찾아낸 작은 버그 하나의 추억' 이라는 건, 사실 '진작에 충분한 테스트를 했었다면 쉽게 찾아냈을 것을 미루고 미루다 결국 커다란 삽질로 만들어버린 어리석은 기억'일 뿐이다.

 

 

참고 - 토비의 스프링 (2장 테스트)

반응형

'Dev > etc' 카테고리의 다른 글

데코레이터 패턴  (0) 2022.12.02
전략패턴  (0) 2022.12.02
Semantic Versioning  (0) 2022.10.01
분산컴퓨팅  (0) 2022.08.31
정적( static )  (0) 2022.08.14