Purple Bobblehead Bunny

Backend/SPRING

[Spring] 테스트 주도 개발

준영어린이 2023. 2. 7. 15:29


 

 

🚀  TDD(Test Driven Development) 란?

위키피디아에서 정의된 내용은 다음과 같다.

테스트 주도 개발(Test-driven development, TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다.

우선 개발자는 바라는 향상 또는 새로운 함수를 정의하넌 자동화된 테스트 케이스를 작성한다. 그런 후, 그 케이스를 통과하기 위한 최소한의 양의 코드를 생성한다. 그리고 마지막으로 그 새 코드를 표준에 맞도록 리팩토링한다. 이 기법을 개발 했거나 '재발견'한 것으로 인정되는 Kent Beck은 2003년에 TDD가 단순한 설계를 장려하고 자신감을 불어넣어 준다고 말했다.

 


 

사전적인 정의를 보고선 쉽게 이해가 가지 않을 수도 있다.

 

테스트 주도 개발(Test Driven Development)라는 용어 그대로 이해 해 보면 

개발에 있어서 테스트가 주가 되어 개발을 한다는 의미이다. "테스트를 염두에 둔 프로그램 개발 방법"이라고 이해하면 될 듯 하다.

 

기존 개발 방법
Test-Driven-Development 개발 방법

 

 

테스트 코드를 작성하며 결과를 예상해볼 수 있기 때문에 설계의 문제로 인한 오류 개선 속도가 한층 빨라질 것이라는 예상을 할 수가 있다. TDD 개발의 큰 장점이라고 볼 수 있다.

 


🚀  TDD(Test-driven development)의 장점

 

1 객체지향적인 코드 개발

    

 

    각각 함수를 정의할 때 기능들에 대해 구조화 시켜 코드를 작성할 수 있게 된다. 테스트의 용이성을 위해 복잡한 기능을 한 함수에 모두 구      현할 경우 테스트 방식이 복잡해지고 시간이 오래 걸리며 코드 수정이 되는 경우 테스트 코드를 재사용할 수 없게 되기 때문이다.

    자연스럽게 TDD의 목적인 코드의 재사용성을 보장하며 코드를 작성하게 된다.

 

     TDD는 결국 코드가 재사용성 기반으로 작성되어야 하기에, 기본적으로 객체지향적인 코드가 되는 것이다.

 

 

 

2 설계 수정 시간의 단축

 

 

     테스트 코드를 먼저 작성하기 때문에 최초 설계안을 만족시키며 입출력 구조와 기능의 정의를 명확히 하게 되므로 설계의 구조적 문제를       바로 찾을 수 있게 된다. 미리 테스트 시나리오를 작성함으로써 코드 개발 전 기능을 구현하기 위한 예외 상황들을 미리 확인해보고 조사         하게 되는 효과가 발생하여 예외 코드를 작성하기 쉬워진다.

 

 

3 유지 보수의 용이성

 

 

     TDD 개발로 인해 테스트 요소들이 사용자 관점으로 정의되고 진행되기 때문에 입력과 출력의 흐름이 명확해지고 추후 구조의 변경 및 소       스 수정 시 구조를 쉽게 파악하고 빠른 수정이 가능해 진다. 재사용 테스트도 쉽게 가능 해 진다.

 

 

4 테스트 문서의 대체 가능

 

 

    TDD를 구현할 경우 테스팅을 자동화 시킴과 동시에 정확한 테스트 근거를 산출할 수가 있게 된다.

 

 


🚀  단위 테스트

 

 

테스트하고자 하는 대상이 명확하다면 그 대상에만 집중해서 테스트 하는것이 바람직하다.따라서 테스트는 작은 단위로 쪼개서 수행되는것이 가장 좋은데 이를 단위 테스트라고 한다.

 

때로는 단위들이 통합되어 실행 되었을 때 문제가 발생할 수 있기 때문에 긴 과정의 테스트도 필요할 때가 종종 있다.하지만, 단위 테스트를 제대로 구현하지 않고 긴 테스트만 수행 했을 때, 문제의 원인은 찾기 힘들어진다.

여기서 단위 테스트의 몇가지 이점을 볼 수 있다.

  • 개발자가 의도한 대로 코드가 잘 수행되는지 바로 확인할 수 있다.
  • 단위가 아닌 어플리케이션 자체를 테스트할 때, 발견되는 오류를 좀 더 명확하게 접근이 가능하다.

 🚀 JUnit Testing Framework

 

프로그램을 구현하다보면 내가 작성하고 있는 코드가 정상적으로 수행되는지 궁금한 경우가 많다.

Java의 경우  Sysout() 또는 디버깅 툴을 이용하고, JavaScript의 경우에는 console.log() 를 이용하거나 debugget를 이용해 알아볼 수 있다. 하지만, 코드 중간중간의 단위에 대한 결과값을 빠르게 보기에는 어려움이 너무 많다.

 

이럴 때 유용한 프레임워크가 JUnit이다. 

내가 구현한 함수가 제대로 구현한 함수인지, 결과 값이 내가 예상한 값과 일치한지 비교하는데 유용하게 사용이 된다.

 

JUnit은 다수의 테스트에서 동일한 코드를 수행할 때 해당 코드를 여러 번 작성하지 않고 미리 정의해둔 것으로 재사용할 수 있다.

또한, 시간을 확인할 수 있어서 용이하다.

 

 

 

🚀 JUnit 사용

 

예시로 회원가입 테스트 코드를 직접 작성을 했다.

 

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.org.mapper.UserMapper">


	<insert id="userJoin">
		insert into user values
		(#{userid},#{passwd},#{name},#{addr},#{phone},#{email})
	</insert>

</mapper>

 

 

 

UserMapper.java

package com.org.mapper;

import com.org.model.UserDTO;

public interface UserMapper {
	
	/* 회원가입 */ 
	public void userJoin(UserDTO dto);
}

 

UserDTO.java

@Data
@ToString
public class UserDTO {


	private String userid;
	private String passwd;
	private String name;
	private String addr;
	private String phone;
	private String email;
}

 

 

UserMapperTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class UserMapperTest {
	
	@Autowired
	private UserMapper userMapper;
	
 	@Test
	public void userJoin() throws Exception {
		UserDTO dto = new UserDTO();
		
		dto.setUserid("admin");
		dto.setPasswd("1234");
		dto.setName("admin");
		dto.setAddr("admin");
		dto.setEmail("admin@admin.com");
		dto.setPhone("000-0000-0000");
		
		
		memberMapper.userJoin(dto);
	} 
}

 

'Backend > SPRING' 카테고리의 다른 글

[Spring] DAO, Mapper  (0) 2023.02.03
[Spring] Spring Security  (0) 2023.02.01
[Spring] GET POST 한글처리  (0) 2023.01.31
[Spring] Model  (0) 2023.01.17
[Spring]MyBatis  (0) 2022.08.01