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
+
+```