구현

포트란 : 초창기 언어, 과학기술 계산용. 우주항공 분야에 사용

베이직 : 교육용 언어, 개발환경 시각적, 초보자가 익히기 쉬움

C : 명령형 언어, 모든 환경에서 사용 가능

C++ : C언어에 객체지향의 개념을 더한 언어

C# : 마이크로소프트가 .NET 플랫폼을 위해 만든 객체지향 언어. 유니티가 스크립트 언어로 채택하면서 게임 개발에도 널리 쓰임

자바 : 대형 전산실의 업무용 프로그램. 소스코드를 컴파일하면 플랫폼과 무관한 바이트코드가 만들어지고, 이 바이트코드를 플랫폼마다 따로 구현된 JVM(자바가상머신)이 해석해 실행한다. 플랫폼에 독립적인 것은 컴파일 결과물인 바이트코드이고, 플랫폼에 의존하는 부분은 JVM이 흡수한다

C 코딩 규칙

강의에서는 표준 코딩 규칙으로 다뤘다. 아래 규칙은 포인터 명명과 비트 필드, unsigned 접미사, 매크로 표기처럼 C 계열 언어를 전제로 한다.

  • 변수명과 함수명은 31자 이내로 정한다
  • 변수명과 함수명은 서로 다르게 짓는다
  • 매크로명, 상수명 : _와 대문자
  • 변수명, 함수명 : 소문자로 시작 / 함수의 첫 번째 단어는 동사로(ex. getData())
  • 포인터명 : 참조하는 변수명 앞에 p를 붙인다(ex. pname)
  • 소스파일 하나는 200줄 이내
  • 한 줄의 길이 80자 이내
  • 함수의 내용 70줄 이내
  • 여는 중괄호 {는 문장의 끝, 닫는 중괄호 }는 문장의 맨 앞
  • 용도가 같은 변수는 한 줄에 작성
  • 부호 없는 자료형은 끝에 u를 붙인다 → unsigned data type
  • 비트 필드는 unsigned/signed int형으로만 선언한다
    • 비트 필드 : 구조체 내에서 정수형 변수에 할당된 비트 수를 명시적으로 선언하는 방법
    • unsigned int count : 5;
  • 8진수는 사용하지 않는다
  • 값이 바뀌지 않는 값에는 const 변수를 사용한다
  • .(dot) 연산자와 단항 연산자(++, --)는 붙여 쓴다
  • + - * /는 공백을 넣는다
  • 삼항 연산자(?:)는 맨 앞 수식을 괄호로 묶어준다
    • (a > b) ? x : -x;
  • switch문에서 빠져나오기 위해 break문을 한 번만 사용하고, 다 끝나면 default문에서 후속 처리한다
  • goto문 사용 금지

테스트

IEEE의 정의 : 예상된 결과와 실제 결과가 어떤 차이를 보이는지 수동이나 자동으로 검사하고 평가하는 작업

소프트웨어 테스트 : 숨어있는 오류를 발견할 목적. 개발 과정에서 생성되는 문서나 프로그램에 있는 오류를 여러 기술을 이용해 검출하는 작업

테스트가 어려운 이유

  • 완벽한 테스트 케이스를 도출하기 어렵다
  • 실제 사용 환경을 구축하기 어렵다

테스트의 원리

  • 개발 단계까지 함께 진행한다
  • 개발자와 다른 별도의 팀에서 수행한다
  • 파레토 원리 : 20%의 원인이 80%의 결과를 만든다. 오류도 일부 모듈에 집중되어 발생한다
  • 살충제 패러독스 : 같은 테스트 케이스를 반복하면 더 이상 새로운 결함을 찾지 못한다(테스트 내성)
  • 요르돈의 법칙 : 개발 초기에 테스팅하지 않으면 비용이 커진다
  • 오류-부재의 궤변 : 요구사항을 충족시키지 못한다면, 결함이 없어도 품질이 높다고 볼 수 없다

오류 : 개발자에 의해 만들어지는 실수

결함 : 오류에 의해 프로그램이 완전치 못한 것. 주로 필요없는 정보나 필요한 정보가 없는 경우

→ 모든 결함이 반드시 실패를 유발하지는 않음

테스트 절차

SW와 전체 시스템 테스트는 계획 → 케이스 설계 → 실행 및 측정 → 결과 분석(수정 가능한지 불가능한지) → 오류 추적 및 수정 순서로 진행한다.

  1. 계획
    • 업무 시스템별로 구분
    • 요구분석명세서 기반으로 테스트할 목표를 정의. 우선순위 파악
  2. 설계
    • 입력값으로 할 원시 데이터(sampling) 작성
    • 문제에 적합한 테스트 기법 선정
  3. 실행 및 측정
    • 테스트를 실시하고, 실행 결과를 문서화
    • 환경 구축
    • 계획 대비 결과를 비교·분석하고 보고서를 작성
  4. 결과 분석
    • 결과값 VS 목표값(계획 단계) 비교
    • 테스트 결과 보고서 작성 : 테스트 수행 결과, 사용된 방법, 평가, 권고사항 등
  5. 오류 추적 및 수정
    • 오류 위치, 종류 확인. 제거 계획 수립
    • 디버깅 도구 등을 이용해 오류를 수정
    • 수정된 코드를 검토한 후 오류 수정 결과 보고서 작성

