|
날개-단위 테스트를 지능적이고 완전 자동화로 만들게 합니다머리말 단위 테스트는 조기 개입 개념이나 UI의 영향을 받지 않고 고속으로 검증할 수 있는 특성 측면에서 소프트웨어 품질을 보장하는 매우 효과적인 수단입니다. 따라서 업계에서 권장하는 테스트 주도 개발, 즉 여기서 언급된 테스트 드라이버는 유닛 테스트 드라이버를 더 가리킵니다. 하지만 일반 개발팀은 여전히 단위 테스트를 체계적으로 실행하는 경우가 드물며, 애플리케이션 소프트웨어 테스트는 전문 테스트 팀이 블랙박스 테스트를 수행하는 경우가 많습니다. 유닛 테스트의 가장 큰 어려움은 입력과 출력이 모듈 개발 단계에서 이미 결정되어 있기 때문에 결정되지 않는다는 점이 아니라, 유닛 테스트 케이스 작성에 많은 개발자 시간이 소요되며, 관련 통계에 따르면 유닛 테스트 케이스 소요 시간이 함수 개발 시간보다 훨씬 더 길어진다는 점입니다. 다음은 개발에서 유닛 테스트를 작성하지 않는 가장 흔한 몇 가지 이유입니다: ●요구사항은 항상 끝이 없고, 다음 단계에서 실현해야 할 기능적 요구사항이 남아 있으며, 유닛을 채울 시간도 없습니다 ●보충할 수 없는 단위 테스트가 너무 많고, 시작할 방법도 없어서 주관적으로 저항합니다. ● 단위 테스트는 작성하기 어렵습니다. 한편으로는 함수 구현이 충분히 합리적이지 않기 때문일 수 있고, 다른 한편으로는 유용한 단위 테스트 프레임워크나 모의 프레임워크가 없거나 알려지지 않았기 때문입니다. ● 단위 테스트는 작업 부하에 포함되지 않습니다. 둘째, 기능 요구사항이 여전히 불안정하고, 단위 테스트 작성의 비용 효율성도 높지 않습니다. 즉, 만약 내일 요구사항이 변경된다면, 기능 코드뿐만 아니라 단위 테스트도 폐기될 것입니다. 유닛 테스트를 작성하지 않는다면, 이 노력의 일부가 헛되지 않을 것입니다. 사실 위 점들의 근본 원인은 단위 테스트 작성이 너무 시간이 많이 걸려 결국 테스트 주행 엔진의 전력을 잃게 되고, 실제 시나리오에서 테스트 주도 개발의 아름다운 비전이 멈추게 됩니다. 이 드라이브를 위한 엔진을 만드는 것이 너무 어렵고 비용이 많이 들기 때문입니다. 시장에 나와 있는 다양한 "x" 유닛과 단위 테스트 프레임워크는 테스트 기반 외부 프레임 생성 문제만 해결하며, 깊은 프로그램 이해에 기반한 사용 사례 논리나 데이터 생성 능력 없이 해결합니다. 따라서 개발자들이 다양한 개발 관련 상황에서 저항하게 만듭니다. Wings(현재 C용)의 출시는 프로그래머들에게 가장 큰 문제 중 하나를 해결하며, 시스템 수준의 블랙박스 테스트와 대규모 인력 기반 자동화 테스트의 압박을 효과적으로 완화할 수 있는 유닛 테스트의 현상 유지를 근본적으로 바꿀 잠재력을 지닙니다. 제약 테스트 케이스는 프로그램에 의해 자동으로 생성되며, 가장 중요한 기본 기술은 복잡한 파라미터 파싱 기술입니다. 즉, 임의의 복잡한 타입에 대해 컴파일러 수준에서 임의로 중첩 레벨 재귀 파싱을 정의할 수 있습니다. 이 중요한 기술의 돌파구가 없었다면, 자동 테스트 케이스 생성 시스템은 상업적으로 불가능해지거나 매우 낮은 효율로 준수 테스트 데이터를 생성하도록 진화했을 것입니다. 예를 들어, 유명한 퍼징 도구인 American Fuzzy Lop은 사용자의 프로그램이 요구하는 구조 유형을 식별할 수 없으며, 가장 바깥쪽 계층을 기반으로 검색 알고리즘을 진화시켜야 합니다. 이 프로그램의 특징은 인터페이스 수준의 입력과 내부 모듈의 데이터 요구사항이 멀리 떨어져 있고, 외부 데이터는 보통 복잡한 변환 계층을 거쳐 내부 모듈이 요구하는 데이터 구조 유형으로 변환되기 때문에, 외부 계층에서 탐색하는 데 필요한 계산량과 시간은 상상할 수 없을 정도입니다. American Fuzzy Lop에 따르면, 정당한 SQL 문장을 생성하려면 프로그램의 내부 모듈을 며칠 만에 탐색해야 하며, 몇 분이나 몇 시간이 걸리지 않습니다. 또 다른 제약은 각 프로그램이 받을 수 있는 입력이 많은 규칙을 가진 신중하게 구조화되고 합집된 데이터이며, 무작위 + 탐색적 방법으로 데이터를 생성하는 것은 매우 비현실적이고 시간이 많이 소요된다는 점입니다. 따라서 블랙박스와 가장 바깥쪽 입력에서 자동 생성 사용 사례를 생성하는 것은 현실적으로 불가능합니다. 사용 사례 중심이 소프트웨어 내부 구조 분석에서 생성된다면, 소프트웨어의 컴파일 구조에 대한 깊은 이해가 필요합니다. 실행 가능한 테스트 케이스 생성 시스템은 프로그램의 중간 지점(키 진입점)을 가장 적합한 테스트 진입점으로 기반으로 해야 합니다. 이 모듈들의 입력은 퍼지 입력을 매우 구조화된 매개변수로 바꿔놓았습니다. 이러한 복잡한 구조를 식별할 수 있는 한, 복잡한 데이터 타입을 단계적으로 단순한 데이터 타입으로 축소할 수 있으며, 매개변수 생성도 동시에 완료할 수 있어 주행 유스케이스 생성도 자동으로 완료할 수 있습니다. 모듈 기반 테스트는 전통적인 단위 테스트로 분류할 수 있으며, R&D 단계에서 결함을 발견하고 통제하는 가장 좋은 방법입니다. 하지만 단위 테스트의 한계로 인해 많은 드라이버가 개발되어야 하며, 업계 내 홍보와 적용은 크게 제한됩니다. 물론 시스템 통합이 완료된 후에 가상 스텁 프로그램을 구축하지 않도록 단위 테스트도 실행할 수 있습니다. 며칠 전 세계 최초로 출시된 네뷸라스 테스팅스의 Wings 제품은 지능형 완전 자동화 단위 테스트 케이스 생성 시스템으로, 다음과 같은 문제들을 연구하고 해결했으며, 이제 여러분과 공유합니다. (1) 프로그램 매개변수에 대한 심층 분석 Wings는 컴파일러의 기본 기술을 사용하여 함수에 따라 입력 소스 파일을 기반으로 모듈 객체를 형성합니다. 객체는 함수의 입력 매개변수, 반환 값 유형 및 기타 정보를 포함하며, 드라이버 함수 모듈과 테스트 케이스 모듈에서 사용할 수 있습니다. 각 파일은 각 함수의 각 매개변수를 심층 분석하는 단위로, 중첩된 타입, 복합 타입 등에 대한 정확한 파싱과 분해를 구현하고, 복합 타입을 기본 데이터 타입으로 계층별로 설명하며, 매개변수 구조의 설명 파일(PSD)을 생성할 수 있습니다. (2) 모듈의 자동 생성 기능 PSD 파일의 형식 정보에 따르면, 테스트 대상 소스 프로그램의 모든 드라이버 함수가 자동으로 생성되며, 단위 테스트 프로세스는 개발자가 직접 테스트 함수를 작성하는 데 의존하지 않고, 생성된 드라이버 함수와 테스트 대상 소스 파일을 함께 컴파일하기만 하면 테스트 결과를 실행할 수 있습니다. 테스트 드라이버는 PSD 설명을 기반으로 프로그램을 자동으로 생성하고, 테스트 대상 테스트를 구동하는 모든 매개변수와 필요한 전역 변수를 완전 자동으로 구축하며, 복소 변수 계층 구조에 따라 구조화된 테스트 드라이버를 생성할 수 있어 단위 테스트 케이스 작성 시간을 크게 절약할 수 있습니다. (3) 테스트 데이터의 자동 생성 및 관리 이 도구는 테스트 함수에서 추출한 정보에 대응하는 테스트 데이터를 자동으로 생성하는 데 사용되며, 데이터는 특정 계층적 논리 관계를 가진 JSON 파일에 저장됩니다. 분해 및 전개 후 데이터와 데이터 타입은 서로 대응합니다. 사용자는 비즈니스 요구사항에 따라 이 데이터를 임의로 주변화시키고, JSON 파일을 사용해 구조적이고 계층적으로 표시할 수 있는데, 이는 매우 명확합니다. 테스트 데이터에는 전역 변수의 값과 테스트 대상 함수가 호출될 때의 매개변수 값이 포함됩니다. Wings는 운전자 기능을 자동으로 생성하는 단위 테스트 방법을 제공하며, 주로 다음 단계를 포함합니다: 그림 1: 유닛 테스트 기반 빌드 플로우 1 테스트 대상 프로그램의 정보 추출테스트 대상 프로그램의 구조 정보는 주로 프로그램 내의 전역 변수와 함수 정보를 포함하며, 함수 정보는 주로 함수의 매개변수 수, 매개변수 유형, 반환 값 유형을 포함합니다. 가장 중요한 것은 일부 복잡한 타입에 대한 심볼 정보와 타입 정보를 추출하여 기본 데이터 타입으로 층별로 분석하여 전역 변수와 함수 파라미터를 완성하는 것입니다. 변수 유형은 일반적으로 기본 유형, 구성 유형, 포인터 유형, 그리고 널 유형으로 나뉩니다. Wings는 기본 컴파일 기술을 사용하여 다양한 변수 유형을 다양한 방식으로 처리합니다. (1) 기본 타입, 예를 들어 부호 없는 int u_int=20, Wings는 변수 이름을 u_int, 데이터 타입을 부호 없는 int로 파싱합니다. (2) 구성 유형, 구성 유형은 대략 배열, 구조체, 커먼, 열거 유형으로 나뉩니다. ● 배열 타입, 예: intarray[2][3], 배열 이름은 배열, 타입 int 및 2D 배열 길이, 동작 2, 열 3입니다. ● 구조 유형, 배열, 구조 연결 리스트 등은 서로 다른 마커로 나뉩니다. (3) 포인터 타입, 예: int **ptr = 0; 는 해당 포인터를 int 타입의 레벨 2 포인터로 파싱합니다. (4) NULL로 해석되는 널 타입. (5) 파일, size_t 등과 같은 시스템 유형은 시스템 유형으로 표시되며, 템플릿에 추가되고 사용자가 할당합니다. (6) 함수 포인터 타입, 반환값 타입, 파라미터 타입 및 함수의 파라미터 수를 분석합니다. 테스트 대상 소스 프로그램의 각 컴파일 단위에 대해, 파싱된 함수 정보는 해당 PSD 구조에 저장되며, 다음과 같은 소스 코드 예시가 설명됩니다:
위 프로그램에서 StructTypeTest3를 무삭제 처리합니다(myy_struct mm_struct[2])저장된 PSD 구조는 다음과 같습니다:
PSD 파일 내 각 노드의 의미는 다음과 같습니다: ●StructTypeTest3는 함수 이름을, parmType0은 매개변수 타입을, parmNum은 매개변수 수를 나타냅니다 ●mm_struct는 함수 매개변수의 기호를, baseType1은 유형 분류(기본 데이터 타입, 구성 타입, 포인터 타입, 널 타입)를 나타내며, 타입은 정수, 차례, 쇼트, 롱, 더블, 플로트, 볼을 포함한 특정 타입과 부호가 없는 타입 및 기타 기본 타입을 나타냅니다. 그리고 다음과 같은 특별한 타입도 있습니다: ZOA_FUN 타입은 함수 타입을 나타냅니다. StructureOrClassType은 구조체 타입 등을 나타내며, name은 struct, union, enum 타입의 이름을 나타냅니다 ●i_int는 기본 타입을 나타내며, 이는 가장 작은 할당 단위입니다 ●array_one는 배열 타입을, RowSize는 배열의 길이를 나타내며, 배열은 1차원 배열, 2차원 배열 등으로 나눌 수 있습니다 ●point는 포인터 타입을 나타내며, 포인터는 1레벨 포인터, 2레벨 포인터 등으로 나뉘며, 일반 포인터는 배열로서 함수 매개변수로 사용되므로, 기본 포인터 유형에서는 동적 할당 배열 메서드를 사용해 값을 할당하고, 사용자는 필요에 따라 해당 값 파일을 수정할 수 있습니다. ● w는 비트 필드 유형을 나타내고, bitfileld는 숫자 수를 나타냅니다 ●functionPtr 는 함수 포인터 타입을 나타내며, 각각 매개변수 유형, 매개변수 수, 반환 값 정보를 분석합니다 ●Dem은 컨소시엄 타입을 의미합니다 ● dy는 enum 타입을, value는 ENUM 타입의 값을 나타냅니다 ●파일은 구조 유형을 나타내고, SystemVar는 이 변수가 시스템 헤더 파일 내 변수에 속함을 나타냅니다. 이 유형의 변수에 대해 Wings는 템플릿 라이브러리에 템플릿 변수를 추가하며, 사용자는 특정 필요에 따라 특별한 값을 할당할 수 있습니다. 예를 들어, 파일 형식은 다음과 같이 처리됩니다:
사용자들은 자신만의 과제 방법도 추가할 수 있습니다. 시스템 유형에 대해 윙은 일반 사용자 정의 유형과 구별할 수 있으며, 시스템의 내장 타입으로 파싱할 때 재귀 분석을 하하로 멈출 수 있습니다. ●g_int는 전역 변수를, globalType은 전역 변수를 나타냅니다 ●next는 연결 리스트 구조를 나타내고, NodeType은 이 구조를 연결 리스트로 나타냅니다 ●returnType은 함수의 반환값 타입을 나타냅니다. 2 자동 드라이버 생성위 논문에서는 전역 변수와 함수의 구조 정보를 분석하고 추출하며, 다음 정보를 PSD에서 저장하여 테스트 대상 소스 프로그램의 전체 구동 프레임워크 생성을 완성합니다. 발전은 주로 다음과 같은 측면으로 나뉩니다: Ø 전역 변수 선언 Ø 함수 매개변수의 할당 연산은 함수 매개변수의 수에 따라 차례로 값을 할당합니다 Ø 전역 변수의 할당은 분석에서 사용된 전역 변수 수에 따라 순차적으로 수행됩니다 Ø 원래 함수의 호출 다음과 같은 점들이 주목할 만합니다: ●드라이버 생성 과정 중에는 주 기능, 정적 기능 등 일부 특수 기능은 외부에서 접근할 수 없기 때문에 일시적으로 처리되지 않습니다. ● 테스트 중인 각 소스 파일에 대응하는 드라이버 파일이 생성됩니다. ● 드라이브 제어는 매크로를 통해 기능 테스트 횟수를 자동으로 구성할 수 있는 Driver_main.cpp에 포함되어 있습니다 위 소스 프로그램에서 생성되는 드라이버 함수는 다음과 같습니다: ● 모든 변수는 원래 변수 이름 앞에 이름이 붙어 _을 추가합니다 ●해당 테스트 데이터를 얻으면 변수들이 차례로 할당됩니다 ●시스템 내장 매개변수와 사용자의 특수 매개변수에 대해, 할당 방법은 템플릿 방식을 통해 균일하게 구성됩니다. ●테스트 대상 함수에 매개변수를 할당하고 호출합니다. 3 테스트 데이터는 자동으로 생성됩니다다음은 그림 3에서 PSD 형식으로 생성된 데이터 집합으로, 각 데이터 세트는 JSON 형식으로 저장되어 있어 데이터의 계층적 관계를 더 쉽게 확인할 수 있습니다.
각 컴파일 유닛마다 모든 함수에 대응하는 테스트 데이터 파일 세트가 기본적으로 생성되며, 값 생성은 구성 수에 따라 수정할 수 있습니다. 4 마이클프로그램 테스트 결과가 표시됩니다드라이버 프레임워크 생성을 완료하는 방법에 대해, 다음은 오픈 소스 프로그램 MySQL의 전체 생성 과정에 대한 자세한 설명입니다. 다음은 Wings 테스트용 Mysql의 주요 인터페이스 다이어그램입니다: 테스트 중인 소스 프로그램의 프로젝트 디렉터리를 설정하려면 파일 버튼을 클릭하세요. 설정이 완료된 후에는 주로 파라미터 파싱, 드라이버 생성, 값 파일 생성, 템플릿 추가를 포함하는 함수 연산을 클릭하세요. 분석을 위해 생성된 폴더는 다음과 같습니다: 그중 매개변수 파싱 모듈은 각각 추출된 컴파일 단위의 함수 정보와 전역 변수 정보를 저장하는 FunXml과 GlobalXml을 생성합니다. 드라이버 생성 모듈은 해당 폴더Wings_Projects 생성되며, 각 컴파일 단위의 드라이버 파일을 저장합니다 가치 생성 모듈은 각 컴파일 단위에 대해 생성된 테스트 데이터를 저장합니다. 다음 그림은 Mysql에서 로드된 드라이버 파일 구조 정보를 보여주며, 왼쪽의 내비게이션 트리는 생성된 드라이버 파일로, 각 컴파일 단위의 함수와 함수의 매개변수 및 전역 변수를 포함합니다. 컴파일 유닛 중 하나를 클릭하면 해당 드라이버 파일과 값 파일을 불러옵니다. 위 내용은 Mysql 전체 생성에 해당하는 드라이버 파일 및 값 파일이며, 드라이버 파일은 다음 코드에서 자세히 설명되어 있습니다. ● 각 컴파일 단위에 대해 전역 변수의 참조는 extern에 의해 이루어집니다. ●드라이버 기능은 일관되게 Driver_XXX 메서드로 불리며, JSON은 테스트 데이터를 얻는 방법으로 사용되며, times는 단일 함수의 테스트 횟수를 나타냅니다. ●각 매개변수 할당 연산에 대해, 파싱된 PSD 저장 형식을 사용하여 각 계층 구조에 값을 차례로 할당합니다. Wings의 적용은 매우 간단하며, 다음은 Visual Studio 2015에서 정상적으로 컴파일할 수 있는 Mysql 코드를 사용한 생성된 테스트 데이터의 통계적 인덱스입니다. 예를 들어, 전체 생성 과정은 수작업 개입이 필요 없으며, 생성하고 구동해야 할 소스 코드의 경로를 정하면 됩니다. MySQL테스트 데이터 | 마이클버전 | | | | | | | | 값은 생성하는 데 걸리는 시간에 의해 생성됩니다 | |
컴퓨터 구성 지침: | 운영 체제 | | | 인터(R) 코어(TM) i7-7700CPU 3.60GHz | | | | |
아래는 소스 코드 통계 도구를 사용해 얻은 결과로, Wings가 완전히 자동으로 생성한 400만 줄 이상의 유효한 단위 테스트 코드가 포함되어 있습니다. 더 흥미로운 점은 이 코드들을 수작업으로 개발하는 데 드는 비용이 최대 1,079 인월에 달하며, 비용은 1,079만 명에 달한다는 것입니다. Wings는 프로그램을 자동으로 생성하는 첫 번째 탐색 단계를 달성했으며, 첫 번째 버전이 현재 출시되었으며, 관심 있는 개발자들은 코드 클라우드 플랫폼(https://gitee.com/teststars/wings_release)에서 직접 다운로드할 수 있습니다. 상업용 라이선스는 한 달간 무제한 기능 체험 기간을 제공하며, Wings의 마법 같은 힘을 빠르게 경험할 수 있습니다. Wings C 언어 버전은 Visual Studio 등 여러 플랫폼을 지원합니다. VX웍스, GCC, QT 등등. Wings는 Nebulas 테스트(www.teststar.cc) 팀이 설계 및 개발했으며, 관심 있는 개발자들은 Codecloud의 인터랙티브 플랫폼을 통해 Nebulas 테스트 팀과 연락하여 디자인 아이디어와 제품 사용 피드백을 제공할 수 있습니다(훌륭한 제안이 채택된 경우 Nebulas는 최소 3개월간 무료 사용 기간을 연장할 수 있습니다). 윙스는 소프트웨어 품질을 크게 향상시키는 강한 근본적인 유전자를 가지고 있으며, 앞으로는 자동 작성 프로그램의 가독성(좋은 프로그래머의 작성 수준에 가깝게)과 C++ 언어 지원을 깊이 최적화할 예정입니다.
|