1. 회원 기능 테스트
테스트 내용
-회원가입기능이 작동해야 한다.
-회원가입할 때 같은 이름이 있으면 예외가 발생해야 한다.
테스트케이스
1.MemberService 클래스에서
a.하기 MemberService에서 ctrl + shift + t < create test < ok를 한다.
public MemberService {
......
}
b. public void 회원가입( ) throws Exception{
//given(이렇게 주어졌을 때)
//when(이렇게 하면)
//then(이렇게 된다)
}
public void 회원_중복_예외() throws Exception{
//given
//when
//then
}
테스트 범위
-정말 순수한 단위테스트 보다 jpa가 메모리모드로 실제 디비까지 돌아가는 것을 보기 위해
완전히 스프링과 integration해서 테스트를 할 것이다.
그래서 하기 두가지를 세팅할 것이다.
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional 데이터를 변경해야 하기 때문에 하는 설정,
public class MemberServiceTest {
//테스트라 참조해서 테스트할 것이 없기 때문에 하기처럼 작성
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
}
////alt + enter를 누르고 suppress인가를 누르니 memberRepository가 보라색으로 변경됨
*@Transanctional
-데이터를 변경해야 하기 때문에 하는 설정
-같은 Transaction안에서 같은 엔티티에서 id값(pk)이 같으면 같은 영속성 컨텍스트에서
똑같은 값이 관리가 된다.
-Transactional이 있어야 롤백이 가능하다.
-insert SQL이 DB에 날라가지 않는다. 영속성 컨텍스트가 flush가 되지 않는다.
참고: 테스트 케이스 작성
Given, When, Then (http://martinfowler.com/bliki/GivenWhenThen.html) >
필수는 아니지만 위에 것을 기본으로 해서 다양하게 응용하는 것을 권장한다고 한다.
*축약어를 통해 코드구문생성하기
설정경로
- File->Setting->Editer->Live Templates -> tdd 단축단어 생성 -> tdd
내용설정
@Test
public void () throws Exception {
//given
//when
//then
}
=> tdd를 사용하면 위에 구문이 자동생성된다.
@Rollback(false)
-Transacntional을 롤백이 기본적으로 되므로 직접 눈으로 확인하고 싶고
DB에 값이 들어가는 것을 확인하고 싶을 때에는
@Rollback(false)를 public void 회원가입() throws Exception 에 적용하자.
-데이터베이스 트랜잭션이 커밋을 하는 순간 flush가 되면서
jpa 영속성 컨텍스트가 있는 member객체가 insert문이 만들어지면서 DB insert가 나가게 된다.
사진
em.flush();
assertEquals(member, memberRepository.findOne(savedId));
-insert문이 db로 가는 것을 실행시킬 때 눈으로 볼 수 있고,
transaction은 rollback 되도록 하는 설정
try catch return
-중복회원 및 회원가입을 다시 테스트
*데이터베이스에 앞서 insert를 DB로 날려 값(PRIMARY KEY)이 생성 되었다면
실행시 중복회원에서 에러가 발생하니 조심할 것
사진
회원 기능 테스트 완료
2. 회원기능테스트 기술적 정리
a.RunWith(SpringRunner.class)
-jUnit 실행할 때 스프링이랑 엮어서 실행을 하겠다.
@SpringBootTest
-스프링부트위에서 테스트를 하려면 꼭 필요하다.
-@Autowired 실행이 실패한다.
-컨테이너 안에서 테스트를 한다.
b.@Transactional
-테스트가 끝나면 Rollback을 한다.
-서비스클래스나 레포지터리에 붙여서 돌리면 Rollback하지 않는다.
c. tdd 단축키 만들어서 테스트구문 생성하기
d. 테스트를 완전 격리된 환경에서 하는 방법
-실제 외부에 있는 데이터베이스를 사용했다.
-디비를 외부에 설치해서 테스트해야 할 경우가 생긴다. 테스트가 끝나고
데이터가 초기화 되는 것이 좋다.
-테스트를 완전 격리된 환경에서 하는 방법이 있다.
-자바안에 데이터베이스를 만들어 테스트 하는 방법이 있는데,
메모리 데이터베이스를 사용하는 방법이다. 안에 않고 가상의 데이터베이스를 만들어서
스프링부트를 사용하면 이러한 방법을 무료로 이용할 수 있다.
종류
1. main
- 실제 개발하는 운영소스 (java, resouces)
-기본적으로 운영로직은 java, resources가 운영권을 가진다.
2. test
-테스트하는 운영소스 (java, resources:directory resources생성해주어야 함)
-테스트 운영로직의 우선권은 test안에 java, resources가 우선권을 가진다.
-application.yml을 java->resource로부터 가져온다면 application.yml이 우선권을 가져
main에 있는 application.yml은 무시되고 test안에 있는 application.yml이 실행된다.
(application.yml 복사 test->resources(directory)->application.yml(복사 from main:java)
JVM내에서 실행 및 메모리모드로 데이터베이스실행 테스트
-jvm 안에서 실행되고 memory모드로 데이터베이스를 띄워주기 위해
application.yml에 sping의 url을 인메모리 url로 바꾸어 준다.
주소는 h2.database->cheat sheet->In-Memory->첫번째 라인
사진 h2.database 사이트
사진
*하지만, spring, jpa 설정 내용이 전혀 없고 logging,level 설정 내용만으로도
스프링부트의 기능으로 인해 인메모리 모드로 실행이 된다.
극단적으로 얘기해서 내용이 전혀 없어도 인메모리 모드로 실행이 된다.
'신입개발자로 취업하기까지 > JPA쇼핑몰기능구축' 카테고리의 다른 글
20200602 웹계층 개발_회원등록 (0) | 2020.07.10 |
---|---|
20200601 웹계층개발_홈화면 레이아웃 (0) | 2020.07.09 |
20200529 회원도메인개발_회원서비스 (0) | 2020.06.23 |
20200528 회원도메인개발 (0) | 2020.06.22 |
20200528 애플리케이션 아키텍처 (0) | 2020.06.22 |