TDD - Test Driven Development CSharp

원문 : http://msdn.microsoft.com/ko-kr/magazine/cc135981.aspx

고급 단위 테스트, 개체 머킹, 응용 프로그램 프로파일링 및 기타 정보
James Avery



고급 단위 테스트
비주류 기술이었던 단위 테스트는 시간이 지나면서 서서히 여러 Microsoft® .NET Framework 프로젝트에서 표준 기술로 자리 잡았습니다. .NET 개발자라면 .NET에 널리 사용되는 단위 테스트 프레임워크인 nUnit을 작업에 사용해 본 경험이 있을 것입니다. nUnit만으로도 .NET 응용 프로그램에서 단위 테스트가 요구되는 대부분의 시나리오를 해결할 수 있지만 MbUnit 2.4를 사용하면 단위 테스트 수준을 한 단계 높일 수 있습니다. MbUnit은 Jonathan "Peli" de Halleux(이후 Microsoft Research로 옮김)가 시작하여 현재는 Andy Stopford가 우수한 개발자로 이루어진 팀과 함께 이끌어가고 있는 공개 소스 단위 테스트 프레임워크입니다.
처음에 MbUnit는 설정 및 종료 특성을 제공하는 테스트 기능, 친숙한 테스트 특성, 여러 가지 어설션, 콘솔 테스트 러너, 사용이 간편한 창 테스트 러너 등 대부분의 xUnit 테스트 프레임워크에 포함된 기능들로 구성되었습니다. 그러나 몇 가지 편리하고 혁신적인 기능이 추가되면서 MbUnit은 다른 단위 테스트 프레임워크와 차별화되기 시작했습니다.
그 중 Row 테스트는 단위 테스트에 매개 변수를 전달할 수 있는 기능입니다. 살펴볼 시나리오마다 별도의 테스트를 작성하는 대신 매개 변수를 사용한 테스트를 하나 작성한 후 편리한 특성을 사용하여 데이터를 전달하는 것입니다. 예를 들어 서적 제목과 ISBN 번호를 받아 재고가 있는지 확인하는 메서드가 있다고 가정해 보겠습니다. 이때 재고가 있는 서적, 재고가 없는 서적 및 데이터베이스에 없는 서적별로 서로 다른 테스트를 작성하는 대신 서적 제목과 ISBN 번호를 매개 변수로 받는 테스트 메서드를 하나만 작성할 수 있습니다. 그런 다음 Row 특성을 사용하여 각 시나리오에 해당하는 세 가지 값 집합과 예상 결과를 지정할 수 있습니다. 이렇게 하면 테스트를 위해 작성해야 할 코드를 줄일 수 있을 뿐만 아니라 이후에 테스트 결과를 확인하고 관리하기가 더 용이합니다.
이와 유사한 기능으로 팩터리를 사용하여 단위 테스트에 데이터를 공급하는 Pair-wise 테스트가 있습니다. 팩터리를 사용하면 매우 많은 수의 데이터 시나리오를 적은 양의 코드로 쉽게 테스트할 수 있습니다. 위의 예에서 수백, 수천 개의 서적과 ISBN 번호를 반환하는 팩터리를 만들 수 있습니다. 또한 MbUnit은 테스트 데이터에서 이전 조합을 기준으로 불필요한 조합을 제거해 줍니다.
MbUnit에는 여러 가지 성능 지향 테스트 특성도 포함되어 있습니다. 그 중 Duration 특성은 실행할 테스트에 소요되는 시간을 확인하는 데 사용됩니다. MbUnit은 PerfCounter 특성을 사용하여 성능 카운터의 값을 기준으로 어설션을 읽고 생성하는 테스트를 작성하는 기능도 제공합니다.
마지막으로 MbUnit에는 Rollback 특성이라는 유용한 기능도 포함되어 있습니다. 이 특성은 테스트를 트랜잭션에 래핑한 다음 테스트가 완료되면 해당 트랜잭션을 롤백합니다. 따라서 데이터베이스에 불필요한 테스트 데이터가 남지 않습니다. 이 기능은 .NET Framework 1.1(COM+ 트랜잭션)과 .NET Framework 2.0(새로운 기본 제공 트랜잭션 지원 사용) 모두에서 작동합니다.
가격: 소스 코드 포함하여 무상 제공
.NET 개발자를 위한 고급 단위 테스트 기능을 지원하는 MbUnit  (더 크게 보려면 이미지를 클릭하십시오.)

