Unit Test 7

HttpContextBase를 이용해서 ASP.NET 코드의 테스트 가능성 높이기

유닛 테스트를 중요하게 생각하여 설계한 코드라면 HttpContext 같이 ASP.NET 프레임워크에 종속되어 테스트가 불가능해지는 클래스들은 진작에 어댑터 등을 이용하여 분리시켜 두었을 것이다. 하지만 이미 작성된 코드가 많은 상황에서 유닛 테스트를 도입할 때에는 HttpContextBase 클래스가 유용하게 사용될 수 있다. HttpContextBase 클래스는 ASP.NET MVC에서 쓰이는 클래스라서 (Controller.HttpContext Property 참조) 3.5 SP1부터 쓸 수 있고, System.Web.Abstractions 어셈블리(네임스페이스는 System.Web)를 참조에 추가하면 된다. HttpContextBase 클래스는 기존의 HttpContext 클래스와 완전히 동일한 ..

2009.12.19

신입사원들과 함께한 TDD 토론

김창준 님과 강규영 님께서 예전에(켄트 벡의 TDD 책이 번역되어 나오기 전) 만드신 TDD 강좌 동영상을 신입 사원들과 같이 보는 스터디가 회사에서 있었는데, 지난 주에 스터디 정리 미팅이 있어서 참석했다. 요즘 너무 정신없는 터라 글을 한 번 써보자고 하고는 벌써 일주일이 지났네. 나는 스터디에는 참가하지 못하고 정리 미팅에만 참석했지만 참 의미있는 미팅이었다고 생각한다. 신입사원들이지만 참여하는 프로젝트 성격상 유닛테스트와 약간의 TDD 경험이 있는 사람도 있고 아예 유닛 테스트에 대한 경험조차 없는 사람도 있었다. 아예 경험이 없는 사람인 경우에는 역시나 유닛 테스트나 TDD에 대해서 제대로 파악하지 못했음을 알 수 있었다. 유닛 테스트에 대해서도 모르는데 TDD와 동시에 접하게 되면 완전히 혼란..

2009.09.06

Google Test의 데이터 기반 테스트

Google Test에서도 MBUnit의 RowTest나 NUnit의 TestCase 같은 데이터 기반 테스트라는 개념을 지원한다. Google Test에서는 이 개념을 Value-Parameterized Tests라고 부른다. 코드는 동일한데 사용하는 데이터 값 몇 개만 바뀌는 테스트 케이스가 있을 때, 코드 중복을 없애주면서도 어떤 테스트 케이스가 실패하고 성공하는지 정확하게 알려주는 유용한 기능이다. 그런데 아무래도 C# 보다는 유연성이 떨어지는(?) C++이라 쓰기가 마냥 쉽지만은 않아서 좀 정리를 해 둘 필요가 있다. 템플릿을 써서 구현한 기능이라 컴파일 에러라도 한 번 나면 좀 골치가 아프긴 하지만, Visual C++ 2008의 템플릿 관련 에러 메시지는 엄청나게 친절하기 때문에 미리 걱정할..

2009.05.23

Google Test의 문자열 비교 Assertion

UnitTest++과 비교했을 때 상대적으로 Google Test가 좋은 점 중에 한 가지는 문자열 비교이다. Google Test는 wide character 문자열도 잘 비교해주기 때문에 다음과 같은 문자열 비교 assertion을 써서 실제 값과 다른 경우에는 아래와 같이 문자열 값을 실패 메시지에 포함시켜서 보여준다. ASSERT_STREQ(_T("-111"), xe->GetProperty(_T("Canvas.Left"))); (노파심에 프로젝트명은 지움) Google Test의 문자열 비교 assertion에는 이런 것들이 있다. Fatal assertion Nonfatal assertion ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expec..

2009.04.28

shared_ptr의 custom deleter 사용법

내가 처음 custom deleter를 봤을 때에는, shared_ptr 생성자에서 한 번 custom deleter를 지정해주면 그 다음부터 reset()을 하더라도 항상 처음에 지정했던 deleter를 불러줄 거라는 기대가 있었다. 그래서 테스트를 해봤더니 그런게 아니네. custom deleter를 유지하고 싶다면 reset()을 할 때 deleter도 같이 넘겨줘야 한다. 아래 테스트 코드는 custom deleter를 지정하지 않고 reset()한 경우에는 custom deleter가 호출되지 않는다는 걸 Google Test를 이용해서 보여주는 코드이다. class TestSharedPtrFixture : public testing::Test { public: std::stringstream ..

2009.04.23

Google Test & Visual Studio 2008

google test를 다운받는다.(gtest-1.3.0) 필요한 폴더만 남기고 나머지는 다 지운다. 실제 프로젝트에서 쓸 때에는 include, msvc, src 폴더 외에는 필요없다. msvc 폴더의 파일 중에도, 프로젝트에서 쓸 때에는 gtest.vcproj 파일 외에는 다 필요 없으므로 지워버린다. VS2008로 gtest.vcproj 파일을 열어서 2008 포맷으로 변환해준 후 VS를 닫는다. (닫을 때 sln을 저장할 것인지 물어보는데 저장하지 않음을 선택한다.) 프로젝트를 만든다. 솔루션 폴더에 gtest-1.3.0 폴더를 통채로 옮긴다. 여러 사람이 같이 작업하는 프로젝트에서 구글 테스트 프레임워크를 쓰기에는, 솔루션 폴더에 통채로 포함시키는 편이 공유하기에 편하다. 현재 사용중인 버전을 ..

2009.04.18

Silverlight Code Coverage

Silverlight용 Unit Testing Framework는 Jeff Wilcox의 Microsoft Silverlight Unit Test Framework이 제일 유명하다. Visual Studio Team System Developer Edition 에서는 "코드 검사"라는 기능을 통해서 유닛 테스트 실행 후 커버리지를 보여주는 기능을 포함하고 있다. 그런데 이것은 닷넷 어플리케이션에만 적용되고, Silverlight 어플리케이션에서는 쓸 수 없다. Silverlight는 보안을 위해서 별도의 분리된 환경에서 실행되므로, NCover등이 사용하는 기존의 방식으로는 커버리지를 측정할 수 없다고 한다. (어떤 방식인지 찾아보면 재미있을 듯) 즉, Silverlight 어플리케이션의 유닛 테스트에서..

2009.04.09