본문 바로가기

23년 2학기 학교공부/소프트웨어공학

[SE] 소프트웨어 테스트

목차

    728x90
    반응형
    SMALL
    2023학년도 2학기 충남대학교 김현수 교수님의 소프트웨어공학 수업 정리자료입니다.

     

     

     

     

    📁 기본 용어 정리

     

    소프트웨어 테스팅에 대해 알아보기 전에, 테스팅 과정에서 쓰이는 용어를 정리해보자.

     

    1. 실패(failure)

    실패란 시스템에 나타나는 용납될 수 없는 행위(unacceptable behavior)를 말한다.

    실패는 명세와 실행 동작의 차이(?)

    신뢰도(reliability)는 실패의 횟수를 기반으로 측정된다.

    중요한 설계 목표는 매우 낮은 고장률과 높은 신뢰성을 달성하는 것이다.

     

    2. 결함(defect)

    하나 이상의 장애 발생에 기여하거나 잠재적으로 기여할 수 있는 시스템 측면의 결함(flaw)을 말한다.

    특정 실패는 몇 가지 결함에 의해 유발될 수 있다.ㄷ

     

    3. 오류(error)

    결함을 발생하게 하는 소프트웨어 개발자의 잘못(slip-up) 또는 부적절한 결정(inappropriate decision)을 말한다.

     

    4. 테스팅

    시스템이 정해진 요구사항을 충족하는지, 예상과 실제 결과가 어떤 차이를 보이는지 수동 혹은 자동으로 검사하는 일련의 과정을 말하며 IEEE에 정의되어 있다.

     

    테스팅의 목적은 다음과 같다.

    • 남아있는 결함 발견
    • 명세 충족 확인
    • 사용자 및 비지니스의 요구 충족 확인
    • 논리적 설계의 구현 검증
    • 시스템과 소프트웨어가 적절히 동작함을 확인
    • 품질 수준에 대한 자신감을 획득하고 정보를 제공

     

    5. 테스트 케이스

    결함을 발견할 목적으로 준비한 입력 데이터와 예상 결과의 집합을 말한다.

     

    테스트 케이스의 구성은 다음과 같다.

    • 이름 혹은 ID
    • 테스트 대상 : 단위 프로그램의 기능, 서브 시스템, 클래스, 메소드 등
    • 테스트 조건 : 테스트를 가능하게 하는 조건
    • 테스트 입력 : 입력 데이터나 명령어의 집합
    • 테스트 예상 결과 : 예를 들어 테스트의 성공실패를 판단하는 매커니즘인 테스트 오라클

     

    예를 들어 인터넷 쇼핑몰 소프트웨어 시스템의 테스트 케이스는 다음과 같다.

     

     

     

     

    🌙 효과적인 테스팅과 효율적인 테스팅

    • 효과적인 테스트(test effectively) : 전략을 사용하여 가능한 한 많은 결함을 발견해야 함
    • 효율적인 테스트(test efficiently) : 가능한 가장 적은 수의 테스트를 사용하여 최대한 많은 수의 결함을 찾아야 함

    테스터는 결함을 더 잘 찾기 위하여 프로그래머와 설계자가 어떻게 생각하는지 이해하려고 노력해야 함 – 테스터는 모든 것을 의심해야 함 – 테스터는 과도한 시간을 들이지 않아야 함. 즉 효율적이어야

     

     

     

     

    🌙 결함의 사례

     

    1. 부정확한 논리 조건(Incorrect logical conditions)

    루프 혹은 if-then-else문을 제어하는 논리적 조건이 잘못된 경우를 말한다.

    테스트 전략으로 동등 분할 기법이나 경계값 분석 기법을 사용하여 규칙이나 논리 조건에서 사용되는 각 변수에 대한 입력을 고려하는 방향으로 테스트할 수 있다.

     

     

    2. 제어 구조의 잘못된 부분에서 계산 수행

    프로그램이 수행하지 않아야 할 작업을 수행하거나, 수행해야 할 작업을 수행하지 않는 경우를 말한다.

    일반적으로 루프 혹은 if문에서 작업을 부적절하게 제외하거나 포함시켜 발생한다.

     

    각 루프를 0번, 한번, 두번 이상 실행하도록 각각의 테스트케이스를 만들고, 반복하는 동안 일어날 수 있는 일을 첫번째, 중간 단계, 마지막 반복에서 발생하도록 만들어 테스트한다.

     

    예를 들어, 위와 같은 코드를 보자.

    원래는 매 반복마다 someOperation의 결과를 체크하여 그 결과값이 -1이면 시그널을 발생하도록 하려고 했지만, 위와 같이 코드를 작성하면 마지막 반복의 결과가 -1인 경우에만 시그널을 발생시킬 수 있다는 결함이 발생한다.

     

     

    3. null 조건을 처리하지 않음.

    null 조건을 만나서 프로그램이 비정상적으로 작동하는 경우를 말한다.

     

    다양한 조건을 생각하기 위해 브레인스토밍을 진행하여 비정상적인 조건을 결정하고 적절한 테스트를 한다.

     

     

    4. Off-by-one 오류

    프로그램이 부적절하게 1을 더하거나 빼는 경우, 혹은 루프가 한 번 더 반복되거나 한 번 덜 반복되는 경우를 말한다. 매우 일반적인 유형의 결함이다.

     

    올바른 수치 답변을 계산하는지 확인하는 테스트케이스를 만들거나, 올바른 반복 횟수를 수행하는지 확인하는 테스트 케이스를 만들어 테스트를 진행한다.

     

     

    5. 충분한 비트 또는 digits를 사용하지 않음.

    시스템이 저장할 수 있는 가장 큰 값을 표현할 수 있는 변수를 사용하지 않는 경우를 말한다.

    용량이 초과되면 예기치 않은 예외가 발생하거나 데이터가 올바르게 저장되지 않을 수 있다.

     

    매우 큰 숫자를 사용하여 테스트해서 시스템에 충분한 오류 마진이 있는지 확인한다.

     

    이러한 결함의 예시로 아리안 로켓 발사 사고가 있는데, 64비트 부동소수점 수를 16비트의 정수로 변환하였다.

     

     

    6. 부동 소수점 값이 다른 값과 정확히 같다고 가정함.

    부동 소수점 값에 대해 산술 계산을 수행하면 결과가 정확하게 계산되는 경우는 드물다.

    동등(equality)을 check하기 위해 두 값이 정확하게 같은지 비교하면 올바르지 않은 결과가 발생할 수도 있다.

     

    부동 소수점 값의 연산에서 동등을 check하려면 그 값 주변의 작은 범위 내에 있는지를 check해야한다.

    경계테스트는 이러한 유형의 결함을 감지할 수 있다.

     

     

     

     

     

    📁 소프트웨어 테스트 기법

     

    1. Black Box 테스트 기법

    소프트웨어의 내부 구조나 작동원리를 모르는 상태에서 동작을 검사하는 방식으로, 올바른 입력과 올바르지 않은 입력을 입력하여 올바른 출력이 나오는지 검사한다.

     

    주어진 명세(일반적으로 모델의 형태)로부터 테스트 케이스를 유도하여, 해당 테스트 케이스를 수행해서 중대한 결함이 없음을 보장하는 기법을 말한다.

     

    테스트 기법에는 동등 분할과 경계값 분석이 있다.

     

     

    1) 동등 분할(Equivalence partitioning)

    입력 값 영역(input space) 또는 출력 값 영역(output space)을 유한개의 상호 독립적인 집합(Mutual disjoint subset)으로 나눈 뒤, 이렇게 구한 각 등가 집합의 원소 중 대표 값 하나를 선택하여 테스트케이스로 선정한다.

     

    동등 분할 클래스는 유효한 입력 데이터와 유효하지 않은 입력 데이터(입력 되지 말아야 할 값)으로 분류할 수 있다.

     

     

    동등 분할 기법에서 테스트케이스를 선정하는 사례에는 식료품점의 전산화 사례가 있다.

    식료품의 무게는 0 ~ 5000 값을 갖는 숫자라고 가정하자.

     

    오른쪽과 같이 input data를 선정하였을때, 동등 분할 클래스는 다음과 같이 분류된다.

    • 유효한 데이터 : 240.0 (0~5000 사이의 값 및 숫자)
    • 유효하지 않은 데이터 : -50, 5200 (0~5000 범위 밖의 숫자), 50%(숫자가 아님)

     

    – Test Driver • 테스트 대상 컴포넌트를 호출하는 시스템을 대신하여 간단히 구동하도 록 작성된 프로그램 • 테스트 입력을 테스트 대상 컴포넌트에 전달하고 결과를 출력함 – Test stub • 테스트 대상 컴포넌트에 의해 호출되는 컴포넌트를 시뮬레이션 한 것 • 원래 컴포넌트와 같은 API를 가져야 하며, 메소드 프로토타입에 맞는 리 턴 타입을 제공해야 함

    – IUT(implementation under test) void SetWeight(int w) { …. } – Test Driver main( ) { fd = open_testcase( ); while(!EOF(fd)) { weight = read_testcase(fd); SetWeight(weight); fd++; } }

     

     

     

     

    2) 경계값 분석(Boundary value analysis)

    동등분할의 경계부분에 해당되는 입력 값에서 결함이 발견될 확률이 경험적으로 높기 때문에 경계 값을 테스트 케이스로 선택하는 기법을 말한다.

     

    이때 경계값이란 해당 분할 영역의 최소값과 최대값을 말하며, 유효 경계값과 비유효 경계값으로 나뉜다.

    • 유효 경계 값 : 유효한 분할영역의 경계 값
    • 비유효 경계 값 : 유효하지 않은 분할영역의 경계 값

    예를 들어 input range가 1<= w <= 100인 경우, 아래 그림과 같이 경계값은 0, 2, 99, 101이 된다.

     

     

     

     

    2. White Box 테스트 기법

    화이트 박스 테스팅 기법이란 소프트웨어나 시스템의 코드와 구조를 중심으로 테스트하는 기법을 말한다.

    • 컴포넌트 레벨의 구조 : 구문, 결정, 분기문 등 코드 그 자체
    • 통합 레벨의 구조 : 한 모듈이 다른 모듈을 호출하는 고나계를 도식화한 호출 트리(Call tree) 등
    • 시스템 레벨의 구조 : 메뉴 구조, 비즈니스 프로세스 또는 웹페이지 구조

    테스트 기법 및 커버리지에는 구문 커버리지, 결정 커버리지, 조건 커버리지, 다중 조건 커버리지가 있다.

     

    1) 구문 테스팅 및 커버리지(Statement testing and coverage)

     

    2) 결정 테스팅 및 커버리지(Decision testing and coverage)

     

    3) 조건 테스팅 및 커버리지(Condition testing and coverage)

     

    4) 다중 조건 커버리지(Multiple condition coverage)

     

     

     

     

     

    📁 소프트웨어 테스트 종류

    소프트웨어 테스트의 종류에는 단위 테스트, 통합 테스트, 시스템 테스트, 인수 테스트 등이 있고, 다음과 같은 단계로 진행된다.

     

     

    1) 단위 테스트(unit test)

    프로그램의 기본 단위인 모듈에 대한 테스트로, 각 모듈의 인터페이스, 자료구조, 경계 조건, 제어흐름, 오류 처리 등을 확인한다. 주로 화이트 박스 테스트를 이용한다.

     

    2) 통합 테스트(integration testing)

    모듈들을 통합하는 과정에서 수행하는 테스트로, 통합 과정에서 발생할 수 있는 오류를 확인한다. 예를 들면 전역 변수를 부정확하게 사용하거나, 컴포넌트 간 인터페이스와 관련된 결함을 찾는다.

     

    3) 시스템 테스트(system testing)

    기능 테스트와 비기능 테스트로 나뉘며, 비기능 테스트에는 성능 테스트, 보안 테스트, 스트레스 테스트 등이 있다.

     

    4) 인수 테스트(acceptance testing)

    시스템이 고객의 요구대로 잘 작동하는지 고객과 함께 확인한다.

     

     

     

     

     

    📁 소프트웨어 테스트 전략

    대형 시스템에서 사용하는 테스트 전략에는 빅뱅 테스트, 점진적 통합 테스트 등이 있고, 그 중 점진적 통합 테스트 방법에는 하향식 테스트, 상향식 테스트, 샌드위치 테스트 등이 있다.

     

    빅뱅 테스트에서는 전체 시스템을 하나의 단위로 테스트하지만, 대부분의 경우 더 나은 전략은 점진적 테스트(incremental testing)이다.

     

    점진적 테스트는 개별 하위 시스템을 개별적으로 테스트하고, 점점 더 많은 서브시스템을 최종 제품에 추가하면서 테스트를 계속하는 방식으로 동작하며, 아키텍처에 따라 수평적 혹은 수직적으로 수행할 수 있다.

     

    1) 하향식 테스트

     

    2) 상향식 테스트

     

    3) 샌드위치 테스트

     

     

     

     

    728x90
    반응형
    LIST