첫째. JUnit에서 refelction을 이용해서 TestCase/TestSuite의 test메소드를 가져옵니다.
이 리플렉션은 public메소드만 가져올 수 있으므로 기술적으로는 무조건 public이어야 하죠. 이는 기술적인 내용이구여;;
둘째. Test는 운영코드만큼(운영코드가 수정될때마다) 계속 수정되어야 합니다. 따라서 public으로 해놓는 것이
strategy와 template 두가지 방법 모두로 확장 가능합니다. 이는 지극히 개인적인 의견입니다. ^^
역시나 깊이 생각않고 떠오르는 것들을 적어보면 ( ^^ )
1) 관례, 일관성 : xUnit의 관례상 test method는 public... 리플렉션 기능이 없어 언어적으로
public method 외에는 접근할 수 없는 경우도 있을 듯
2) 사람이 보기 쉽게 : 프로그램이야 method visibility가 별 상관 없어도 사람은 이런 구분이 코드를 읽는 데 도
움이 되므로
3) 불필요한 security exception 문제를 피하려고 : 종종 VM 보안 설정이 까탈스럽게 되어 있는 경우도
있...
4) 직관적 : 너무나 당연히 public이어야 할 것 같...;;;
너무 궁한가요? ㅋㅋ
모두 활기찬 월요일 되세요.
On 5월30일, 오후4시06분, Toby Lee <tobyi...@gmail.com> wrote:
먼저 의미상으로 '테스트'라는 것을 생각해보면..
테스트는 실제 돌아가는 모듈이나 단위 기능들을 점검하여 잘 돌아가는지 이리저리(?) 확인 하기 위한 것이라고 알고 있는데요
만약에 실제로 운용중인 기능들을 모두 테스트 한다고 치면,
구지 테스트를 숨길 필요가 있을까..하는 생각이 듭니다.
테스트 작성자가 테스트를 숨겨놓았다면 아마도 그것은 테스트를 기피하는 부분 이겠거나
아니면 양심 없는 코드를 작성해 놓았기 때문에 테스트를 숨겨놓았을 것입니다.
이렇게 의미상으로 보면 테스트는 모두에게 공개되어야 한다는 의미에서 language측면에서도 public이어야 한다는 생각을 하
고 있구요.
두번째 접근은 리팩토링과 관련된 것입니다.
TDD방법에서는 테스트 코드를 먼저 만들고 실제 클래스를 생성해서 그안에 실제 메소드를 만들게 되죠.
대부분 클래스 안에 제일 처음 만들게 되는 메소드를 private으로 만들진 않는 것 같습니다..
처음부터 private으로 코드를 넣게 된다면 그분은 아마 대단한 실력가가 아닐까 생각합니다.
저는 대게 public으로 메소드를 만들고 필요에 따라서 extract method와 같은 리팩토링 기법을 사용해 중복되는 부분
이나 기능의 분할을 위해서 메소드를 private으로 빼는 습관이 있습니다.
리팩토링 된 private 메소드는 외부에서 직접 호출 하진 않죠(호출하는 방법도 있긴 하지만)
외부에서는 먼저 공개된 public메소드를 호출기준으로 삼고 클래스 내부에 있는 private메소드들는 자연스레 public 메
소드에서 사용 될테니까요. 만약에 클래스 내부에 private메소드가 심하게 있다고 치면 그 클래스는 단일책임원칙에 의해서 잘
설계된 클래스가 아니라고 생각됩니다. 이를테면 분할을 잘못한 구조이거나 procedure스타일로 짜여진 클래스일 가능성이 클
것 같습니다.
이렇듯 테스트는 테스트하기 편한 실제 코드를 좋아한다는 입장에서,
호출할 부분 즉, public메소드를 호출하는 입장에서 테스트 메소드가 private일 필요가 없다고 생각합니다.
이와 비교해서 테스트케이스 안에 메소드들이 public이어야 하는 점도 위와 비슷하게 생각을 해봅니다.
단위 테스트용 클래스들은 잘 분할된 실제 클래스를 테스트 하기 위한 메소드들이지
테스트 케이스안에 private 메소드들을 테스트하기 위한 것은 아닌 것 같습니다.
테스트케이스안에 private 메소드가 있다면 실제로 테스트안에서 리팩토링이 이루어졌다거나 아니면 중복되는 테스트를
private으로 뺐다는 가정이 있으므로, 이 관점에서 생각해 본다면 private 메소드는 테스트 대상이 될 수가 없는 것 같
습니다.
다음은 기술적인 관점입니다.
TestSuit류의 테스트를 하게 되면 한꺼번에 단위 테스트들를 묶어서 테스트하게 되겠죠. 이것도 위에서 설명한 것처럼 외부에
서 호출대상이 되는 부분은 공개 되어진 부분이지 숨어 있는 부분이 아니란 점입니다. 테스트가 숨어있다면 분명 공개된 테스트에서
이미 사용하고 있을 가능성이 크기 때문입니다.
생각나는대로 적으려다가.. 좀 더 생각하고 적었습니당;;;
(혹시 이와 관련된 내용도 토비님 책에 들어가나요? ^^;)
그냥 TestSuite 같은데서 실행되어야 하니까 public이 직관적이겠다 라는
JUnit은 스프링의 동반자, 스프링 사용자의 필수 도구이죠.
JUnit의 테스트 메소드는 모두 public이어야 합니다. 왜 JUnit 테스트 메소드는 public 이어야 한다고 생각하시나요?기술적인 복잡한 얘기는 아니니까, 편하게 각자 생각 또는 의견을 얘기해보세요.
--
매일 행복한 시간 되시길 바랍니다...^^
좋은 것 하나 또 배웁니다.
On 6월2일, 오후6시38분, Toby Lee <tobyi...@gmail.com> wrote:
> 평소에 그냥 원래 그러려니 하고 생각없이 사용하던 것도 한번쯤 왜 그렇게 했을까 의문을 가져보고 생각을 해보는 것은 좋은 습관인듯
> 합니다.
> 스프링도 그런 태도를 가지고 기존 기술에 대한 의문을 가지고 고민을 하면서 만들어진 것일테니까요.
>
> JUnit의 개발자들이 밝혔던 테스트 메소드가 public이어야 했던 이유가 있습니다. JUnit은 테스트 클래스의 테스트 메소드를
> 자바의 reflection api를 이용해서 호출을 해줍니다. Pluggable selector 패턴을 이용했기 때문에 그렇게 했죠.
> 그런데 JUnit이 처음 만들어지던 때 사용했던 JDK1.1에서는 리플렉션에서 public 메소드만 접근을 허용했습니다. 따라서
> JUnit의 테스트 메소드는 모두 public일 수 밖에 없었습니다. 그게 관례가 되서 지금까지 내려온 것입니다.
>
> 그런데 JDK1.2부터는 리플렉션에서 public외의 모든 접근레벨을 다 허용하기 시작했습니다. 그래서 심지어 private메소드도
> 호출하는 것도 가능해졌죠. 심지어 final 변수의 값도 수정이 가능합니다(JDK5이후에는 미리 선언된 상수값으로 final인 경우
> 코드레벨 최적화 때문에 안되기도 합니다).
>
> 어쨌든 JUnit은 전통을 유지해서 JUnit 4.x에서도 여전히 public 메소드만 테스트로 허용하고 있습니다.
>
> 2009/6/2 안미라 <aclimax....@gmail.com>
>
> > => 언제나 눈팅만 하는데도 참 많은것을 얻어가네요..
> > 동감입니다.
> > 근자에 Spring에 시간을 집중 투하하고 있는데요.
> > 언제쯤 여기에서 오가는 내용을 자~알 이해할 수 있을랑가 몰라도.
> > 용어를 접하는 것 만으로도 왠지 skill up이 되는 듯한 착각이 ㅋㅋ
>
> > 착각이라고 해도 참 좋네요 ㅎㅎ
>
> > 2009년 6월 2일 (화) 오후 3:06, 윤희한 <ryys1...@gmail.com>님의 말:
>
> >> 언제나 눈팅만 하는데도 참 많은것을 얻어가네요..
> >> 저도 공부 열심히 해서 참여하는 사람이 되어야겠어요~~
>
> >> 에효~~ 할게 너무 많지만 하나 하나 천천히 해보렵니다~~
>
> >> 2009년 6월 2일 (화) 오후 1:59, Chung Wan Park <chungwan.p...@gmail.com>님의 말:
>
> >> JUnit의 테스트 메소드가 public인 이유는 아마도 테스트 하고자 하는 모든 사람에게 열려 있다는 의미 정도 되지 않을까요?
> >>> JUnit의 테스트 메소드는 모두에게 오픈되어 모든 개발자들이 테스트 코드를 확인하고
> >>> 수행할 수 있도록 모든 사람에게 열려있다는 뭐 그런 의미에서 public으로 한 것이 아닐까
> >>> 생각되네요.
> >>> 프로젝트 수행 시 JUnit을 이용해서 많은 도움을 받았죠..
> >>> 프로젝트에 참여했던 사람들이 JUnit소스를 공유 및 보완을 하면서 많은 도움을 받았던 기억이...
> >>> JUnit의 테스트 코드는 모든 개발자가 공유해야 하는 의미에서 public이 아닐까요?
>
> >>> 2009년 5월 30일 (토) 오후 4:06, Toby Lee <tobyi...@gmail.com>님의 말: