기존 단위 테스트에서 테스트는 다음과 같은 몇 가지 항목으로 구성됩니다.
- 메서드 호출 시퀀스
- 메서드가 호출되는 인수입니다. 인수는 테스트 입력입니다.
- 어설션 집합을 명시하여 테스트된 애플리케이션의 의도된 동작에 대한 유효성 검사
다음은 테스트 구조 예제입니다.
[Test]
void MyTest() {
// data
ArrayList a = new ArrayList();
// method sequence
a.Add(5);
// assertions
Assert.IsTrue(a.Count==1);
Assert.AreEqual(a[0], 5);
}
IntelliTest는 메서드 호출 및 어설션 시퀀스를 제공하는 보다 일반적인 매개 변수화된 단위 테스트에 대한 관련 인수 값을 자동으로 결정할 수 있습니다.
테스트 생성기
IntelliTest는 실행할 테스트 대상 구현의 메서드 시퀀스를 선택한 다음 파생 데이터에 대한 어설션을 확인하는 동안 메서드에 대한 입력을 생성하여 테스트 사례를 생성합니다.
매개 변수가 있는 단위 테스트는 본문에서 메서드 호출 시퀀스를 직접 나타냅니다.
IntelliTest가 개체를 생성해야 하는 경우 필요에 따라 생성자 및 팩터리 메서드에 대한 호출이 시퀀스에 자동으로 추가됩니다.
매개 변수가 있는 단위 테스트
PUT(매개 변수가 있는 단위 테스트 )는 매개 변수를 사용하는 테스트입니다. 일반적으로 닫힌 메서드인 기존 단위 테스트와 달리 PUT는 매개 변수 집합을 사용합니다. 그렇게 간단합니까? 예 - 여기에서 IntelliTest는 테스트에서 연결할 수 있는 코드를 완전히 포함하는(최소) 입력 집합을 생성하려고 합니다.
PUT는 MSTest(또는 NUnit, xUnit)와 유사한 방식으로 PexMethod 사용자 지정 특성을 사용하여 정의됩니다. PUT는 PexClass로 태그가 지정된 클래스에서 논리적으로 그룹화된 인스턴스 메서드입니다. 다음 예제에서는 MyPexTest 클래스에 저장된 간단한 PUT을 보여줍니다.
[PexMethod]
void ReplaceFirstChar(string target, char c) {
string result = StringHelper.ReplaceFirstChar(target, c);
Assert.AreEqual(result[0], c);
}
여기서 ReplaceFirstChar 는 문자열의 첫 번째 문자를 대체하는 메서드입니다.
class StringHelper {
static string ReplaceFirstChar(string target, char c) {
if (target == null) throw new ArgumentNullException();
if (target.Length == 0) throw new ArgumentOutOfRangeException();
return c + target.Substring(1);
}
}
이 테스트에서 IntelliTest는 테스트된 코드의 많은 실행 경로를 포함하는 PUT에 대한 입력을 자동으로 생성 할 수 있습니다. 다른 실행 경로를 포함하는 각 입력은 단위 테스트로 "serialize"됩니다.
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
void ReplaceFirstChar0() {
this.ReplaceFirstChar(null, 0);
}
...
[TestMethod]
void ReplaceFirstChar10() {
this.ReplaceFirstChar("a", 'c');
}
제네릭 매개 변수가 있는 단위 테스트
매개 변수가 있는 단위 테스트는 제네릭 메서드일 수 있습니다. 이 경우 사용자는 PexGenericArguments를 사용하여 메서드를 인스턴스화하는 데 사용되는 형식을 지정해야 합니다.
[PexClass]
public partial class ListTest {
[PexMethod]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
public void AddItem<T>(List<T> list, T value)
{ ... }
}
예외 허용
IntelliTest는 예외를 예상된 예외 및 예기치 않은 예외로 심사하는 데 도움이 되는 수많은 유효성 검사 특성을 제공합니다.
예상된 예외는 ExpectedException(typeof(xxx))과 같은 적절한 주석을 사용하여 부정적인 테스트 사례를 생성하지만 예기치 않은 예외는 실패한 테스트 사례를 생성합니다.
[PexMethod, PexAllowedException(typeof(ArgumentNullException))]
void SomeTest() {...}
유효성 검사기는 다음과 같습니다.
- PexAllowedException: 어디에서나 특정 예외 유형을 허용합니다.
- PexAllowedExceptionFromAssembly: 지정된 어셈블리의 특정 예외 형식을 허용합니다.
- PexAllowedExceptionFromType: 지정된 형식의 특정 예외 형식을 허용합니다.
- PexAllowedExceptionFromTypeUnderTest: 테스트 중인 형식의 특정 예외 형식을 허용합니다.
내부 형식 테스트
IntelliTest는 내부 형식을 볼 수 있다면 "테스트"할 수 있습니다. IntelliTest에서 형식을 보려면 Visual Studio IntelliTest 마법사를 통해 제품 또는 테스트 프로젝트에 다음 특성이 추가됩니다.
[assembly: InternalsVisibleTo("Microsoft.Pex, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293")]
가정 및 어설션
사용자는 가정 및 어설션을 사용하여 테스트에 대한 전제 조건 (가정) 및 사후 조건 (어설션)을 표현할 수 있습니다. IntelliTest가 매개 변수 값 집합을 생성하고 코드를 "탐색"하는 경우 테스트 가정을 위반할 수 있습니다. 이 경우 해당 경로에 대한 테스트를 생성하지 않지만 자동으로 무시합니다.
어설션은 일반 단위 테스트 프레임워크에서 잘 알려진 개념이므로 IntelliTest는 지원되는 각 테스트 프레임워크에서 제공하는 기본 제공 Assert 클래스를 이미 "이해"합니다. 그러나 대부분의 프레임워크는 Assume 클래스를 제공하지 않습니다. 이 경우 IntelliTest는 PexAssume 클래스를 제공합니다. 기존 테스트 프레임워크를 사용하지 않으려면 IntelliTest에도 PexAssert 클래스가 있습니다.
[PexMethod]
public void Test1(object o) {
// precondition: o should not be null
PexAssume.IsNotNull(o);
...
}
특히 nullness가 아닌 가정은 사용자 지정 특성으로 인코딩할 수 있습니다.
[PexMethod]
public void Test2([PexAssumeNotNull] object o)
// precondition: o should not be null
{
...
}
전제 조건
메서드의 전제 조건은 메서드가 성공할 조건을 나타냅니다.
일반적으로 매개 변수 및 개체 상태를 확인하고 위반된 경우 ArgumentException 또는 InvalidOperationException 을 throw하여 사전 조건이 적용됩니다.
IntelliTest에서 매개 변수가 있는 단위 테스트 의 전제 조건은 PexAssume로 표현됩니다.
사후 조건
메서드의 사후 조건은 메서드의 사전 조건이 처음에 유효하다고 가정하여 메서드 실행 중 및 실행 후에 유지해야 하는 조건을 나타냅니다.
일반적으로 사후 조건은 Assert 메서드 호출에 의해 적용됩니다.
IntelliTest를 사용하면 매개 변수가 있는 단위 테스트 의 사후 조건이 PexAssert로 표현됩니다.
테스트 실패
생성된 테스트 사례는 언제 실패하나요?
구성된 경로 범위 내에서 종료되지 않는 경우 TestExcludePathBoundsExceeded 옵션을 설정하지 않는 한 실패로 간주됩니다.
테스트가 PexAssumeFailedException을 throw하면 성공합니다. 그러나 TestEmissionFilter가 모두로 설정되지 않는 한 일반적으로 필터링됩니다.
테스트가 어설션을 위반하는 경우, 예를 들어 단위 테스트 프레임워크의 어설션 위반으로 예외를 발생시키면 실패합니다.
위의 조건들 중 어느 것도 결정을 내리지 않는 경우, 오직 예외를 throw하지 않는 경우에만 테스트가 성공합니다. 어설션 위반은 예외와 동일한 방식으로 처리됩니다.
설정 및 해체
테스트 프레임워크와의 통합의 일환으로 IntelliTest는 설치 및 분해 방법 검색 및 실행을 지원합니다.
예시
using Microsoft.Pex.Framework;
using NUnit.Framework;
namespace MyTests
{
[PexClass]
[TestFixture]
public partial class MyTestClass
{
[SetUp]
public void Init()
{
// monitored
}
[PexMethod]
public void MyTest(int i)
{
}
[TearDown]
public void Dispose()
{
// monitored
}
}
}
추가 읽기
피드백이 있으신가요?
개발자 커뮤니티에 아이디어 및 기능 요청을 게시합니다.