본문 바로가기

개발일지/TIL

[230726] [클론] Lifegram 테스트 코드 작성 (2)

테스트 코드 해보니?

💬 무작정 작성해 보았던 테스트 코드에서 많은 것을 배울 수 있었다. 내가 알지 못했던 버그를 발견해 수정을 할 수 있었다. 필요 없던 코드들을 발견할 수 있었다. 코드를 조금 더 나은 구조로 변경할 수 있었다.

 

✔ 알지 못했던 버그

💬 Postman 같은 API 테스트 툴을 사용해 통과하는 경우 제대로 코드를 작성했다고 생각했다. 그런데 이번 테스트 코드를 작성하다가 잘못된 코드가 있다는 것을 발견하게 되었다. 잘못된 코드를 수정해 버그를 예방할 수 있었다.

 

// 수정 전
if (!StringUtils.hasText(jwt)) {
    request.setAttribute("unauthorization", "401 인증키 없음.");
} else if(JwtUtils.validateToken(jwt)) {
    request.setAttribute("unauthorization", "401-001 인증키 유효하지 않음.");
}

// 문제 코드 수정
JwtUtils.validateToken(jwt) -> !JwtUtils.validateToken(jwt)

 

✔ 필요 없던 코드

💬 Lombok을 사용해 Getter, Constructor 등을 어노테이션을 통해 아무 생각 없이 적용해 보는 것이 아닌가 싶다. 테스트 코드를 작성하다 보니 필요 없는 Getter가 많이 쓰이는 것이 많이 보였다. 그래서 필요 없는 어노테이션을 삭제했다.

 

@Getter
@Entity
public class Like {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private Post post;

}

// 코드 커버리지를 채우다보니 필요 없는 코드 확인
@Getter 삭제

 

✔ 코드를 조금 더 나은 구조로 변경

💬 생성자를 사용해서 Entity를 생성하는 코드가 있었다. 테스트 코드를 작성하다 보니 다른 매개변수가 필요한 경우 생성자가 다양하게 만들어져야 한다는 것을 알았다. 그래서 Builder를 사용해 다양한 생성자 없이 다양한 객체를 만들 수 있도록 변경했다. 

 

@Entity
@NoArgsConstructor
@Getter
public class Post extends BaseTime {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String image_url;

    @Column(length = 2200, nullable = false)
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE)
    private List<Comment> comments = new ArrayList<>();

    @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE)
    private List<Like> likes = new ArrayList<>();

    public Post(String image_url, String content, User user) {
        this.image_url = image_url;
        this.content = content;
        this.user = user;
    }

    public void updateContent(String content) {
        this.content = content;
    }
}

// 생성자 삭제 
public Post(String image_url, String content, User user) {
    this.image_url = image_url;
    this.content = content;
    this.user = user;
}

// Builder 적용
@Builder
@Getter
public class Post extends BaseTime {}

개발 함께하는 테스트 코드

이렇게 작성을 하면서 좋은 점들을 느껴보니 테스트 코드는 개발을 할 때 동시에 진행이 되어야 하는 것 같다. 내가 미처 알지 못했던 버그를 예방할 수 있으며, 더 좋은 구조를 구성할 수 있는 것 같다. 이것 이외에도 더 많은 이점들을 누릴 수 있을 것이다. 그래서 앞으로는 테스트 코드를 짜는 것을 게을리하지 않아야겠다.