IntelliTest는 프로그램의 분기 조건을 분석하여 매개 변수가 있는 단위 테스트 에 대한 입력을 생성합니다. 테스트 입력은 프로그램의 새 분기 동작을 트리거할 수 있는지 여부에 따라 선택됩니다. 분석은 증분 프로세스입니다. 공식 테스트 입력 매개 변수q: I -> {true, false}에 대한 조건자를 I 구체화합니다.
q 는 IntelliTest가 이미 관찰한 동작 집합을 나타냅니다. 처음에는 q := false아무것도 관찰되지 않았기 때문에.
루프의 단계는 다음과 같습니다.
IntelliTest는 제약 조건 해결기를 사용하여
iq(i)=false에 대한 입력을 결정합니다. 생성 시 입력i은 이전에 볼 수 없었던 실행 경로를 사용합니다. 처음에는 실행 경로가i아직 검색되지 않았기 때문에 모든 입력이 될 수 있음을 의미합니다.IntelliTest는 선택한 입력
i을 사용하여 테스트를 실행하고 테스트 및 테스트 중인 프로그램의 실행을 모니터링합니다.실행 중에 프로그램은 프로그램의 모든 조건부 분기에 의해 결정되는 특정 경로를 사용합니다. 실행을 결정하는 모든 조건 집합을 공식 입력 매개 변수에 대한 조건 자로 작성된
p: I -> {true, false}이라고 합니다. IntelliTest는 이 조건자의 표현을 계산합니다.IntelliTest 세트
q := (q or p). 즉, 로 표현된 경로를 보았다는 사실을 기록합니다p.1단계로 이동합니다.
IntelliTest의 제약 조건 해 찾기는 .NET 프로그램에 나타날 수 있는 모든 형식의 값을 처리할 수 있습니다.
IntelliTest는 명시된 가정을 위반하는 입력을 필터링합니다.
즉시 입력( 매개 변수가 있는 단위 테스트에 대한 인수) 외에도 테스트는 PexChoose 정적 클래스에서 추가 입력 값을 그릴 수 있습니다. 선택 항목은 매개 변수가 있는 모의 객체의 동작도 결정합니다.
제약 조건 해결기
IntelliTest는 제약 조건 솔버를 사용하여 테스트 및 테스트 중인 프로그램의 관련 입력 값을 확인합니다.
IntelliTest는 Z3 제약 조건 해결기를 사용합니다.
동적 코드 검사
IntelliTest는 런타임 모니터링의 부작용으로 동적 코드 검사 데이터를 수집합니다. IntelliTest는 실행된 코드에 대해서만 알고 있기 때문에 동적 이라고 하므로 일반적으로 다른 검사 도구와 동일한 방식으로 검사에 대한 절대 값을 제공할 수 없습니다.
예를 들어 IntelliTest가 동적 검사를 5/10 기본 블록으로 보고하는 경우 이는 10개 중 5개의 블록이 적용되었음을 의미하며, 여기서 지금까지 분석하여 도달한 모든 메서드의 총 블록 수는 10개입니다(테스트 중인 어셈블리에 있는 모든 메서드와 반대). 분석의 뒷부분에서 더 많은 도달 가능한 메서드가 발견되면 숫자(이 예제에서는 5)와 분모(10)가 모두 증가할 수 있습니다.
정수 및 부동 소수점 숫자
IntelliTest의 제약 조건 해 찾기 는 테스트 및 테스트 중인 프로그램에 대해 다른 실행 경로를 트리거하기 위해 바이트, int, float 등과 같은 기본 형식의 테스트 입력 값을 결정합니다.
개체
IntelliTest는 기존 .NET 클래스의 인스턴스를 만들거나 IntelliTest를 사용하여 특정 인터페이스를 구현하고 사용량에 따라 다른 방식으로 동작하는 모의 개체 를 자동으로 만들 수 있습니다.
기존 클래스 인스턴스화
문제가 뭔가요?
IntelliTest는 테스트를 실행할 때 실행된 명령과 테스트 중인 프로그램을 모니터링합니다. 특히 필드에 대한 모든 액세스를 모니터링합니다. 그런 다음 제약 조건 솔버 를 사용하여 개체 및 해당 필드 값을 포함한 새 테스트 입력을 확인합니다. 따라서 테스트 중인 테스트와 프로그램이 다른 흥미로운 방식으로 동작합니다.
즉, IntelliTest는 특정 형식의 개체를 만들고 해당 필드 값을 설정해야 합니다. 클래스가 표시 되고 표시되는 기본 생성자가 있는 경우 IntelliTest는 클래스의 인스턴스를 만들 수 있습니다. 클래스의 모든 필드가 표시되는 경우 IntelliTest는 필드를 자동으로 설정할 수 있습니다.
형식이 표시되지 않거나 필드가 표시되지 않는 경우 IntelliTest는 최대 코드 범위를 달성하기 위해 개체를 만들고 흥미로운 상태로 가져오는 데 도움이 필요합니다. IntelliTest는 리플렉션을 사용하여 임의 방식으로 인스턴스를 만들고 초기화할 수 있지만, 일반 프로그램 실행 중에는 발생할 수 없는 상태로 개체를 가져올 수 있으므로 일반적으로 바람직하지 않습니다. 대신 IntelliTest는 사용자의 힌트를 사용합니다.
가시성
.NET에는 형식, 메서드, 필드 및 기타 멤버가 프라이빗, 퍼블릭, 내부 등과 같은 정교한 표시 유형 모델이 있습니다.
IntelliTest는 테스트를 생성할 때 생성된 테스트의 컨텍스트 내에서 .NET 표시 유형 규칙과 관련하여 유효한 작업(예: 생성자, 메서드 및 필드 설정)만 수행하려고 시도합니다.
규칙은 다음과 같습니다.
내부 멤버의 표시 여부
- IntelliTest는 생성된 테스트가 바깥쪽 PexClass에 표시된 내부 멤버에 액세스할 수 있다고 가정합니다. .NET에는 내부 멤버의 표시 유형을 다른 어셈블리로 확장할 수 있는 InternalsVisibleToAttribute 가 있습니다.
PexClass의 프라이빗 및 패밀리(C#으로 보호됨) 멤버의 표시 여부
공용 멤버의 표시 여부
- IntelliTest는 PexClass의 컨텍스트에 표시되는 내보낸 모든 멤버를 사용할 수 있다고 가정합니다.
매개 변수가 있는 모의
인터페이스 형식의 매개 변수가 있는 메서드를 테스트하는 방법 또는 봉인되지 않은 클래스인가요? IntelliTest는 이 메서드가 호출될 때 나중에 어떤 구현이 사용될지 알 수 없습니다. 그리고 테스트 시간에 사용할 수 있는 실제 구현도 없을 수 있습니다.
일반적인 대답은 명시적 동작과 함께 모의 개체를 사용하는 것입니다 .
모의 개체는 인터페이스를 구현하거나 봉인되지 않은 클래스를 확장합니다. 실제 구현이 아니라 모의 개체를 사용하여 테스트를 실행할 수 있는 바로 가기입니다. 해당 동작은 사용되는 각 테스트 사례의 일부로 수동으로 정의됩니다. 모의 개체 및 예상 동작을 쉽게 정의할 수 있는 많은 도구가 있지만 이 동작은 여전히 수동으로 정의해야 합니다.
모의 개체에서 하드 코딩된 값 대신 IntelliTest에서 값을 생성할 수 있습니다. 매개 변수가 있는 단위 테스트를 사용하도록 설정하는 것처럼 IntelliTest는 매개 변수가 있는 모의 개체도 사용할 수 있습니다.
매개 변수가 있는 모의 개체에는 두 가지 실행 모드가 있습니다.
- 선택: 코드를 탐색할 때 매개 변수가 있는 모의 항목은 추가 테스트 입력의 소스이며 IntelliTest는 흥미로운 값을 선택하려고 시도합니다.
- 재생: 이전에 생성된 테스트를 실행할 때 매개 변수가 있는 모의 개체는 동작이 있는 스텁처럼 동작합니다(즉, 미리 정의된 동작).
PexChoose를 사용하여 매개 변수가 있는 모의 항목에 대한 값을 가져옵니다.
구조체
구조체 값에 대한 IntelliTest의 추론은 개체를 처리하는 방식과 비슷합니다.
배열 및 문자열
IntelliTest는 테스트 및 테스트 중인 프로그램을 실행할 때 실행된 명령을 모니터링합니다. 특히 프로그램이 문자열 또는 배열의 길이(및 다차원 배열의 하한 및 길이)에 따라 달라지는 경우를 관찰합니다. 또한 프로그램에서 문자열 또는 배열의 다양한 요소를 사용하는 방법도 관찰합니다. 그런 다음 제약 조건 솔버 를 사용하여 테스트 및 테스트 중인 프로그램이 흥미로운 방식으로 동작할 수 있는 길이 및 요소 값을 결정합니다.
IntelliTest는 흥미로운 프로그램 동작을 트리거하는 데 필요한 배열 및 문자열의 크기를 최소화하려고 시도합니다.
추가 입력 가져오기
PexChoose 정적 클래스는 테스트에 대한 추가 입력을 가져오는 데 사용할 수 있으며 매개 변수가 있는 모의 클래스를 구현하는 데 사용할 수 있습니다.
피드백이 있으신가요?
개발자 커뮤니티에 아이디어 및 기능 요청을 게시합니다.