안녕하세요 오늘은 자동화 테스트 코드에 대한 이야기를 해보려고 합니다.

 

5개의 TC(Test Case)가 있습니다. 테스트 방식은 직접하는 매뉴얼 테스트도 있을 것이고 성능,부하 등등 

 

여러가지가 있지만 말씀드리고자 하는 부분은 단순 Unit Test 혹은 API 테스트 같은 부류들 처럼 코드단에서

 

이루어지는 부류를 말씀 드리고자 합니다.

 

예전에 제가 사용 하였던 2가지의 패턴 방식을 보여드리려고 합니다.  현재는 또 이러 저러한 구조를 통해서 변경 

 

하고 있습니다.

 

독립적 실행이 필요한가?

어떠한 프로그램에 따라서는 아닐수도 있고 맞을수도 있습니다. 저같은 경우는 JS 로 돌아가는 환경이 최근에 많았었는데요 JS의 경우는 .js파일을 읽어들이면서 코드라인이 실행됩니다. JIT(Just In Time) 라고도 하죠 그렇기 때문에 어떠한 현상이 발생되는 현상은 

 

함수 b로 인해 실행되지 못한 c함수 

 

위와 같은 문제가 발생하게 됩니다. TestCase를 3개를 만들었지만 2번째 케이스로 인해서 3번째 케이스가 돌지 못하는 현상이 발생하게 되는 것이지요

 

1차적으로 간단하게 수정할수 있습니다.

function a(){
	console.warn('Success');
}
function b(){
    try{
        var test = "";
        test.push('test'); // Error 
    }
    catch(err){
	    console.log(err);
    }
}
function c(){
	// not Execution 
	console.warn('function C Success');
}

a();
b();
c();

try catch 로 묶어 주게되면 

문제없이 catch 로 핸들링이 되며 다음코드로 자동으로 넘어가게 되겠죠 

 

하지만 실제로 업무에서 사용되는 케이스는 10단위도 아니고 100단위도 아니고 1000단위가 넘어가게됩니다.

 

코드 단에서 할수 있다면 최대한 많은 케이스를 확보 하여 커버리지를 올릴 수 있기 때문이죠 

 

1. TC(TestCase) 내용으로 함수 연결하여 실행하기

TC(TestCase)의 경우 유니크한 값을 가지기 마련입니다. 함수명을 해당 키 값으로 하여서 실행시키는 방법입니다.

var testRepo = [
  {tc:"a",contents:"a를 테스트합니다.",result:"block"},
  {tc:"b",contents:"b를 테스트합니다.",result:"block"},
  {tc:"c",contents:"c를 테스트합니다.",result:"block"},
]

var testFunctionRepo = {
  run:function(repo){
    var _this = this;
      repo.forEach(function(item,index){
        try{
          _this[item.tc]();
        }
        catch(error){
          console.error(error);
        }

      });
  },
  a:function(){
    console.warn('Success');
  },
  b:function(){
    var test = '';
    test.push('test'); // Error
  },
  c:function(){
    // not Execution 
    console.warn('function C Success');
  }
}
testFunctionRepo.run(testRepo);

결과 :

성공

 

tc에서 만들어진 유니크한 값을 통해서 함수를 작성해놓았습니다.

 

그후엔 run 이라는 함수를 하나 만들어서 해당 함수에서 tcRepo 를 직접 순환시에 나오는 유니크 값을 함수를 불러와서  실행을 하는 구조입니다. 그렇기 때문에 try catch 문은 하나만 있을수 있죠 

 

위에서는 테스트를 변경하진 않았는데 해당의 내용도 가능합니다. 

 

2. TC(TestCase) 내용에 함수가 들어있는 경우 

이번에는 Repo 안에 함수가 들어있는 경우입니다. 


var testRepo = [
  {tc:"a",contents:"a를 테스트합니다.",result:"block",run:function(){
		console.warn('Success');
  }},
  {tc:"b",contents:"b를 테스트합니다.",result:"block",run:function(){
		var test = '';
		test.push('test'); // Error
  }},
  {tc:"c",contents:"c를 테스트합니다.",result:"block",run:function(){
		// not Execution 
		console.warn('function C Success');
  }},
]
function run(repo){
	if(repo && repo.length===0){
		return ;
       }
	repo.forEach(function(item,index){
		try{
			item.run();			
        }
		catch(error){
			console.error(error);
        }
    });
}

run(testRepo);

 

위에 있는 경우와 조금 다른 케이스입니다.  Repo 안에 직접 run 이라는 함수를 직접 내장 하였는데요 

Repo 안에 전부 있기 때문에 run 을 오브젝트를 통해서 실행할 필요는 없어 보여 run 함수를 따로 작성 하였습니다.

이렇게 2가지를 알아보았는데 해당 방식을 놓고 보면 좋아 보이는거 같기도하고 하지만 

기본적인 방법입니다. 뭔가 더 정형화되거나  확장성에는 용이 하지 않죠 

 

여러명이 작업할때 좀 더 모듈단위 로 세분화가 되거나  하여야 할 것으로 보입니다. 이부분에 대해서는

 

다음포스팅에 다시 작성 하겠습니다.

+ Recent posts