StudyRepository
article thumbnail
728x90

 

 

 

 

 

동적 검증이란

 

 

 

 

활용 방안 설명에 앞서서 동적검증이란 무엇인지에 대해서 간략하게 말씀드리고 진행하도록 하겠습니다.

 

 

 

 

자동차 분야의 국제표준인 ISO 26262 파트6의 소프트웨어 개발 프로세스 기준으로 동적 검증을 소개해 드리겠습니다. 위에 보시는 개발 프로세스 기준으로 보았을 때 코드가 구현된 이후에는 소프트웨어 단위검증과 통합검증 그리고 임베디드 소프트웨어 검증이 순차적으로 이루어져야 합니다. 그 중에서도 동적 검증은 단위검증과 통합검증을 합쳐서 부르는 용어로 볼 수 있습니다.

 

표준에 의하면 각각의 검증 레벨에서는 안전 분석 레벨에 따라서 목표로 하는 커버리지가 나와 있습니다. 그래서 단위 시험의 경우에는 구문 커버리지 분기 커버리지 MC/DC를 이런 등급에 따라서 충족해야 될 기준을 명시하고 있습니다. 통합시험의 경우에는 함수 커버리지와 호출 커버리지를 명시하고 있습니다.

 

동적 검증은 이런 커버리지를 100% 만족하는 테스트 케이스를 수행하고 검증을 수행하는 그런 활동을 의미합니다.

검증 프로세스 관점으로 보시면 최초에는 시험 환경을 구축하고, 그 다음에 소스코드를 분석해서 테스트 케이스를 설계합니다.

테스트 케이스를 설계할 때에는 앞서 말씀드린 것처럼 목표로 하는 커버리지를 100% 충족할 수 있는 테스트 케이스들을 만들도록 하며 설계하고 있고, 그 다음에는 실제 소스코드에 적용해서 수행을 한 다음에 커버리지를 충족하지 못하는 오류가 있을 경우에는 결함으로 도출해서 레포트로 작성을 하고 충족할 수 있는 부분의 경우에는 코드를 추가적으로 분석해서 테스트 케이스를 반복적으로 생성 수행하면서 목표를 달성할 수 있을 때까지 반복 수행합니다.

 

이런 프로세스 관점으로 봤을 때 챗 GPT를 어떻게 적용할 수 있을까에 대해서 고민을 좀 해보게 되었습니다.

 

 

 

 

 

 

"크게 두 가지 관점에서 적용을 할 수 있을 것 같다" 라는 결론을 얻었습니다.

 

먼저 "소스 코드를 분석해서 테스트 케이스를 자동으로 생성하는 방법을 적용해서, 소스코드 분석 및 테스트 케이스 설계 자동화 부분에 있어서 적용을 할 수 있을 것 같다" 라는 판단을 하게 되었고,

 

또 다른 관점으로는 "이슈를 GPT가 분석해주는 내용을 기반으로 해서 상세 설명을 참고하고 그걸 기반으로 레포트를 작성할 수 있으면 도움이 될 수 있을 것 같다" 라는 생각을 하게 되었습니다.

 

각각의 적용 방안을 좀 더 상세하게 말씀드리겠습니다.

 

 

 

 

 

 

 

소스코드 분석 및 테스트 케이스 설계 자동화

 

 

 

 

 

 

 

먼저 소스코드 분석 및 테스트 케이스 설계 자동화 부분입니다.

어떻게 자동화를 할 것인가에 대해서 고민을 해보았습니다.

 

챗 GPT에 검증 대상이 되는 소스코드와, 필요로 하는 테스트 케이스를 만들어 달라는 프롬프트를 입력해서 테스트 케이스를 설계할 수 있었습니다.

 

예시로 MC/DC 100%를 충족하는 테스트 케이스를 만들어 달라는 프롬프트로 요청을 해본 예시인입니다. 아래와 같이 테스트 케이스가 표 형태로 출력되는 것을 확인할 수 있었습니다. 그래서 이렇게 출력된 테스트 케이스를 검증 도구에 임포트 시켜서 수행 할 수 있다면, 테스트 엔지니어가 수동으로 하는 부분을 자동화할 수 있을 것으로 판단이 되었습니다.

 

 

 

 

 

 

레포트 작성 활용

 

 

 

 

다음으로는 레포트 작성 활용과 관련된 부분입니다.

마찬가지로 챗 지피티에 대상이 되는 소스코드와 결함을 찾는 프롬프트를 입력을 해서 상세 분석 내용을 확인할 수 있었습니다.

 

예시는 "MC/DC를 충족하지 못하는 사유를 설명해 주세요" 라는 프롬프트를 입력한 것입니다, 이렇게 입력을 했을 때 왜 충족할 수 없는지 코드 구조적인 관점의 오류를 상세하게 분석해주는 것을 확인할 수 있었습니다.

 

실제 레포트 작성 시에, 분석 내용을 기반으로 해서 레포팅을 할 수 있을것이라는 판단을 하게 되었습니다.

 

 

 

 

 

CT에서의 활용

 

 

 

 

다음으로는 단위 테스트 자동화 도구인 CT에서 챗GPT 활용 사례에 대해 말씀드리겠습니다.

 

첫 번째 사례로 테스트 실행시 오류가 발생했을 때 원인 파악에 대해 도움을 받는 경우입니다.

화면과 같이 ct에서 테스트를 수행하다 보면 붉게 표시된 테스트 케이스가 있습니다.

