이클립스 3.4, JUnit4 버전을 이용해서 테스팅 하는 것을 알아보겠다.
먼저 간단히 계산기 프로그램을 만들어보고(매우간단한…)
계산기능들을 테스트할 프로그램을 Junit을 이용하여 만들 것이다.
또한, 여러 테스트 프로그램을 묶어서 테스트 해보는 것도 해볼 것이다. <- 다른 페이지로 링크
먼저 테스트할만한 프로그램을 하나 간단히 만들어보자.
먼저 위와 같이 KoroCalculator라는 패키지 안에 Calculator.java라는 파일을 만들었다.
이것을 Junit을 사용하여 테스팅 하기 전에
앞으로 테스팅할 소스는 따로 src폴더가 아닌 test라는 폴더에 따로 저장해주기 위해 폴더를 생성한다.
그냥 Calculator.java가 있는 패키지에 넣어도 되고, 그냥 다른 패키지에 넣어도 되지만
이렇게 src폴더가 아닌 test폴더에 같은 이름의 패키지를 생성해서 만들면
아예 소스와 테스트소스가 분리되기도 하고, 가독성도 좋고, 같은 패키지로 인식해서
private이 아닌 변수들을 참고할 수도 있다.
위와 같은 방법으로 해당 프로젝트에서 마우스 우클릭후 source folder 생성을 해주고 test이름을 쓰면 된다.
이렇게 KoroCalculator라고 위 소스와 같은 패키지 이름까지 설정한 다음에
패키지에서 마우스 우클릭 후 Junit Test Case를 만들어준다.
Class under test에서 Browse를 눌러주고
이름 쓰는 곳에 calculator를 다 쓰든, 아니면 중간 정도만 쳐도 해당되는 클래스가 나오므로 그것을 선택한다.
(바로 테스트할 것을 선택하는 것)
Junit 3을 쓸건지 JUnit4를 쓸건지 물어보는데 3과 4버전이 사용하는 방법이 좀 바뀌었다고 한다.
필자는 4버전을 이용해서 했으므로 4를 클릭했다.
Name에는 어떤 것을 써도 되지만, 가독성을 위해 CalculatorTest라고 써준다.
그리고 next를 누르면
이 화면에서 테스트할 메소드를 선택해주고 finish를 누르면 된다.
(multiply는 글의 후반부에 다른 테스트 프로그램으로 만들어보고 나중에 한꺼번에 돌리는 것을 해보겠다.
-> 링크글로 엮었음)
그러면 finish가 안되고 JUnit4가 build path에 없다고 나온다.
이클립스에서는 여기서 OK를 누르면 자동으로 그 프로젝트의 build path에 Junit을 넣어준다.
그러면 이렇게 CalculatorTest.java가 만들어진다.
실제로 해당 method들을 테스트 해주기 위해서 코드를 수정해보자.
위와 같이 수정하였다.
assertTrue라는 구문은 org.junit.Assert밑에 있는 것으로
그 안의 조건이 true이면 그냥 테스트를 통과하고, false이면 false를 알려주고, 그 method에 대한 테스트를 멈추는 것이다.
위의 예에서 testMinus method에서
assertTrue(cal.minus(5, 2) == 4);
assertTrue(cal.minus(8, 4) == 4);
이렇게 두줄이 있다면 위의 줄(5-2)에서 테스트 실패를 알려주고 밑의 8-4에 대한 테스트는 하지 않는다.
(위에서처럼 이클립스를 이용하여 자동으로 만들었다면 static으로 import되어 있기에 Assert.assertTrue이러지 않고
그냥 assertTrue라고 써도 사용이 된다.)
assertTrue구문 외에
assertFalse, assertEquals, assertNull, assertNotNull, 등이 있다.
해당 소스에서 마우스 오른쪽 버튼을 누르고 Run as - Junit Test를 누르면 테스트가 진행된다.
그러면 위와 같이 테스트 결과가 나오게 된다.
총 3개의 테스트를 했고(testPlus, testMinus, testDivide)
1개의 failures가 나왔다는 것이다.
보면 testDivide에서 테스트 실패를 했다고 나온다. failure trace 화면에서 해당 실패결과를 더블클릭 하면
이런 화면이 나온다.
두개의 assertTrue문 중에서 아래 것이 실패한 것으로
실제 구현을 그냥 단순히 int값을 나누는 것으로 해놓았기 때문에
cal.divide(10, 4)는 2가 나오므로 뒤의 2.5와 달라서 테스트를 통과하지 못한 것이 되겠다.
그래서 이렇게 간단히 calculate.java에서 divide method에 대한 수정을 해보았다.
그리고 나서 다시 테스트를 돌리면
이렇게 모든 테스트가 통과되었다고 나오게 된다!
나중에 테스트할 것들이 많아지고 복잡해지고 했을 때,
하나의 testMethod만 수행하고 싶을 때가 있고,
어떤 testMethod는 빼고 수행해보고 싶을 때가 있다.
그럴 때는
이렇게 하면 된다. (<- 여기 클릭하면 바로 페이지 넘어갑니다)
또한, 테스트 프로그램을 몇 개 만들어 놓았는데
그 테스트 프로그램을 동시에 돌려보고도 싶을 때가 있다.
간단한 예를 위해서 위에서 CalculatorTest.java는 Calculator의 method 중에서 plus, minus, divide를 test했는데
CalculatorTest2.java는 Calculator의 multiply method를 test하기 위해서 만들었다고 해보자.
그러면 위의 CalculatorTest.java와 CalculatorTest2.java를 동시에 테스트 하고 싶을 때가 있을 것이다.
그럴 때는
이렇게 하면 된다. (<- 여기 클릭하면 바로 페이지 넘어갑니다)
이렇게 JUnit4와 Eclipse를 이용하여 테스팅 환경을 구축해보았다.
그냥 테스트할 클래스들한테 일일이 main method만들고 system.out.println()으로 변수값 찍어가면서
테스팅 할 수도 있겠지만, 이렇게 함으로 인해서
보다 단위적인 테스트를 하는데 편하고, 필요없는 main method를 그 때 그 때 만들었다 지웠다가 안해도 되므로
버젼관리 하는데도 용이하고
체계적으로 테스팅 환경을 갖출 수 있다…..
고 하는데, 아직 많이 사용해보지는 않아서 모르겠다.(이제 막 사용을 시작했기 때문에...)
쭉 써보면 편리한 것을 많이 느낄지도?