오랜만에 포스팅하네요. 근래 Play만 가지고 작업하다 보니 이번에도 Play에 대한 내용입니다. 

오늘 팀원들과 코드리뷰를 진행하다가 Test code에 대한 좋은 팁을 하나 알게되어 공유할겸 정리합니다. 


Play를 쓰면서 ORM을 안 쓴다는건 말도 안됩니다. 당연히 써야 합니다. ORM을 쓰면 자연스레 Model에 많은 로직이 들어가니 Model을 VO나 DTO 처럼 취급해서는 절대 안되죠. 저희도 현재 ORM을 쓰기 때문에 Model에 대한 Test code는 필수로 작성하는게 개발표준입니다. 그런데 여기서 문제가 하나 생기는게 Play 문서나 샘플에 나와있는 테스트 코드가 너무 지저분 합니다. 직접 보시죠.

@Test
public void findById() {
  running(fakeApplication(), new Runnable() {
    public void run() {
      Computer macintosh = Computer.find.byId(21l);
      assertThat(macintosh.name).isEqualTo("Macintosh");
      assertThat(formatted(macintosh.introduced)).isEqualTo("1984-01-24");
    }
  });
}

출처: http://www.playframework.org/documentation/2.0.2/JavaTest

 

딱 봐도 테스트 코드 짜고 싶지 않게 생겼네요. 이걸 어떻게 하면 간결하게 작성할 수 있을까 고민하다가 미뤄 뒀는데 오늘 팀원 한명이 좋은 방법을 찾아서 공유해 줬습니다.


먼저 Model이 상속할 ModelTest 클래스를 다음과 같이 만듭니다.

public class ModelTest {

  protected static FakeApplication app;


  @Before

  public void startApp() {

    app = Helpers.fakeApplication(Helpers.inMemoryDatabase()); 

  Helpers.start(app);

  }

  @After

    public void stopApp() {

    Helpers.stop(app);

  }

}


그러고 나서 각 Model에서는 이 ModelTest를 상속하고 아래와 같이 테스트 코드를 작성하면 됩니다.

public class SponsorTest extends ModelTest {

@Test

public void create() {

  // Given

  // When

  // Then 

}


처음 봤던 코드에 비해 정말 깔끔합니다. 일반 JUnit 코드와 거의 차이가 없지만 실제로는 Play 컨테이너 내부에서 실행되는 것과 동일하게 동작합니다. 이제 Controller에 대한 것만 좀 더 찾아봐야겠네요.


참고자료.

http://blog.matthieuguillermin.fr/2012/03/unit-testing-tricks-for-play-2-0-and-ebean/



저작자 표시 비영리 변경 금지