Test

서린·2024년 3월 12일

혼자개발

목록 보기
67/82

스프링부트3 자바 백앤드 개발 입문 - 길벗

포트폴리오 작성할 때 일부 코드를 JUnit test했는데,
책을 읽다보니 좀더 체계적인 test 과정이 있어서 정리한다

테스트란?

  • 프로그램의 품질을 검증하는 것
  • 의도대로 프로그램이 잘 동작하는지 확인하는 과정
  • 테스트 코드를 작성해(테스트 도구로 활용) 반복적인 검증 절차를 자동화할 수 있다

테스트 코드의 순서
1. 예상 데이터 작성하기
2. 실제 데이터 작성하기
3. 예상 데이터와 실제 데이터 비교해 검증하기
테스트를 통과하며 지속적인 리팩터링으로 코드를 개선하고
테스트를 통과하지 못하면 디버깅을 통해 잘못된 부분을 찾아 고쳐야한다

테스트는 성공할 경우 뿐만 아니라 실패할 경우도 고려해야한다
또 성공1, 성공2, 실패1, 실패2 .. 이렇게 다양한 상황을 예상해 세부적으로 작성해야한다

테스트를 통한 코드 검증과 리팩터링은 개발자의 기본 소양

TDD(Test Driven Development, 테스트 주도 개발)
일단 테스트 코드를 만든 후 이를 통과하는 최소한의 코드부터 시작해 점진적으로 코드를 개선, 확장해 나가는 개발방식

@SpringBootTest : 해당 클래스를 스프링 부트와 연동해 통합 테스트를 수행하겠다 선언

index() 테스트

예시 클래스 ArticleBO.java

public List<Article> index() {
	return articleRepository.findAll();
}

test code

ArticleBOTest.java

@SpringBootTest
class ArticleBOTest {
	@Autowired
    ArticleBO articleBO;
    
    @Test
    void index() {
    // 예상 데이터: 객체로 저장
    Article a = new Article(1, "가가가", "111");
    Article b = new Article(2, "나나나", "222");
    Article c = new Article(3, "다다다", "333");
    List<Article> expected = new ArrayList<Article>(Arrays.asList(a, b, c)); //abc 합치기
    
    // 실제 데이터: index메소드 호출해 결과를 list타입의 articles에 받아온다
    List<Article> articles = articleBO.index(); // 모든 게시글을 조회 요청하고 그 결과로 반환되는 게시글 list를 받아온다
    
    // 비교 및 검증
    assertEquals(expected.toString(), articles.toString());
    }
}

Arrays.asList() 메소드

  • 입력된 배열 또는 2개 이상의 동일한 타입 데이터를 정적 리스트로 만들어 반환
  • 정적 리스트는 고정 크기라서 add()나 remove() 메소드를 사용할 수 없다, 만약 사용하려면 정적리스트를 일반 리스트로 새로 만들어야 한다 List<String> list = new ArrayList<>(listA);

assertEquals(x. y) 메소드

  • JUnit에서 제공
  • 예상데이터 x와 실제 데이터 y를 비교해 일치하면 테스트를 통과시킨다

show() 조회 테스트

예시 클래스 ArticleBO.java

public Article show(int id) {
	return articleRepository.findById(id).orElse(null);
}

test code

ArticleBOTest.java

@SpringBootTest
class ArticleBOTest {
	@Autowired
    ArticleBO articleBO;
    
    @Test
    void show_성공_존재하는_id_입력() {
    // 예상 데이터: id가 1인 게시물의 조회를 요청했다고 가정
    int id = 1;
    Article expected = new Article(id, "가가가", "111");
    
    // 실제 데이터: show()메소드 호출해서 얻은 결과를 article 객체에 저장
    Article article = articleBO.show(id);
    
    // 비교 및 검증
    assertEquals(expected.toString(), articles.toString());
    }
    
    @Test
    void show_실패_존재하지않는_id_입력() {
    // 예상 데이터: 존재하지 않는 id를 조회한다고 가정, db에서 조회되는 내용이 없어 null반환할 것
    int id = -1;
    Article expected = null;
    
    // 실제 데이터: show()메소드 호출해서 얻은 결과를 article 객체에 저장
    Article article = articleBO.show(id);
    
    // 비교 및 검증
    assertEquals(expected, article);
    }
}

create() 게시글 생성 테스트

예시 클래스 ArticleBO.java

public Article show(ArticleForm dto) {
	Article article = dto.toEntity(0;
    if (article.getId() != null) {
    	return null;
    }
    return articleRepository.save(article);
}

test code

ArticleBOTest.java

@SpringBootTest
class ArticleBOTest {
	@Autowired
    ArticleBO articleBO;
    
    @Test
    void create_성공_title과content만있는_dto_입력() {
    // 예상 데이터: 사용자가 새 게시물을 생성한 상황 가정
    String title = "라라라"; // id는 db에서 자동으로 생성
    String content = "444";
    ArtivleForm dto = new ArticleForm(null, title, content);
    Article expected = new Article(4, title, content);
    
    // 실제 데이터: create(dto)메소드 호출해서 얻은 결과를 article 객체에 저장
    Article article = articleBO.create(dto);
    
    // 비교 및 검증
    assertEquals(expected.toString(), articles.toString());
    }
    
    @Test
    void show_실패_id가포함된_dto_입력() {
    // 예상 데이터: id써 줄 필요 없는데 id 입력한 상황 가정
    int id = 4;
    String title = "라라라";
    String content = "444";
    ArtivleForm dto = new ArticleForm(id, title, content);
    Article expected = null;
    
    // 실제 데이터: create(dto)메소드 호출해서 얻은 결과를 article 객체에 저장
    Article article = articleBO.create(dto);
    
    // 비교 및 검증
    assertEquals(expected, article);
    }
}

혼자 테스트 진행 할 때는 학원에서 배운 내용을 토대로 따라하는 방식이었는데,
실제 데이터랑 예상 데이터를 판단해서 작성해보니까
테스트의 순서랑 성공시, 실패시 설정해야하는 조건 부분에서 이해가 좀 더 되었다

0개의 댓글