변경 영향 분석을 활용한 Ada의 회귀 테스트 문제 해결 방법

읽는 시간: 6 분
...

📝 원문 정보

  • Title: Addressing the Regression Test Problem with Change Impact Analysis for Ada
  • ArXiv ID: 1606.04568
  • 발행일: 2016-06-16
  • 저자: Andrew V. Jones

📝 초록 (Abstract)

회귀 테스트 선택 문제는 주어진 변경사항에 따라 테스트 스위트에서 일부를 선택하는 것인데, 이 문제는 지난 20년 동안 널리 연구되어 왔습니다. 하지만 고비판성 개발 환경에서는 "안전한" 테스트 선택이 필요한 상황에서 이 문제가 거의 주목을 받지 않았습니다. 또한, 프로그래밍 언어 Ada에 대한 실용적인 접근법은 아직 제시되지 않았습니다. 본 논문에서는 프로그램과 변경 세트에 대한 정적 및 동적 데이터의 조합을 사용하여 선택 문제를 해결하는 접근법을 소개합니다. 우리는 Ada에 대한 변경 영향 분석을 제안하며, 이는 회귀가 없는 상태에서 재실행해야 하는 안전한 테스트 집합을 선택합니다. 우리는 이러한 접근법을 상용 단위 테스팅 도구 VectorCAST에 구현하고 여러 오픈 소스 예제로 검증했습니다. Ada를 사용하여 완전 기능의 DNS 서버(IRONSIDES)에서 실험 결과는 97%의 테스트 사례 실행 감소를 보여주었습니다.

💡 논문 핵심 해설 (Deep Analysis)

This paper presents a novel approach to address the regression test selection problem for Ada, a programming language often used in high-criticality systems. The core idea is to leverage both static and dynamic data to perform change impact analysis, thereby automating the process of selecting which tests must be re-executed after a code change. Static data provides insights into how different components of the software are structured and interact without running any tests. Dynamic data, on the other hand, captures actual interactions during test execution. By combining these two types of information, the paper proposes an efficient method to identify the minimal set of tests that need to be re-run to verify changes in the software.

The methodology involves creating a dependency graph from static and dynamic analyses and then using this graph to determine which parts of the system are affected by any given change. This approach is implemented within VectorCAST, a commercial unit testing tool, and validated through experiments on open-source examples. The results show that 97% fewer test cases need to be executed for changes in Ada code. This significant reduction not only saves time but also ensures comprehensive coverage of the modified parts of the software.

The paper’s contributions are particularly important for developers working with safety-critical systems, as it provides a practical solution to minimize testing effort while ensuring that all necessary tests are performed. The approach could lead to more efficient and reliable testing practices in industries where high reliability is paramount, such as aerospace or automotive engineering.

📄 논문 본문 발췌 (Translation)

# 서론

1988년 Harrold & Soffa의 연구에서 Pascal 프로그래밍 언어를 대상으로 데이터 플로우 기반 접근법을 소개한 이래로, 회귀 테스트 실행 문제는 많은 주목을 받았습니다. 특히 최근 아젠다 프로세스가 등장하면서 테스트 주도 개발 및 연속 통합이 촉진되면서 개발자들은 수정된 소프트웨어를 빠르게 재테스트할 수 있는 방법에 대한 요구가 증가했습니다.

그러나 Ada라는 프로그래밍 언어에서는 이 문제 해결을 위한 연구가 거의 이루어지지 않았습니다. 1997년에 발표된 한 논문 외에는, 변경 영향 분석에 대해 다룬 논문은 존재하지 않습니다. 따라서 본 논문에서는 Ada를 사용한 시스템에 적용되는 테스트 케이스 선택 문제를 고려합니다.

[…] 수정된 소프트웨어의 동작을 검증하기 위해 어떤 테스트 케이스가 재실행되어야 하는지 결정하는 것

본 논문에서는 Ada 소스 코드에 적용되는 변경 영향 분석을 통해 회귀 테스트를 진행하는 방법의 타당성을 조사합니다. 이를 통해 개발자가 수정사항 후에 재실행해야 하는 테스트 수를 최소화할 수 있습니다.

