테스트의 중요성
1.소프트웨어 품질(오류 없는 제품)
→전문테스터(QA)가 소프트웨어의 품질을 결정짓는다.
단위테스트 : 함수테스트(VO, Mapper, Service)
통합테스트 : 컨트롤러테스트
시스템테스트 : 부하테스트
인수테스트 : 요구사항분석에 있는 인수 테스트
단위테스트 : 해당 클래스의 함수를 테스트하는 것
1.VO 테스트
2.커넥션 풀(data source) 테스트
3.DB연결 테스트
웹서버가 http프로토콜을 담당.
현업에서 제우스를 많이 사용하고 있음
톰캣사용
Junit : 단위테스트를 도와주는 도구
Junit = 이클립스 = 에릭 감마(제작)
Junit은 톰캣을 돌리지 않는다.(Test이기 때문)
[UserVO.java]
package edu.global.ex.vo;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserVO {
private String username;
private String password;
private int enabled;
private List<AuthVO> authList;
}
--------------------------------------------------------------------------
[UserVOTest.java]
package edu.global.ex.vo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
class UserVOTest {
@Test // Junit이 제공하는 기본적인 어노테이션
void userVOtest() {
UserVO vo = new UserVO();
log.info("객체 생성" + vo);
vo.setPassword("1234");
vo.setUsername("홍길동");
System.out.println(vo);
// 주소가 아닌 값이 나왔기에 toString 적용을 확인할 수 있다.
// UserVO(username=null, password=null, enabled=0, authList=null)
assertNotNull(vo); // NotNull이면 초록창을 띄워라
assertEquals(vo.getUsername(),"홍길동"); //
}
}
[DataSourceTest.java]
package edu.global.ex.vo;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
class DataSourceTest {
@Autowired
private DataSource datasource;
@Test // Junit이 제공하는 기본적인 어노테이션
void dataSourcetest() {
System.out.println(datasource);
assertNotNull(datasource);
}
}
HikariDataSource(null)이 출력되는 이유
→Hikari Connection Pool 사용
[UserMapperTest.java]
package edu.global.ex.mapper;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import edu.global.ex.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest // 모든 빈(객체)들을 스캔하고 어플리케이션 context(Junit)를 생성하여 테스트를 실행한다.
//IOC Container 이름 : WebApplicationcontext
//톰캣의 context를 사용하지 않음
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Autowired
private PasswordEncoder passwordEncoder;
// 하기를 테스트 testInsertUser
// UserMapper.java의 @Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_USER')")
// public void insertAuthorities(UserVO UserVO);
@Disabled // 테스트하지 말라는 뜻
@Test
void testInsertUser() {
UserVO user = new UserVO();
user.setUsername("kim5");
user.setPassword(passwordEncoder.encode("1234"));
user.setEnabled(1);
userMapper.insertUser(user);
userMapper.insertAuthorities(user);
}
// 하기를 테스트 testInsertAdmin
// @Insert("insert into AUTHORITIES (username,AUTHORITY) values(#{username},'ROLE_ADMIN')")
// public void insertAdminAuthorities(UserVO UserVO);
@Disabled
@Test
void testInsertAdmin() {
UserVO user = new UserVO();
user.setUsername("admin4");
user.setPassword(passwordEncoder.encode("1234"));
user.setEnabled(1);
userMapper.insertUser(user);
userMapper.insertAdminAuthorities(user);
}
@Test
void testInsertAdmin2() {
UserVO user = new UserVO();
user.setUsername("admin5");
user.setPassword(passwordEncoder.encode("admin5"));
user.setEnabled(1);
userMapper.insertUser(user);
userMapper.insertAdminAuthorities(user);
}
}
[UserService.java]
package edu.global.ex.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.global.ex.mapper.UserMapper;
import edu.global.ex.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public int addUser(UserVO user) {
log.info("addUser()..");
return userMapper.insertUser(user);
}
}
--------------------------------------------------------------------------
package edu.global.ex.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import edu.global.ex.mapper.UserMapper;
import edu.global.ex.vo.UserVO;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void addUserTest() {
UserVO vo = new UserVO();
log.info("객체 생성" + vo);
vo.setUsername("홍길동2");
vo.setPassword("1234");
System.out.println(vo);
assertNotNull(vo); // NotNull이면 초록창을 띄워라
assertEquals(vo.getUsername(), "홍길동2");
userService.addUser(vo);
}
}
Mock Test : 웹브라우저
[HomeController.java]
package edu.global.ex.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
@GetMapping("/user/userHome")
public void userHome() { // void는 return값이 없지만, userHome.jsp를 리턴함
log.info("userHome ...");
}
//상기 userHome함수는 하기와 동일한 의미이다.
// @GetMapping("/user/userHome")
// public String userHome() {
// log.info("userHome ...");
// return "user/userHome";
// }
@GetMapping("/admin/adminHome")
public void adminHome() {
log.info("adminHome ...");
}
}
--------------------------------------------------------------------------
[HomeControllerTest.java]