NUnit은 꾸준히 버전업을 해서 2.5버전에서는 파라미터 있는 메소드도 테스트 가능하게 됨
(http://blog.benhall.me.uk/2008/08/taking-look-at-nunit-25-alpha-3.html)
그리고, 요즘에 나온 [PEX]라는 것이 나왔는데요…(마소 2009년 1월호에도 기재되어 있음.)
Visual Studio 2008과 2010에 들어가게 될꺼라고 합니다. (Visual Studio 2005에서도 실행해도 문제는 없었다고 함)
기능은 간단하게, 소스코드를 분석해 테스트를 위한 [test case(테스트코드)]를 자동으로 생성해 줍니다.
NUnit적용하던 관련내용 입니다. 정리하면
- 테스트코드에 category attribute를 [dev, rc, real]등으로 사용해서 망별로 테스트 해야 하는 테스트 코드들을 분리해서 실행하게 함
- 개발시 테스트 코드 작성하고 Nunit-gui프로그램에 프로젝트 파일을 참조하게 해서 바로 바로 테스트코드 실행결과 보면서 개발
- 개발시 순차적으로 실행되야 하는 테스트코드들은 메소드명을 [_A1, _A2] 와 같이 순차적으로 만들어서 순차적으로 실행되게 함…
- 배포시(.net framework 2.0)에는 아래의 내용이 들어가는 배치파일을 만들어서 배포할 dll생성되기 전에 nunit으로 테스트코드 실행한 후 dll생성되게 함
1. nunit-console D:\Dev\PCCafeWebSystem\Core\Core.csproj /wait /nologo /include:DEV
2. aspnet_compiler -v / -p D:\Dev\PCCafeWebSystem\PCCafeWeb D:\Dev\PCCafeWebSystem\PCCafeWeb_Output -f -fixednames -errorstack
3. aspnet_merge D:\Dev\PCCafeWebSystem\PCCafeWeb_Output -prefix _PCCAFE -errorstack
[아래는 관련 PPT내용]
1. 테스팅의 필요성
• è배포 후 매번 프로세스를 확인하여 이상여부를 확인 합니까?
• è부분배포 시 작업하지 않은 다른 부분에서 오류가 난적이 있습니까?
• è시스템 장애상황을 빠르게 파악하지 못해 대처가 늦었던 적이 있습니까?
• è개발 시 누락 및 중복된 프로세스를 줄이고 싶으십니까?
2. 테스팅의 목표
1. 테스팅은 쉬워야 한다.
2. 테스팅은 빨라야 한다.
3. 테스팅은 자동화 되어야 한다.
4. 테스팅은 철저하게 해야 한다.
5. 테스팅은 개발프로세스에 포함되어야 한다.
3. 테스팅 툴
|
URL |
비고 |
NUnit |
VSS.NET과 컴파일 시 연동 Free Ware |
|
TestDriven.NET 2.0 |
VSS.NET 플러그인 지원 Share Ware |
|
NUnitASP |
웹UI상에서 테스트 통합테스트 가능 속도가 느림 Client Script테스트 불가 |
4. NUnit의 소개
4-1. NUnit의 특징
èOpen Source(.NET 버전, JUnit은 Java버젼)
.NET Framework 1.1과 2.0 지원,
Linux/Solaris/Mac OS X용 .NET 개발 Framework및 IDE Mono 지원
è Console과 GUI 지원
4-2. NUnit의 기능
è 단위 테스트(Unit Test)
è 시스템 테스트(System Test)
4-3. Quick Start
namespace bank{
using System;
using NUnit.Framework;
[TestFixture]
public class AccountTest
{
Account src;
Account dest;
[SetUp] // (반대 [TearDown])
public void Init()
{
src = new Account();
src.Deposit(200);
dest = new Account();
dest.Deposit(150);
}
[Test][Description(“이체 테스트”)]
public void TransferFunds()
{
src.TransferFunds(dest, 100.00f);
Assert.AreEqual(250, dest.Balance);
Assert.AreEqual(100, src.Balance);
}
[Test] [ExpectedException(typeof(InsufficientFund))]
[Category(“Exception”), Category(“Error”)]
[Property(“TransferFunds”, 300)]
public void TransferWithInsufficientFunds()
{
src.TransferFunds(dest, 300);
}
[Test]
[Ignore("Decide how to implement transaction management")]
[Category(“Error”)]
public void TransferWithInsufficientFunds()
{
try
{
src.TransferFunds(dest, 300);
}
catch(InsufficientFunds expected) { }
Assert.AreEqual(200,src.Balance); Assert.AreEqual(150,dest.Balance);
}
}
}
5. NUnit과 테스트 코드
5-1. 테스트 코드
4 작성한 코드가 정상적으로 동작하는지 확인 하기 위한 코드
5-2. 테스트 코드 작성 시 유의사항
4 프로그램에 존재하는 모든 경우의 수를 고려해야 함
- ID중복체크 시 [ID중복인 경우]. [ID중복이 아닌 경우] 모두 체크함
4 DB관련 부분 테스트 시
- DB에 Insert/Update후 Select하여 정확한 데이터가 있는지 확인
4 테스트가 불가능한 경우
- Stub을 사용하여 전체적으로 프로세스의 파악에 유리하게 함.
(주석 또는 [Ignore] Attribute를 사용하기도 함)
6. NUnit과 TDD
6-1. TDD 적용
4 코드작성 > 테스트 코드 작성 (X)
4 테스트 코드 작성 > 코드 작성 (O) (예제)
6-2. TDD 장점
4 프로세스의 누락 또는 중복을 판단할 수 있음
4 연관된 다른 프로세스의 이상 여부를 확인할 수 있음
4 테스트코드를 통한 프로세스 파악이 용이함
7. NUnit 적용사례
1. [Test]에서 그룹화 하는 경우 A05, A10과 같이 명명규칙에 의해 그룹화
2. 실제로 사용되는 망(DEV/RC/REAL)만 Category를 추가하여 사용
3. 기능상 필요하지만 테스트가 불가능한 경우에는 ignore 또는 주석 사용
4. Console.out과 Console.err를 적절히 사용
5. '배포용 배치파일'에 NUnit 테스트를 포함 시켜 최종 컴파일 전 한번 더
테스트 가능 (예제)
8. DEMO
1. VSS.NET과 NUnit의 연동
2. NUnit 디버깅
3. Category Attribute
4. DB관련 테스트
9. 향후 방향성
1. 매크로와 템플릿을 이용하여 테스트코드 작성 시 편리하게 함
2. 주기적으로 소스세이프의 소스를 NAnt로 컴파일하고 NUnit으로 테스트 하게함
10. 배포용 배치파일
1. nunit-console D:\Dev\PCCafeWebSystem\Core\Core.csproj /wait /nologo /include:DEV
2. aspnet_compiler -v / -p D:\Dev\PCCafeWebSystem\PCCafeWeb D:\Dev\PCCafeWebSystem\PCCafeWeb_Output -f -fixednames -errorstack
3. aspnet_merge D:\Dev\PCCafeWebSystem\PCCafeWeb_Output -prefix _PCCAFE -errorstack
1. 아래의 그림과 같이 test project의 속성에 들어가서 '빌드 이벤트' 탭을 선택하고 '빌드 후 이벤트 명령줄'의 '빌드 후 편집' 버튼을릭하고 $(SolutionDir)\lib\nunit-console.exe /nologo $(TargetPath)와 같이 설정 한다.
2. 아래의 그림과 같이 빌드를 하고 '출력(output)'화면을 보면 빌드 후 실행된 Unit Test 결과및 에러내용을 확인할 수 있다.
DB쪽(DAO) 테스트인 경우에는 transaction을 잡고 CRUD를 테스트하고
transaction을 rollback하면 테스트도 하고 데이터의 변경 반영도 되지 않을 것 같다.
참고)
- nunit(대중적으로 많이 쓰이고 검증된 오픈소스 프레임웤, 2.5버전에서 파라미터 있는 메소드 테스트도 가능하게 지원)
- NUnitAsp(asp.net 테스트 툴)
http://lycobs.springnote.com/pages/921034
- pex(visual Studio 2008~2010에 들어가게 됨, 소스코드작성 후 자동으로 분기문에 들어갈 파라미터들을 찾아서 테스트코드(테스트용 메소드)를 생성해줌)
http://research.microsoft.com/en-us/projects/Pex/
- cs unit (오픈소스 프레임웤, unit과 거의 비슷함)
http://www.csunit.org/download/index.html#latestStable
- parasoft .test
- dotunit (nunit과 비슷하고 어노테이션 지원하지 않음)
http://dotunit.sourceforge.net/
- WPF Unit test
http://marlongrech.wordpress.com/2007/10/14/wpf-unit-testing/
- Nester
http://nester.sourceforge.net/
- 기타
- 개발일정을 줄이는 테스팅에 대한 얘기 http://www.ibm.com/developerworks/kr/library/dwclm/20090120/
- c# testing관련 http://codebetter.com/blogs/darrell.norton/articles/50337.aspx