Skip to content
Snippets Groups Projects
Commit 3aa101cd authored by munyeong Jung's avatar munyeong Jung
Browse files

Update report15.md - update last report

parent 39efef94
No related branches found
No related tags found
No related merge requests found
......@@ -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
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment