시작하기
-
이전에 xUnit.net Visual Studio Runner 확장 패키지를 설치한 경우, "도구" 메뉴의 "확장 및 업데이트"에서 해당 패키지를 제거해야 합니다.
-
%TEMP%\VisualStudioTestExplorerExtensions 폴더를 삭제합니다.
Xunit 설치 방법: Xunit은 이제 플러그인 없이 NuGet을 통해 간단히 설치할 수 있습니다:
• PM> Install-Package Xunit
• PM> Install-Package Xunit.Runner.VisualStudio -Pre (Visual Studio 테스트 탐색기 호환, VS2015는 Pre 버전 필수)
프레임워크 비교
어트리뷰트
| NUnit 2.2 | MSTest 2005 | xUnit.net 2.x | 설명 |
|---|---|---|---|
[Test] |
[TestMethod] |
[Fact] |
테스트 메서드를 표시 |
[TestFixture] |
[TestClass] |
없음 | xUnit.net은 테스트 클래스에 어트리뷰트가 필요하지 않으며, 어셈블리 내 모든 공개 클래스의 테스트 메서드를 자동으로 검색 |
[ExpectedException] |
[ExpectedException] |
Assert.Throws |
예외 처리 방식 변경 |
[SetUp] |
[TestInitialize] |
생성자 | 테스트 초기화 시 생성자 사용 권장 |
[TearDown] |
[TestCleanup] |
IDisposable.Dispose |
리소스 정리 시 Dispose 메서드 사용 |
[TestFixtureSetUp] |
[ClassInitialize] |
IClassFixture<T> |
클래스 수준 테스트 환경 설정 |
[TestFixtureTearDown] |
[ClassCleanup] |
IClassFixture<T> |
클래스 수준 테스트 환경 정리 |
| n/a | n/a | ICollectionFixture<T> |
테스트 컬렉션 수준 환경 설정 |
[Ignore] |
[Ignore] |
[Fact(Skip="이유")] |
임시로 테스트 건너뛰기 |
[Property] |
[TestProperty] |
[Trait] |
테스트 메타데이터 설정 |
| n/a | [DataSource] |
[Theory] |
데이터 기반 테스트 지원 |
어트리뷰트 주의사항
- 예외 처리 시
[ExpectedException]대신Assert.Throws사용 권장 - 각 테스트별 초기화/정리보다 생성자와 Dispose 메서드를 통한 일관된 관리 권장
- 공유 테스트 환경 관리 시
IClassFixture<T>및ICollectionFixture<T>활용 - 데이터 기반 테스트는
[Theory]와[InlineData]등으로 구현
단언
| NUnit 2.2 | MSTest 2005 | xUnit.net 1.x | 설명 |
|---|---|---|---|
AreEqual |
AreEqual |
Equal |
제네릭 지원 |
AreNotEqual |
AreNotEqual |
NotEqual |
제네릭 지원 |
AreSame |
AreSame |
Same |
참조 비교 |
Contains |
Contains |
Contains |
컬렉션 요소 검색 |
Fail |
Fail |
없음 | Assert.True(false)로 대체 |
IsNotNull |
IsNotNull |
NotNull |
null 검증 |
IsNull |
IsNull |
Null |
null 검증 |
IsTrue |
IsTrue |
True |
불리언 검증 |
테스트 작성 가이드
테스트 클래스 구성
- 공개 클래스로 선언
- 테스트 메서드는
[Fact]로 표시
단언 방법
Assert.Equal(3, Math.Max(3, 2));
xunit.should 라이브러리 사용 시
Math.Max(3, 2).ShouldBe(3);
수명 관리
- 생성자에서 초기화 작업
IDisposable구현 시Dispose()자동 호출
예외 테스트
[Fact]
public void TestException()
{
Assert.Throws<InvalidOperationException>(() => TriggerException());
}
private void TriggerException()
{
throw new InvalidOperationException();
}
추가 기능
- 테스트 이름 변경:
[Fact(DisplayName = "Max 테스트")] - 테스트 건너뛰기:
[Fact(Skip = "구현 중")] - 그룹 분류:
[Trait("Group", "Category")]