윈폼용 유닛 테스트는 그리 낯설지 않지만, 문제는 ASP.NET의 경우입니다. 아래에선 제가 겪은 몇 가지 단점들 입니다. 일부 이슈에 대해서는 스트레스를 조금이나마 줄일 수 있는 팁을 적어 놓았습니다.
1. 속도
가장 먼저 유닛 테스트를 하게 되면 적잖게 당황하게 되는게, 속도 문제인데, 매우 느립니다. 대략 펜티엄4 3.0기가에서 테스트용 development server가 실행되고 테스트가 완료되는데 까지 거의 10초 이상이 걸립니다.
속도 정도야 애교죠. 유닛테스트가 보우하사 우리 코드를 지킬 수 있다면, 단 몇 초 여유롭게 기다리는게 코더의 노동보다 힘들까요?
2. 엑서서
두번째 문제는 엑서서입니다. 이클립스는 이 경우를 어떻게 해결했는지 잘 기억이 안나지만... (혹시 아시는 분은 리플을 달아주세요) VSTS(visual studio team system)의 유닛테스트는 클래스의 private, protected멤버 등을 접근하기 위해서 엑서서라는 클래스를 별도로 만듭니다. 테스트 프로젝트를 만들면 자동으로 생성되는 vscodegenaccessors.cs 파일이죠. 일반적으로 프라이빗과 프로텍티드 멤버를 외부에서 접근하지 못하는 것은 당연합니다. 아마 vsts에선 유닛테스트를 위해 별도의 편의?를 봐주지 않기 위해서 C#의 언어적 특성으로 이를 해결한 듯 합니다.
아무튼 이런 불편한 래핑 클래스인 엑서서의 등장으로, 프라이빗 메소드를 테스트 하려면 엑서서를 거쳐서 호출해야 합니다.
이 정도야 그냥 넘어갈 수 있다는 분!
만약에 테스트할 메소드의 signature가 수정되었다면 상황이 어떻게 될까요??
컴파일이 안됩니다.
그럼 어떻게 하나요 - 물론 엑서서는 vs에서 자동으로 만들어주긴 하지만, signature의 변경을 일일히 감지해서 알아서 척척 생성해 주지는 않습니다. 프로그래머는 메소드에서 오른쪽 버튼을 누른 후, create private accessor를 눌러서 엑서서가 자동으로 생성되게 해야 합니다.
3. 애트리븃
모든 테스트 메소드에는 아래와 같은 속성이 붙습니다.
[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("website", "/pms")]
[UrlToTest("http://localhost/pms")]
public void InsertTaskTest()
덕지덕지 붙은게 여간 지저분한게 아니죠.
여기서 한가지 팁이 있다면, AspNetDevelopmentServerHost에 웹사이트 경로를 써 줘야 테스트가 돌아가는데 msdn에는 첫번째 인자에 full path를 쓰라고 되어있습니다. 하지만 상대경로를 써도 잘 작동합니다. (기본 웹사이트 경로가 vs 디폴트로 되어 있을때 그렇습니다. 만약 다른 폴더라면 옵션에서 바꿔주면 됩니다.)
4. 디버깅
와! 드디어 ASP.NET의 유닛테스트가 $0인 JUnit에 무릎을 꿇을 때가 왔습니다. 속도, 엑서서, 애트리븃에 불편한 인터페이스까지는 다 봐줍시다. 하지만 ASP.NET 유닛테스트의 디버깅을 생각해보면 저는 정말 화가 납니다. 안그래도 버그가 튀어났는데, 디버깅까지 불편하면 얼마나 화가 날까요??
설마 자바스크립트를 alert()으로 디버깅 하는정도 일까요?? 다행이 그 정도는 아닙니다. 하지만 이걸로 디버깅을 해보면 반드시 디버깅 할 일 없이 완벽하게 짜야겠다는 생각이 듭니다.
잡설이 길었습니다. 왜냐하면 윈폼에서는 먹던 start selected test project with debugger버튼이 without debugger와 똑같은 반응을 보이거든요! 즉, 일반적인 방법으로는 디버깅이 되지 않는다는 말입니다.
그럼 어떻게 해야할까요?
제가 이 문제를 봉착했을 때 재밌는 걸 발견했는데,
System.Diagnostics.Debugger.Break()
라는 메소드 입니다. 이 메소드를, 'F9를 눌러 설정하던 그라데이션 입혀진 브레이크 포인트' 대신에 넣으면 됩니다. 그럼 without debugger로 실행했을 때, 저 메소드를 만나면 디버거 선택창이 뜹니다. 여기서 적절한 디버거를 선택해주면 됩니다.
물론 여러분이 기대하는 만큼 온전하게 작동하지는 않습니다.
참고:
How to: Debug while Running a Test in an ASP.NET Solution
http://msdn2.microsoft.com/en-us/library/ms243172.aspx#DebuggingOnCassini
'Programming > Web' 카테고리의 다른 글
| XPath로 HTML문서 접근하는 방법. (0) | 2007/08/13 |
|---|---|
| 비주얼 스튜디오로 자바스크립트 디버깅 하기 (0) | 2007/08/06 |
| ASP.NET 유닛 테스트의 해부학 (0) | 2007/08/01 |
| Ajax - 에이젝스? 아약스? 아작스?? (4) | 2007/07/30 |
| Resolve Relative URLS - URL 상대경로의 처리 (0) | 2007/07/30 |



