Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
pcc024
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
munyeong Jung
pcc024
Commits
3aa101cd
Commit
3aa101cd
authored
3 years ago
by
munyeong Jung
Browse files
Options
Downloads
Patches
Plain Diff
Update report15.md - update last report
parent
39efef94
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
lec15/report15.md
+309
-0
309 additions, 0 deletions
lec15/report15.md
with
309 additions
and
0 deletions
lec15/report15.md
+
309
−
0
View file @
3aa101cd
...
...
@@ -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
```
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment