diff --git a/lec15/report15.md b/lec15/report15.md index a6f32b08b20e58ab825a74ba14ed88f689490c6a..c0f50431c6098d944fa346cf3d2d2e34ee76085d 100644 --- a/lec15/report15.md +++ b/lec15/report15.md @@ -7,3 +7,312 @@ # ## Lecture 15 + +### Software Test + * 노출되지 않은 숨어있는 결함(fault)을 찾기 위해 소프트웨어를 작동시키는 일련의 행위와 절차 + * 오류 발견을 목적으로 프로그램을 실행하여 품질을 평가하는 과정 + * 개발된 소프트웨어의 결함과 문제를 식별하고 품질을 평가하며 품질을 개선하기 위한 일련의 활동 + * 소프트웨어의 동작과 성능, 안정성이 요구되는 수준을 만족하는지 확인하기 위한 결함을 발견하는 매커니즘 + +##### 목적 + * 프로그램의 잠재된 오류의 발견 + * 기술적인 기능 및 성능의 확인 + * 사용자 요구 만족도 향상 + * 제품 신뢰도 향상 + +##### 소프트웨어의 내부 구조 파악 여부 +* white box + 제품의 내부 요소들이 명세서에 따라 수행되고 충분히 실행되는가를 보장하기 위한 검사 + + | 검사 | 설명 | + | ------ | ------ | + | 기초 경로 검사 | 수행 가능한 모든 경로에 초점을 맞추어 검사 | + | 조건 검사 | 프로그램의 조건문에 초점을 맞춰 검사 | + | 루프 검사 | 프로그램의 반복 구조에 초점을 맞춰 검사 | + | 데이터 흐름 검사 | 프로그램에서 변수의 정의와 변수 사용의 위치에 초점을 맞춰 검사 | + +* black box + | 검사 | 설명 | + | ------ | ------ | + | 동치 분할 검사 | 프로그램의 입력 데이터를 여러 분류로 나누어 검사 | + | 경계값 분석 | 입력값의 경계값을 중심으로 예외 발생 검사 | + | 원인-효과 그래프 기법 | 입력 데이터 간의 관계, 출력에 미치는 영향의 분석 그래프 이용 | + | 오류 예측 검사 | 테스터의 감각이나 경험, 지식을 통해 에러케이스를 예측 | + | 비교 검사 | 테스트 대상과 비교 대상 프로그램에 같은 입력값을 넣어 데이터를 비교 | + +##### 소프트웨어의 실행 여부 +* static testing (정적 테스트) + 소프트웨어 응용 프로그램을 코드 실행 없이 테스트하는 일종의 소프트웨어 테스트 + +* dynamic testing (동적 테스트) + 소프트웨어 시스템의 기능 동작, 메모리/CPU 사용량 및 시스템의 전반적인 성능을 확인 + +##### V-Model + * 소프트웨어 개발 프로세스 + * 아래의 그림과 같이 코딩 단계에서 위쪽으로 꺾여 알파벳 v자 모양으로 진행됨 + * 개발 생명주기의 각 단계와 그에 상응하는 소프트웨어 시험 각 단계의 관계를 보여줌 + * 소프트웨어 개발의 각 단계마다 상세한 문서화를 통해 작업을 진행하는 잘 짜인 방법을 사용하며, 테스트 설계와 같은 테스트 활동을 프로젝트 시작 시에 함께 시작하여 전체적으로 많은 양의 프로젝트 비용과 시간을 감소시킴 + <img src=""> +# + +##### 정적 테스트(static testing) + * 소프트웨어 응용 프로그램을 코드 실행 없이 테스트 + * 오류를 찾기 위해 코드, 요구사항 문서 및 문서 설계에 대한 수동 또는 자동 검토가 수행됨 + +* **목적** + 소프트웨어 개발 프로세스의 초기 단계에서 오류를 발견함으로써 소프트웨어 어플리케이션의 품질을 향상시키는 것 + +* **수동 vs 자동** + STLC 초기에 결함을 발견하기 위한 테스트 초기 단계에서 수행됨 + 수동 테스트는 소프트웨어의 결함을 수동으로 테스트하기 때문에 테스터가 최종 사용자의 역할을 수행해야 하지만 자동 테스트는 자동화된 테스트 도구를 사용한다는 차이점이 있음 + +* **장단점** + * 장점 : 코드 실행 전 사용 + * 단점 : 정확도 상대적 낮음 + +# + +##### 동적 시스템 + * 소프트웨어 시스템의 기능 동작, 메모리/CPU 사용량 및 시스템의 전반적인 성능을 확인 + * 소프트웨어를 실행하고 예상 결과로 출력을 검증 + +* **목적** + 소프트웨어 제품이 비지니스 요구사항에 따라 작동하는지 확인 + +* **장단점** + * 장점 + 1. 런타임 환경에서 취약한 영역을 식별할 수 있음 + 2. 테스터에게 실제 코드가 없더라도 어플리케이션 분석을 지원 + 3. 모든 어플리케이션에 적용 가능 + + * 단점 + 1. 잘못된 보안을 제공할 수 있음 + 2. 코드의 취약점을 축적하기 어려움 + 3. 버그 수정 비용이 많이 듦 + +##### 정적 테스트 vs 동적 테스트 + + | 정적 테스트 | 동적 테스트 | + | ------ | ------ | + | 프로그램을 실행하지 않고 수행 | 프로그램을 실행함으로써 수행 | + | 코드, 요구 사항 문서 및 설계 문서를 검사하여 오류를 찾음 | 소프트웨어 시스템의 기능 동작, 메모리/CPU 사용 및 시스템의 전반적인 성능을 검사 | + | 결점을 예방 | 결점을 찾아 수정 | + | 컴파일 전에 수행 | 컴파일 후에 수행 | + | 구조 및 문장 적용 범위 | 경계값 분석 및 동등성 분할 | + +##### 테스트 커버리즈 종류 + * **단위 테스트** + 유닛 테스트에서 개별 유닛 또는 모듈은 개발자가 테스트 + + * **통합 테스트** + * 개별 모듈은 함께 그룹화되어 개발자에 의해 테스트 + * 모듈이 통합되면 예상대로 작동하는지 결정하는 것을 목적으로 함 + + * **+ 시스템 테스트** + 시스템 또는 응용 프로그램이 요구사항 사양 문서를 충족하는지 확인하여 전체 시스템에서 수행 + +### C Programming (test.c) +``` +#include <stdio.h> + +int g_var1 = 0; +void exFunc(int * var); +int inputVarTest(int a){ + int ret = 0; + + if (a == 100 && g_var1 == 10) { + ret = 100; + }else if(a == 50 && g_var1 ==5){ + ret =50; + }else { + ret =-1; + } + + return ret; +} +struct strc{ + unsigned char state; +}; + +int bitFunc(struct strc data){ + + + struct strc data2; + if((data.state & 0x02) == 0x02){ /* [CS_IGNORE=MISRA_C_2012.MISRA_C_2012_10_04;의도된 코드] */ + printf("state1 = %X\n",2); + printf("state2 = %X\n",data.state); + printf("state3 = %d\n",data.state); + }else{ + printf("state4 = %X\n",0x02 & 0x02); + printf("state5 = %X\n",data.state); + printf("state6 = %d\n",data.state); + } + return 0; +} + +/* test code for undefined func Stub */ +int undefinedFunc(int arg); +int definedFunc(int arg){ + return (arg * 12) + (arg * 100); +} + +void undefinedStubTest(int a) /* [CS_IGNORE=MISRA_C_2012.MISRA_C_2012_02_07;TEST] */ +{ + int j; + int l; + + j = undefinedFunc(l); + if(j == 100 ){ + j=0; + + }else{ + j=1; + } +} + +/* test code for defined func Stub */ +void definedStubTest(int a) +{ + int j, l; + + j = definedFunc(a); + if(j == 112 ){ + j=0; + }else if(j ==336){ + j=1; + }else{ + j=2; + } +} + + +/* Test code for void pointer */ +struct S { + int m1; + float m2; +}; + +int VoidPtrTest(void* arg) +{ + int ret = 0; + struct S *ptr = (struct S*)arg; + if (ptr->m1 == 0) { + ret = 0; + }else{ + ret = 1; + } + return ret; +} + +/* test code for static local var */ +void staticVarTest(){ + static int a = 0; + + if(a==0){ + a++; + return; + }else if(a==1){ + a=3; + return; + }else if(a==3){ + a++; + return; + } + else + { + /* exception */ + } + + return; +} + +void funcCall(){ + testA(); + testB(); + testC(); +} +/* test code for local var - call by reference */ +void localVarTest(){ + int local_var =0; + int flag = 0; + exFunc(&local_var); + if(local_var == 1){ + flag = 1; + }else if(local_var ==2){ + flag = 2; + }else{ + flag = 0; + } +} + +/* test code for Null Check */ +struct data { + int a; + char *b; +}; + +int testMe(int a, int b , char c){ + return 0; +} +int pointerTest(struct data *pData) +{ + if(pData == 0){ + return -1; + }else if(pData->a == 0){ + return 0; + }else if (pData->a == 1){ + return 1; + } + else + { + /* exception */ + } + pData->b = (char *)malloc(10); + strcpy(pData->b, "mwyun"); +} + + +#ifdef UNIT_TARGET +/* Test code for virtual memory */ + +#define READ_REG(ADDR) (*(volatile unsigned long*)(ADDR)) +typedef struct strname{ + int a; +}AAA; +#define REG_BASE_ADDR 0xFFE40000U +#define (*(unsigned int *)AAA) 0xFFFF0230u +typedef unsigned char uint8_t; // unsigned 8-bits : begins with 'b' +typedef char int8_t; // signed 8-bits : begins with 'c' +typedef unsigned int uint16_t; // unsigned 16-bits : begins with 'w' +typedef int int16_t; // signed 16-bits : begins with 'i' +typedef unsigned long uint32_t; // unsigned 32-bits : begins with 'u' +typedef long int32_t; // signed 32-bits : begins with 'l' +typedef float float32_t; // single precision IEEE 754 32-bits : begins with Capital +typedef double int64_t; + +extern volatile uint32_t ulAdcColumnWriteIndex; +int virtualMemoryTest1(){ + *(uint8_t *) ((((uint32_t)0x68000000) + (((uint32_t)0x2340) * 2)) + (ulAdcColumnWriteIndex * ((uint32_t)8) )+ 0)=100; + /*if(READ_REG(REG_BASE_ADDR)==10){ + return 10; + }*/ + return -1; +} + + +void virtualMemoryTest2(void) +{ + if(AAA&0x01==0x01){} +} + +/* test code for infinite loop */ +int infiniteLoopTest(int arg){ + + while(1){ + return arg; + } +} + +#endif + +```