모의 개체를 사용한 효율적 테스트
단위 테스트를 많이 작성할수록 단위 테스트 실행 시간이 길어집니다. 원칙적으로는 개발자가 응용 프로그램을 빌드할 때마다 단위 테스트를 실행할 수 있도록 몇 초 만에 완료되는 것이 이상적입니다. 그러나 오늘날 개발되는 대부분의 응용 프로그램은 데이터베이스, 웹 서비스 및 방대한 기타 외부 종속성을 많이 사용하는데, 이러한 종속성 중 하나를 사용하는 많은 수의 단위 테스트를 몇 초 내에 실행할 방법은 없습니다.
사실 단위 테스트를 이러한 속도로 실행하는 유일한 방법은 외부 종속성을 시뮬레이트하는 무언가를 사용하는 것입니다. 바로 여기서 모의 개체가 중요한 역할을 합니다. 모의 개체는 외부 종속성을 가장하는 개체로 코드가 실제 외부 종속성 대신 모의 개체를 사용하여 정상적으로 실행되도록 합니다. 이렇게 하면 테스트가 빠른 속도로 실행될 뿐만 아니라, 개발자가 외부 종속성에 대해 신경 쓰지 않고 코드의 기능을 테스트하는 데 집중할 수 있습니다. 게다가 코드 및 외부 종속성 간의 상호 작용도 테스트할 수 있습니다. 비즈니스 계층에서 개체를 성공적으로 반환하는지 여부만 테스트하는 것이 아니라 데이터 액세스 계층의 특정 메서드를 호출하여 해당 개체를 검색하는지 여부까지 테스트할 수 있습니다.
.NET에 사용 가능한 머킹 프레임워크는 매우 다양하며, 각 프레임워크는 모의 개체에서 받고 반환해야 할 항목을 정의하는 문제를 조금씩 다르게 처리합니다. 그중에서 Oren Eini(Ayende Rahien이라는 이름으로도 알려져 있음)가 개발한 공개 소스 프레임워크인 Rhino.Mocks가 특히 주목할 만합니다. 이 프레임워크는 강력한 형식의 모의 개체를 제공하기 때문입니다. 대부분의 머킹 프레임워크에서는 하드코드된 문자열을 사용하여 메서드 이름과 매개 변수를 정의해야 합니다. 따라서 런타임에 실제로 테스트를 실행할 때까지 어떤 문제가 발생할지 알 수 없습니다. 하지만 Rhino.Mocks에서는 강력한 형식의 모의 개체를 제공하기 때문에 컴파일을 통해 미리 오류를 파악할 수 있습니다.
Rhino.Mocks는 머킹 유형도 융통성 있게 허용합니다. 일반적인 모의 개체는 예기치 않은 메서드가 호출되면 예외를 발생시킵니다. 그러나 Rhino.Mocks에서 제공하는 동적 모의 개체는 예기치 않은 메서드가 호출되면 예외를 발생시키는 대신 null 또는 0을 반환합니다. 마지막으로 Rhino.Mocks에서는 부분 머킹도 허용합니다. 이는 예외가 정의되어 있지 않은 경우 0 또는 null을 반환하는 대신 개체에 있는 원래 메서드를 호출하고 해당 값을 반환함으로써 예외가 발생하지 않도록 하는 효과가 있습니다. 따라서 개체에 필요한 메서드만 머킹할 수 있습니다.
Rhino.Mocks는 제네릭 형식 지원, 콜백, 대리자와 이벤트를 머킹하는 기능 등 다른 유용한 기능도 다양하게 제공합니다.
가격: 소스 코드 포함하여 무상 제공

