[SE] Software Testing : Code Coverage

parkheeddong·2023년 6월 7일
1

Software Engineering

목록 보기
7/19
post-thumbnail

👀 소프트웨어 테스팅이 왜 필요할까?

소프트웨어가 무수하게, 우리 사회의 어디에나 있는 만큼 동시에 소프트웨어 버그도 어디에나 있기 때문이다.

Ariane 5는 가장 유명한 software failure다. 거의 10년이 걸려서 7조에 가까운 돈을 투자해서 만든 로켓인데, 매우 간단한 소프트웨어 버그(data conversion 문제)로 37초만에 폭발했다.

➡ 우리의 시간, 돈, 생명을 위해서 소프트웨어 버그를 미리 찾아야 한다! 이를 위해 소프트웨어 테스팅 기술이 필요하다.

🌳 소프트웨어 테스팅과 코드 커버리지

소프트웨어 버그를 찾기 위한 자동 입력 생성 기술이다. (Automatic Input Generation)

소스코드, 실행파일을 통해서 오류를 유발하는 테스트 케이스를 만드는 것이 목표이다.

그러나 현실적으로 산업용 소프트웨어는 수백만줄이기 때문에, 실제로 오류에 도달하는 테스트 케이스를 만들기는 쉽지 않다..

따라서 대체 목표로서 "코드 커버리지"를 올리는 기술을 만드는 것을 목표할 수 있다.
✅ 코드 커버리지란 실제 코드를 실행해보는 것을 의미한다.

"프로그램에서 코드를 더 많이 실행할수록, 더 만흔 오류를 찾을 수 있을 것이다" 라는 가설 때문이다.
자율주행 자동차의 소프트웨어가 천만줄일때, 백만줄만 실행해본 경우와 9백만줄 실행해본 경우 중 후자가 더욱 더 안심되게 느껴질 것이다.

따라서 궁극적으로 오류를 찾기 위해서, 코드 커버리지를 높이도록 한다.

🌱 코드 커버리지

1) Line Coverage

전체 프로그램의 라인 중 실제 실행한 라인의 수

(90, 10)에서의 라인 커버리지는 4/6이다.
➡ 전체 줄을 모두 실행해보기 위한 테스트케이스는 최소 몇개일까?!
1번이다. (90, 25)일 경우 코드 커버리지는 6/6이다.

2) Branch Coverage

전체 브랜치 중 실제 실행한 브랜치의 개수

브랜치 수 = if/while문의 개수 X 2

위 경우 4가지의 브랜치가 있다.
➡ 4개의 브랜치를 모두 실행해보기 위한 테스트케이스는 최소 몇개일까?
2개이다. (90, 25) (0,0)이면 모두 실행해볼 수 있다.

3) Path Coverage

프로그램의 실행 경로 개수 중 실제 실행된 경로의 개수
Path의 개수 = 2 ** if/while문 개수
예외를 제외하고, if/while문의 개수에 exponential하게 늘어난다.

➡ 위 경우 path를 모두 실행하기 위한 최소 테스트케이스의 개수는?
4개이다. (90, 25), (90, 0), (0, 25), (0, 0)

➡ if문이 한 개 더 추가된다면?
테스트케이스가 8개 필요할 것이다.(exponential 증가)

➡ 어떤 경우에 exponential하게 증가하지 않을까?

if (x == 90)
	if (y == 25)

와 같이 nested if문 형태일 경우 path는 3개이다.

💨 커버리지 비교

일반적으로 path 커버리지를 커버하는 것이 브랜치 커버리지를 커버하는 것보다 더욱 어렵다.가장 쉬운 것은 라인 커버리지를 올리는 일이다.
그러나 path 커버리지는 오류를 찾는 관점에서는 더욱 더 좋다

🌳 소프트웨어 테스팅 방법

📌 블랙박스 테스팅
소스코드의 내부를 보지 않고 만들어내는 방법이다.(fuzzing)
소스코드를 보지 않기 때문에 실행파일만 있으면 된다.
매우 빠르고, 저렴한 방법이다.
그러나 매우 naive한 방식이다.

📌 화이트박스 테스팅
소스코드의 내부를 보며, 커버리지를 높일 수 있는 테스트케이스를 만드는 것이다.
더욱 더 비싸지만, systematic한 구조이다.

📌 그레이박스 테스팅
두 개의 조합으로서, 소스코드의 일부 정보만 보고, 빠르게 얻을 수 있는 정보만 이용하여 테스트케이스를 만드는 것이다.

0개의 댓글