-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[5주차](박준영, 양재승, 임주민) #3
Comments
📚토비의 스프링 2장 테스트1️⃣ 왜 테스트를 해야하는가?시간이 흐를수록 애플리케이션은 쉴 틈 없이 변하고, 복잡해진다.
테스트는 객체지향과 더불어 스프링이 개발자에게 제공하는 가장 중요한 가치이다. 2️⃣ 테스트의 유용성여러 가지 기능을 구현하는 과정에서 기능이 잘 동작하는지 어떻게 확인해야 할까? 바로 테스트이다. 즉, 테스트는 개발자의 의도대로 코드가 정확히 작동하는지 확인하여, 확신을 주는 작업이다. 3️⃣ 웹을 통한 DAO(Data Access Object) 테스트 방법의 문제점보통 웹 프로그램에서 사용하는 DAO를 테스트하기 위해서, DAO, 서비스 계층, MVC 프레젠테이션 계층까지 포함한 모든 입출력 기능을 대충이라도 구현한다. 이러한 방법이 가장 흔한 방법이지만 "DAO에 대한" 테스트라고 말하기엔 너무 많은 외부 요인이 존재한다. 즉, 이런 방식의 테스트는 번거롭고, 오류가 발생했을 때 신속하고 정확하게 대응하기 여렵다는 문제점이 있다. 4️⃣ 작은 단위의 테스트"3. 웹을 통한 DAO(Data Access Object) 테스트 방법의 문제점"의 내용은 "DAO에 대한" 테스트틀 하고 싶었지만 이렇게 작은 단위에 대한 테스트를 단위 테스트(Unit Test)라고 한다. 5️⃣ 자동수행 테스트 코드매번 테스트를 할 때마다 개발자가 직접 값을 입력하고, 버튼을 클릭하고, 이 과정이 반복된다면 개발자에겐 거의 고문에 가까울 것이다. 가장 간단하게 테스트 할 수 있는 방법은 해당 자바 클레스의 main() 메서드를 실행하는 것이다. 번거롭게 입력할 필요도 없고, 서버를 띄우고, 브라우저를 열 불편함이 없다. 서비스 운영 중에 어떠한 기능에 변경이 불가피할 때, 이 변경이 서비스에 문제를 일으키지 않을까 하는 걱정은 당연하다. 하지만, 이전에 해당 기능에 대하여 만들어준 자동수행 테스트가 있다면, 더욱 빨리 변경된 코드에 대한 확신을 얻을 수 있다. 6️⃣ JUnit 테스트"5. 자동수행 테스트 코드"에서 언급한 main() 메서드로 만든 테스트는 가장 간단한 만큼 한계가 존재한다. 이미 자바에는 JUnit이라는 자바 테스팅 프레임워크가 존재한다. 이름 그대로 자바를 단위 테스트하는데 유용하다. JUnit을 사용하기 위해서는 먼저 main() 메서드에 있는 테스트 코드들을 일반 메소드로 옮겨야 한다. Scanner sc = new Scanner(System.in);
Something a = someFunction("same parameter");
Something b = someFunction("same parameter");
if (a.equals(b)) {
Sytem.out.print("일치");
} else {
Sytem.out.print("불일치");
} main() 메서드로 테스트를 한다면 위와 같은 코드의 형태였을 것이다. assertThat(a, is(b)); assertThat() 메서드는 첫 번째 파라미터의 값을 뒤에 나오는 매처(matcher)라는 조건으로 비교하여 일치하면 다음으로 넘어가고, 아니면 테스트를 실패하도록 한다. 가독성이 훨씬 뛰어나다. assert that, 무엇을 주장한다. 7️⃣ 실패하는 테스트
"테스트가 성공한다"하면 대부분은 구현한 기능이 정상적으로 작동한다라고만 생각한다. 하지만, 개발자는 실패하는 테스트도 작성해야한다. 개발자가 테스트를 만들 때 자주 하는 실수가 바로 성공하는 테스트만 만드는 것이다.
일반적으로 코드가 정상적으로 작동하는 경우를 상상하면서 테스트를 만들기 때문에 그렇다. 그래서 테스트를 만들 때, 실제로 발생할 수 있는 교묘한 상황을 잘 피해서 코드를 만든다.
스프링의 창시자인 로드 존슨은 "항상 네거티브 테스트를 먼저 만들라"라는 조언을 했다. 개발자는 한시라도 빨리 테스트를 성공하여 다음 기능으로 나아가고 싶기 때문에, @Test(expected = IllegalArgumentException.class)
public void failureTest() throws Exception{
//
// test code
//
} 위 코드는 failureTest() 메서드가 실행됐을 때, @Test
public void failureTest() throws Exception{
assertThrows(IllegalArgument.class,() -> {
//test code
});
} 또 다른 방법으로 assertThrows() 메서드를 사용하는 방법이 있다. 위 코드는 failureTest() 메서드가 실행됐을 때, 해당 테스트 코드 실행시 8️⃣ 테스트 주도 개발(TDD)일반적으로 기능을 구현한다면 먼저 코드를 작성한 후에 작성된 코드를 검증하기 위해 테스트를 만드는 순서로 개발이 진행된다. 반대로 만들고자 하는 기능의 내용을 담고 있ㅇ면서 9️⃣ 테스트 코드 개선public class someTest{
@Test
public someTest1() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Something something = context.getBean("something", Somethig.class);
/// test code 1
}
@Test
public someTest2() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Something something = context.getBean("something", Somethig.class);
/// test code 2
}
@Test
public someTest3() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Something something = context.getBean("something", Somethig.class);
/// test code 3
}
} 위 코드를 보면 무엇인가 냄새가 나지 않는가? 바로 중복되는 코드가 존재한다는 것이다. 중복된 코드는 별도의 메서드로 추출하는 것이 가장 간단한 방법이다. 하지만, 일반적인 메서드 추출 방식이 아닌 JUnit이 제공하는 기능을 활용해보자. public class someTest{
private Something something;
@Before
public void init(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
something = context.getBean("something", Somethig.class);
}
@Test
public someTest1() {
/// test code 1
}
@Test
public someTest2() {
/// test code 2
}
@Test
public someTest3() {
/// test code 3
}
} 중복된 코드를 init()이라는 메서드에 넣는다. 그리고 🔟 JUnit 진행 과정JUnit 프레임워크가 테스트 메서드를 실행하는 과정을 알아보자. 그전에 프레임워크가 무엇인지 알아야한다. 프레임워크는 스스로 제어권을 갖고 주도적으로 동작하고, 개발자가 만든 코드는 프레임워크에 의해 수동적으로 실행된다. JUnit이 하나의 테스트 클래스를 가져와 테스트를 수행하는 방식은 다음과 같다.
|
토비의 스프링 정리Chapter 1. 오브젝트와 의존관계
|
📜 Notion📖 3장 템플릿[템플릿]바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법 스프링에 적용된 템플릿 기법, 완성도 있는 DAO 코드를 만드는 방법
|
The text was updated successfully, but these errors were encountered: