소프트웨어 테스트의 중요성
- 소프트웨어는 일상생활을 편리하게 하지만 문제가 발생하면 위험
- 사전에 문제 발생 최소화를 위한 충분한 시험 필요
소프트웨어 테스트의 정의
- 정적 테스팅
- 오류 발견 및 방지 목적의 프로그램, 문서 분석과정
- 동적 테스팅
- 오류를 발견하기 위해 프로그램을 실행하는 과정
- 품질 평가, 향상을 위해 프로그램을 실행하는 과정
- 신뢰성, 성능, 편의성, 접근성, 보안성, 안전성 등
테스트 진화 과정
오류, 결함, 오작동
용어 정의
- 실수(mistake): 요구사항 잘못 파악 / 오해, 철자 오류
- 오류(error): 프로그램의 올바르지 않은 내부 상태
- 선행 및 후속 조건, 무결성 위배 상태
- 기대 값과 실제 계산 값의 차이
- 결함(fault): 오류를 발생시키는 프로그램 부분
- 잘못된 정보 반영, 올바른 정보 누락
- 알고리즘 결함, 구현상의 결함
- 오작동(failure): 명세와 다른 동작이 나타나는 상황
- 예상 결과와 실행 결과의 차이
- 결함에 의해 발생하나, 반드시 발생하는 것은 아님
소프트웨어의 실수, 결함, 오류, 오작동 관계
예시
// 속도(s) = 거리(d) / 시간(t)
let s = d / t
print(s)
// 실수: 시간이 0인 경우에 대해 고려하지 않음
// 결함: 시간이 0인 경우에 대한 처리 코드가 없음
// 오류: 시간이 0인 경우에 예외 발생
// 오작동: 예외가 전달되어 프로그램 실행 중단
// * 시간이 0이 아니면 오작동 발생하지 않음 *
효과적인/좋은 테스트란?
소프트웨어의 오작동 발생 조건을 만족시켜야 함
- 도달성(rechability) 조건: 프로그램의 결함이 있는 부분을 실행해야 함
- 감염(infection) 조건: 결함 부분을 실행하여 오류를 발생시켜야 함
- 오류 전달(error propagation) 조건: 오류가 나타나는 지점까지 전달되어야 함
func double(param: Int) -> Int {
retVal = param * param// + 를 *로 입력 실수
return retVal
}
// 프로그램의 결함이 있는 부분까지는 도달했지만,
// 감염 조건을 불만족 함(오류 미발생)
double(param: 2)
테스트의 한계
완전한 테스트 불가능
- 모든 입력 조건 조합에 대하여 테스트 불가능
- '계산기' 프로그램에 대한 완전한 테스트
- 0+0, 0+1, ... 0+n, 1+0, 1+1, ..., 1+n, ...0+0+0, ... 등등 끝이 없음
- '계산기' 프로그램에 대한 완전한 테스트
- 테스트는 프로그램에 오류가 있음을 보여줄 수 있지만, 오류가 없음을 보여줄 수는 없다.
Program testing can be used to show the presence of bugs, but never their absence. -Dijkstra-
- 어떤 테스트를 선정할 것인가? (테스트 선정 기준)
- 언제 테스트를 종료할 것인가? (테스트 종료 기준)
테스트 선정 = 종료 = 적합성 기준
- 테스트 선정 기준을 만족하는 테스트 집합에 대해 프로그램이 올바르게 수행하면 오류가 남아 있을 가능성이 있더라도 테스트 종료
테스트 오라클
- 프로그램 실행결과가 올바른지 판단하는 매커니즘
- 수작업으로 수행(테스트 오라클의 자동 생성 불가능)
오라클 종류
- 진정한 오라클
- 모든 입력에 대해 원하는 결과 생성하여 오류 검출
- 대상 프로그램과 독립적인 알고리즘 사용 (고비용)
- 샘플링 오라클
- 특정 입력만 원하는 결과 생성 (제작 용이)
- 휴리스틱 오라클 (샘플링 오라클 +)
- 특정 입력은 올바른 결과 생성, 기타 휴리스틱 처리
- 일관성 검사 오라클 (regression test)
- 수정 전과 후의 프로그램 실행결과 비교
- 대부분의 상업용 테스트 도구에서 사용
'CS' 카테고리의 다른 글
[소프트웨어 공학] JUnit (0) | 2022.10.10 |
---|---|
[소프트웨어 공학] 소프트웨어 테스트 - 2 (0) | 2022.10.03 |
[소프트웨어 공학] 디자인 패턴 Design Pattern (0) | 2022.09.26 |
[소프트웨어 공학] 디자인 원칙 SOLID (0) | 2022.09.26 |
[소프트웨어 공학] 의존성 주입과 IoC (0) | 2022.09.26 |