시각에 따른 테스트

  1. 검증 Verification 테스트 : 개발자의 시각으로 테스트. 설계서 대로 만들었는지 테스트
    • 이전 단계 산출물이 현 단계의 산출물에 반영이 되었는지
    • 요구분석명세서 내용이 설계서에 반영 → 설계서의 내용대로 코딩해야 함
    • 불완전한 개발 결과를 가졌다는 한계점
  2. 확인 Validation 테스트 : 체크리스트, 요구사항대로 만들었는지 테스트
    • 검증과 확인 둘 다 해야 강력한 테스트
    • V & V (Verification and Validation) 검증 + 확인

사용목적에 따른 테스트

  1. 성능 테스트 : 요구사항 중에서 성능과 관련된 요구사항을 시스템이 얼마나 준수하는지
    • 효율성, 부하에 대한 실행시간, 응답시간, 처리능력, 자원 사용량 등 체크+테스트
  2. 스트레스 테스트 : 비정상적이고 과도한 부하 상황에서 시스템이 잘 견디는지, 발생하는 오류는 어떤 것들인지 확인
  3. 보안 테스트 : 불법적인 침투를 잘 막아내는지 테스트 (ex. 화이트 해커)
  4. 안정성(내구성) 테스트 : 며칠 동안 부하를 주면서 안정적으로 돌아가는지 테스트 → 메모리 누수(메모리 반납하지 않음)
  5. 복원 가능성 테스트 : 고장나게 하고, 자동으로 복구가 잘 되는지 회복의 완벽성을 평가 ⇒ OS, DBMS, 통신용 소프트웨어의 안정성 테스트에 적용

정적 테스트

속성, 내부 살핌

코드를 실행하지 않고, 명세나 코드를 검토해 결함을 찾아냄

비공식 검토 : 개별검토, 동료검토 / 동료

공식 검토 : 검토회의, 소프트웨어 검사 / 동료 + 소프트웨어 기술 전문가

  • 동료검토 : 2~3명. 명세서를 설명하고, 이해관계자들이 설명을 들으면서 결함을 발견
  • 인스펙션
    • 형식적 검토 기법
    • 저작자 외의 다른 전문가 또는 팀이 검사하여 문제를 식별하고 문제에 대한 올바른 해결을 찾아냄
  • 워크스루
    • 비형식적 검토기법
    • 검토 자료를 회의 전에 배포해서 사전 검토한 후 짧은 시간동안 회의를 진행하는 형태
  • CASE 도구
    • 자동화된 요구사항 관리 도구를 이용해 요구사항의 추적성과 일관성을 검토

다음 두 기법은 검토 기법이 아니라 요구사항 도출 단계에서 쓰인다.

  • 델파이 기법 : 전문가의 경험지식을 통한 문제 해결 및 미래 예측을 위한 방법
  • 롤 플레잉 : 현실에서 일어나는 장면을 설정하고 여러 사람이 각자가 맡은 역을 연기함

동적 테스트

구조 기반 테스트 : 프로그램 코드의 내부 구조를 테스트 설계의 기반으로 사용. 변수나 서브루틴 등

화이트박스 테스트

구문, 결정, 조건, 조건/결정, 변경 조건/결정, 다중 조건, 기본 경로, 제어 흐름, 데이터 흐름

  • 구문 Statement 커버리지 : 모든 명령문을 적어도 한번 수행. (수행구문/전체구문) X 100%
  • 결정, 선택, 분기 Decision 커버리지 : 결정 포인트 내의 전체 조건식이 적어도 한번은 참과 거짓의 결과가 되도록 수행
  • 조건 Condition 커버리지 : 결정 포인트 내의 개별 조건식이 적어도 한번은 참과 거짓의 결과가 되도록 수행
  • 조건/결정 커버리지 : 전체 조건식 + 개별 조건식 다 테스트
  • 변경 조건/결정 커버리지 : 개별 조건식이 다른 개별 조건식에 영향을 받지 않고 전체 조건식에 독립적으로 영향을 주도록 함
  • 다중 조건 Multiple 커버리지 : 모든 개별 조건식의 모든 가능한 조합을 100% 보장하는 커버리지
  • 기본 경로 Base Path 커버리지 : 순환 복잡도만큼의 선형 독립 경로 집합을 테스트. 루프가 있으면 수행 가능한 경로가 무한히 많아질 수 있어 모든 경로를 테스트하지는 않는다
    • 맥케이브 순환 복잡도 : 간선 수(화살표) - 노드 수(원) + 2 또는 그래프가 나누는 영역의 수(바깥 영역 포함)