이는 테스트 수행도 중 오류가 발생한 테스트 케이스입니다.

 

오류가 발생한 원인으로는 널 포인터 참조, 잘못된 주소값으로의 접근, 무한루프 등 다양한 원인이 있으며 원인을 파악하는데 많은 시간이 소요되는 경우가 있습니다.

 

 

 

 

 

 

 

이 테스트 오류의 원인을 파악하기 위해 챗 GPT에 전달할 정보로는 먼저 테스트 대상 코드 조각을 수집하였습니다.

 

이 코드 조각에는 대상 함수의 전체 코드 그리고 함수에서 사용된 타입의 선언코드, 이 함수에서 호출된 함수의 선언 코드입니다 추가로 CT에서 수행된 CT test 코드와 테스트 코드에 사용된 인풋값을 정보로 주었습니다.

 

프롬프트 내용으로는 해당 테스트 함수가 수행되었을 때 문제가 될 수 있는 부분을 답할 수 있도록 유도하였습니다.

 

GPT로 받은 답변에서 오류의 원인을 확인할 수 있었습니다. 보시는 것과 같이 실제 수행코드에서 for문이 수행되며 참조하는 배열의 크기가 수행되는 횟수보다 작아서 오류가 발생하였다고 알려주었습니다.

 

이어서 이 오류를 수정할 수 있는 기존 테스트 코드를 수정할 수 있도록 추가 질문을 하였습니다.

 

 

 

 

 

추가 답변으로 인풋 파라미터의 초기화 코드를 답변한 것을 확인하실 수 있습니다.

이 답변의 테스트 코드를 CT의 테스트 코드에 맞게 수정해서 다시 CT에서 테스트를 수행하였습니다.

 

 

 

 

 

 

 

 

보시는 것과 같이 CT에서 오류 없이 정상적으로 테스트가 수행된 것을 확인하실 수 있습니다.

 

다음으로는 커버리지에 올리기입니다. 방금 전에 코드를 오류 없이 테스트 수행하였다고 하여도 보시는 화면과 같이 ct에서 생성한 테스트 케이스에서 커버하지 못한 구문들이 다수 있습니다.

 

이 커버되지 않은 구문을 수행할 수 있는 테스트 케이스를 만들 수 있을 것이라고 예상하고 프롬프팅을 하였습니다.

 

 

 

 

 

전달할 정보로는 방금 전에 테스트 오류 원인 파악 시 사용했던 동일한 테스트 대상 코드조각을 수집하였고, 추가적인 질문의 내용으로 커버 목표가 되는 라인을 알려주고 커버하기 위해 사용되는 대상 함수의 파라미터에 대한 초기화 코드를 생성하도록 유도하였습니다.

 

목표가 되는 부분은 우측 계산 코드에 표시된 브레이크 문으로 지정하였습니다.

 

프롬프팅 결과로 두 가지의 초기화된 파라미터 코드와 해당 파라미터로 테스트 대상 함수를 호출하는 테스트 코드를 얻을 수 있었습니다.

 

그 중에서 하나의 코드로 CT 내에 테스트 코드를 작성해서 CT에서 다시 테스트를 수행하였습니다.

 

 

 

 

수행 결과로 테스트 케이스 1개만으로 대부분의 코드가 커버된 것을 확인하실 수 있습니다.

 

 

 

 

생성형 ai를 테스팅에 활용함에 있어 한계점으로는 할루시네이션이라는 정확성과 신뢰성이 문제가 있습니다.

생성형 ai가 항상 올바른 답을 내놓지 않는다는 것을 명확히 인지하고 생성된 결과물에 대한 철저한 검토가 필요하겠습니다.

 

두 번째로 비용 문제입니다.

생성형 AI 특히 거대 언어 모델을 사용할 때마다 상당한 컴퓨팅 비용이 발생합니다.

그렇기 때문에 효율적으로 프롬프트를 작성하고 활용하는 것이 중요합니다.

 

세 번째로 리소스의 제약입니다.

gpt와 같은 거대 언어 모델의 경우 프롬프트에 사용할 수 있는 글자 수 제한이 있습니다.

이로 인하여 많은 내용의 문서 또는 대량의 코드는 학습할 수 없습니다.

그래서 단위 테스트 외의 다른 테스트 활동에서는활용의 제약이 있을 수 있습니다.

 

네번째로 보안 문제입니다.

지피티에 기업의 민감한 정보를 전달할 경우 정보 유출의 우려가 있습니다.

그래서 기업에서는 자사의 코드 정보에 기반한 프롬프트를 활용하는 것에 대해 제약이 있을 수 있습니다.

 

 

 

그럼에도 불구하고 위의 한계점들을 보완하고 극복해서 잘 사용할 수 있다면, 번거로운 일이나 단순 작업은 생성형 ai에 맡기고 개발자는 좀 더 효율적이고 생산적인 테스트 활동에 집중할 수 있습니다.

또한 적은 수작업으로 일관되고 품질이 높은 테스트 코드를 작성할 수 있습니다.

그리고 앞서 말씀드린 리그레션 테스트 수행시 불필요한 테스트를 실행하지 않는 경우와 같이 컴퓨팅 리소스 및 시간을 절약할 수 있습니다.

 

 

 

 

 

 

 

 

 

728x90

'코드검증' 카테고리의 다른 글

구조적 커버리지  (0) 2023.09.05
profile

StudyRepository

@Minseo26262

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!