우리의 Ada를 위한 변경 기반 테스팅 (CBT) 접근법은 다음과 같습니다. 먼저, 회귀 테스트 집합 $\mathcal{T}$와 원래 및 수정된 소스 코드에 대한 액세스가 존재한다고 가정합니다. 분석은 다음과 같이 진행됩니다.

  1. 원래와 수정된 소스 코드 간의 차이를 평가하여 변경 세트 $\mathcal{A}$를 구성합니다. 이 변경 세트는 인터페이스, 패키지 및 서브프로그램 수준에서 이루어진 변경사항을 포함합니다.
  2. 정적 데이터(코드 실행 없이 도출된 데이터)와 동적 데이터(기존 테스트 기반 $\mathcal{T}$의 실행으로 수집된 데이터)를 바탕으로 프로그램에 대한 중간 표현을 구성합니다. 이 중간 표현은 Ada 소스 코드의 종속성 그래프를 형성하는 기본이 됩니다.
  3. 변경 세트 $\mathcal{A}$와 중간 표현을 기반으로, 변경사항 $\mathcal{A}$에 의해 영향을 받는 테스트 집합 $\mathcal{T'} \subseteq \mathcal{T}$를 결정합니다. 우리는 VectorCAST의 내부 테스트 자동화 도구를 사용하여 변화세트 $\mathcal{A}$와 종속성 그래프 간의 대응 관계를 계산합니다.

단계 1에서는 주어진 변경 세트에 의해 수정된 패키지 및 서브프로그램의 하위 집합을 계산하는 데 중점을 두고, 단계 2는 소프트웨어 내에서 종속성을 확립하는 것을 목표로 합니다. 마지막으로 단계 3은 데이터를 바탕으로 그 동작이 변경사항에 의해 영향을 받는 테스트의 식별에 중점을 둡니다.

현재까지, 객체 지향 언어에 대한 변경 영향 분석 방법론들은 정적 또는 동적으로 도출된 종속성 그래프를 고려합니다. 본 논문에서는 정적 및 동적 분석으로부터 얻은 데이터를 모두 사용하는 하이브리드 접근법을 제안합니다.

  • 정적 종속성:

    1. 타입과 Ada 사양 종속성: 코드가 실행되지 않고도 패키지와 서브프로그램 간의 구조적인 관계를 나타냅니다.
    2. 패키지 및 서브프로그램 간의 직접적인 종속성을 나타내는 정보.
  • 동적 종속성: 실제 테스트를 실행하면서 얻어지는 데이터로, 서브프로그램 간의 호출 및 리턴 순서와 같은 동작을 보여줍니다. 이를 통해 실제로 어떤 패키지나 함수가 다른 패키지 또는 함수에 의존하는지를 파악할 수 있습니다.

이러한 접근법은 다양한 종류의 Ada 프로그램에 적용될 수 있으며, 특히 고비판성 분야에서 중요한 역할을 합니다.

[[IMG_PROTECT_1]] [[IMG_PROTECT_2]]

방법론

예제

다음과 같이 작은 Ada 프로그램을 살펴봅시다.

ADA
-- 패키지 A의 사양
package A is
   function Foo return Integer;
end A;

-- 패키지 B의 사양
package B is
   function Bar return Integer;
end B;
클릭하여 더 보기

패키지 AB 각각에는 단일 함수가 포함되어 있습니다. 패키지 A의 본문에서 B의 사양에 대한 외부 종속성을 사용합니다.

이 예제를 통해 정적 및 동적 데이터를 조합하여 종속성 그래프를 구성하는 방법을 살펴봅시다.

ADA
-- 패키지 A의 본문
package body A is
   Qux : Integer;
   
   function Foo return Integer is
   begin
      return Qux + B.Bar;
   end;

begin
   Qux := 0;
end A;

-- 패키지 B의 본문
package body B is
   Narf : Integer;
   
   function Bar return Integer is
   begin
      return Narf;
   end;

begin
   Narf := 0;
end B;
클릭하여 더 보기

AB 패키지는 각각 단일 함수를 포함하고 있으며, A의 본문에서 B의 사양을 사용합니다. 이를 통해 정적 종속성 그래프는 다음과 같이 구성됩니다.

[[IMG_PROTECT_3]]

다음으로, 테스트 케이스 $t$가 함수 Foo를 실행하는 것이라고 가정해봅시다. 이 경우 동적으로 실행되는 테스트 케이스는 함수 Bar에 대한 코드 커버리지를 얻게 됩니다.

[[IMG_PROTECT_4]]

마지막으로, 정적 및 동적 데이터의 결합 종속성 그래프는 다음과 같이 구성됩니다.

MATH
\texttt{Foo} \rightarrow \texttt{Bar} \rightarrow \texttt{B}
클릭하여 더 보기

따라서 패키지 B 본문에서 변경사항이 발생하면, 함수 Foo에 관련된 테스트 케이스가 영향을 받는다는 것을 계산할 수 있습니다.

선택 계산

테스트 케이스 선택 문제를 해결하기 위해 다음 알고리즘을 도입합니다.

ALGORITHM
Algorithm AffectedSubprograms(change, static_dependencies)
    impacted_subprograms = ∅
    found = ∅
    new = {change}

    while not new.empty() do
        next = new.pop()
        found = found ∪ {next}
        
        if next is a subprogram then
            impacted_subprograms = impacted_subprograms ∪ {next}
            
        successors = static_dependencies(next)
        unprocessed = successors \ found
        new = new ∪ unprocessed
        
    return impacted_subprograms
클릭하여 더 보기

이 알고리즘은 변경사항에 영향을 받는 서브프로그램의 집합을 계산합니다. 이를 바탕으로 필요한 테스트 케이스를 선택할 수 있습니다.

[[IMG_PROTECT_5]]

실험

제안된 방법론을 검증하기 위해 VectorCAST라는 상용 단위 테스팅 도구에 구현하고, 여러 오픈 소스 예제로 실험을 진행했습니다. 그 결과 Ada를 사용한 완전 기능의 DNS 서버(IRONSIDES)에서 97%의 테스트 사례 실행 감소가 확인되었습니다.

[[IMG_PROTECT_6]]

Reference

이 글은 ArXiv의 공개 자료를 바탕으로 AI가 자동 번역 및 요약한 내용입니다. 저작권은 원저자에게 있으며, 인류 지식 발전에 기여한 연구자분들께 감사드립니다.

검색 시작

검색어를 입력하세요

↑↓
ESC
⌘K 단축키