응용 프로그램 성능 수치화
성능은 응용 프로그램 작성 시에 주요 목표 중 하나지만 대부분의 개발자는 성능을 수치화할 방법을 마련하지 못하고 매일 작업을 진행하고 있습니다. 일반적으로 특정 화면이나 페이지의 실행 속도가 느린 문제는 사용자가 발견하게 되며 그러면 개발자가 다시 성능 문제의 원인을 추정해야 합니다. 따라서 응용 프로그램의 성능을 수치화하고 병목 지점을 신속하게 파악할 수 있는 방법이 절실히 필요합니다. JetBrains에서 제공하는 dotTrace는 이 두 작업을 쉽고 빠르게 수행할 수 있는 응용 프로그램 프로파일러입니다.
dotTrace를 사용하면 Windows® 응용 프로그램, 웹 응용 프로그램(IIS 또는 Visual Studio® Development Server 사용) 및 Windows 서비스를 프로파일링할 수 있습니다. dotTrace는 각 메서드와 코드 줄을 실행하는 데 소요되는 시간을 보여 주는 성능 프로파일링과 현재 사용 중인 메모리의 용량 및 사용 중인 개체를 표시하는 메모리 프로파일링을 모두 제공합니다. 성능 프로파일링은 1.1 및 2.0 버전의 .NET Framework 기반 응용 프로그램에 사용할 수 있으며 메모리 프로파일링은 버전 2.0 기반 응용 프로그램에만 사용할 수 있습니다.
dotTrace를 사용하여 성능을 프로파일링하면 각 메서드 호출 횟수, 해당 메서드에 소요된 총 시간 및 전체 시간 중 특정 메서드에 소요된 시간의 비율을 볼 수 있습니다. 이러한 통계를 분석하면 응용 프로그램에서 성능이 낮은 부분을 쉽게 찾을 수 있습니다. 응용 프로그램에서 성능이 가장 낮은 100개의 부분을 표시하는 핫 스폿 기능을 사용하면 더 쉽게 프로파일링할 수 있습니다.
dotTrace는 두 가지 메모리 프로파일링 모드를 제공합니다. 메모리 덤프를 만들어 현재 메모리에 있는 개체와 해당 개체가 차지하는 공간의 용량을 확인할 수 있습니다. 또는 차이 모드를 사용하여 프로파일링을 실행하는 특정 기간 동안의 메모리를 캡처하고 새 개체 및 소멸된 개체를 표시하고 프로파일링 실행 중의 차이를 표시할 수 있습니다. 메모리 누수를 추적할 때는 두 메모리 프로파일링 모드가 모두 유용합니다.
dotTrace를 돋보이게 하는 기능 중 하나는 바로 Visual Studio와의 통합이며 이를 통해 몇 번의 마우스 클릭만으로 솔루션 프로파일링을 손쉽게 시작할 수 있습니다. 다음에 응용 프로그램 전체 또는 일부의 성능을 높여야 할 때 dotTrace를 사용하면 최소의 작업으로 성능 개선 결과를 극대화하기 위해 최적화가 필요한 부분을 정확히 파악할 수 있습니다.
가격: 499달러
스냅숏에 저장된 프로파일링 데이터를 볼 수 있는 다양한 방법을 제공하는 dotTrace  (더 크게 보려면 이미지를 클릭하십시오.)

연속 통합 환경 구현
인터넷에는 연속 통합 환경 구성에 관한 방대한 정보가 여러 가지 문서와 기사로 산재해 있습니다. 그중에서도 Paul M. Duvall, Steve Matyas, 그리고 Andrew Glover가 함께 집필한 Continuous Integration: Improving Software Quality and Reducing Risk(Addison-Wesley Professional, 2007)은 필자가 아는 한 연속 통합을 사용해야 하는 이유와 소프트웨어 프로젝트에서 연속 통합을 설정하고 사용하기 위한 패턴 및 최상의 방법을 집대성한 최초의 자료입니다.
책에서는 먼저 연속 통합의 이점과 연속 통합을 사용하지 않았을 때 발생할 수 있는 위험을 이해하기 쉬운 시나리오를 통해 소개합니다. 이러한 시나리오는 팀이나 관리자가 연속 통합을 사용하도록 이끌기에 충분한 정보를 제공합니다. 첫 번째 절에는 전용 빌드 서버와 빌드 메트릭을 사용해야 한다는 점 등, 실제 빌드와 관련한 몇 가지 최상의 방법도 포함되어 있습니다.
계속해서 책에서는 데이터베이스 통합, 자동화된 테스트 실행 및 피드백 제공, 코드 검사 및 분석, 배포, 피드백 제공 등에 관한 장을 통해 연속 통합과 관련한 최상의 방법을 모색합니다. 이러한 장은 대부분 기술 중립적인 견지에서 작성되어 있습니다. 각 절에는 특정 도구와 코드 샘플이 사용되는 경우도 있지만 대부분의 내용은 연속 통합 플랫폼에 관계없이 적용됩니다.
이 책은 두 가지 유용한 부록으로 끝을 맺습니다. 첫 번째 부록에서는 연속 통합 환경 구축에 유용한 도구 목록을 소개합니다. 두 번째 부록에서는 연속 통합 환경에 포함할 도구를 선택하는 최선의 방법을 설명하고 주요 연속 통합 서버에 대한 자세한 가이드를 제공합니다.
가격: 44.99달러
  

James에게 질문이나 의견이 있으면 다음 전자 메일 주소로 보내시기 바랍니다: toolsmm@microsoft.com.