흐름 그래프 예시: 노드 8개, 간선 9개, 안쪽 영역 R1·R2와 바깥 영역 R3

위 그래프는 간선 9개, 노드 8개이므로 9 - 8 + 2 = 3이다. 영역은 안쪽의 R1·R2와 곡선 바깥의 R3를 합해 세 개이므로 두 방법의 결과가 같다.

  • 제어 흐름 Control Flow 테스트 : 프로그램 제어 구조를 그래프 형태로 나타내어 내부 로직 테스트
  • 데이터 흐름 테스트 : 제어 흐름 그래프 + 사용현황 추가

명세 기반 테스트 : 내부 구조 보지 않고, 요구사항명세를 보면서 실행하는 테스트

블랙박스 테스트 - 동계원오비 / 동경결상 유분페 원비오

  • 동등 분할 Equivalence Partitioning 테스트 : 입력 데이터의 영역을 유사한 도메인별로 유효값/무효값을 그룹핑하여 대푯값 테스트 케이스를 도출하여 테스트
  • 경곗값 분석 Boundary Value Analysis 테스트 : 입력 범위의 경계에서 결함이 자주 발생하는 점을 이용하는 기법. 경곗값 자체와 그 양쪽 인접값(경곗값 -1, 경곗값, 경곗값 +1)을 고르는 3값 방식으로 정리한다
  • 결정 테이블 Decision Table 테스트 : 요구사항의 논리와 발생조건을 테이블 형태로 나열하여, 조건과 행위를 모두 조합하여 테스트
    • 첫 번째 조건은 주문이 유효한지, 두 번째 조건은 재고가 충분한지를 체크한다
구분 규칙 1 규칙 2 규칙 3
주문이 유효한가? Y Y N
재고가 충분한가? Y N -
주문 처리 Y N N
재고 주문 N Y N
오류 메시지 N N Y
  • 상태 전이 State transition 테스트 : 이벤트에 의해 어느 한 상태에서 다른 상태로 전이되는 경우의 수를 수행하는 테스트
  • 유스케이스 Use Case 테스트 : 프로세스 흐름을 기반으로 테스트케이스를 명세화하여 수행하는 테스트
  • 분류 트리 Classification Tree 테스트 : SW의 일부 또는 전체를 트리구조로 분석 및 표현하여 테스트 케이스 설계해 테스트
  • 페어와이즈 Pairwise 테스트 : 테스트 데이터 값들 간에 최소한 한 번씩을 조합하는 방식
  • 원인-결과 그래프 Cause-Effect Graphing 테스트 : 그래프를 활용해 입력 데이터 간의 관계 및 출력에 미치는 영향을 분석

원인-결과 그래프의 제한 조건 기호: 배타(E), 포함(I), 선택(O), 필요(R), 강요(M) 관계

  • 비교 Comparison 테스트 : 여러 버전의 프로그램에 같은 입력값을 넣어 비교해 테스트
  • 오류 예측 검사 : 경험, 감각

V모델 - 단통시인

V모델: 요구사항 분석-인수, 기능명세 분석-시스템, 설계-통합, 개발-단위 테스트가 마주보는 구조

단위테스트 : 프로그램의 기본 단위인 모듈을 테스트

  • 정적테스트 : 소스코드 분석
  • 동적테스트 : 실행시켜서 확인
    • 구조기반 - 화이트박스
    • 명세기반 - 블랙박스

통합테스트 : 모듈 통합 과정에서 오류 찾음

  • 상향식 : 아래부터 위로, 클러스터 단위, 드라이버 가상의 모듈
  • 하향식 : 위부터 아래로, 스텁 가상의 모듈, BFS, DFS
  • 빅뱅 : 한번에 결합해 테스트
  • 백본 : 핵심 골격이 되는 모듈을 먼저 통합해 뼈대를 만든 뒤, 주변 모듈을 단계적으로 붙여 나감. 뼈대의 위아래로 하향식과 상향식을 함께 사용한다

시스템테스트 : 시스템 작동하는지 테스트

  • 기능 : 사용자 요구사항
  • 비기능 : 성능, 보안, 신뢰성, 사용성 등이 있고 요구사항마다 적합한 기법을 골라 적용한다
    • 성능 → 성능 테스트, 과부하 상황은 스트레스 테스트
    • 보안 → 보안 테스트
    • 신뢰성 → 안정성(내구성) 테스트, 복원 가능성 테스트

인수테스트 : 시스템 인수하기 전에 예상동작, 요구사항에 맞는지 테스트

  • 알파 : 사용자 + 개발자
  • 베타 : 사용자

회귀테스트 : 수정된 모듈이 기존코드에 영향을 미쳤는지 확인, 점진적으로 테스트