아래 글은 얼마전 Damon이 메일로 공유 해준 내용입니다. 

오늘에서야 본사 복귀 해서 PC로 읽어 봤는데 볼만한 포스팅이네요. 


필요성에 대한 부분도 공감이 되고..



#고양이목에_방울달기




서론

 이 글은 필자가 속해 있는 팀의 코딩 컨벤션(스타일 가이드)를 맞추기 위해 '더글라스 크락포드의 자바스크립트 코드 컨벤션'을 참고하여 작성한 것 입니다. 무조건 이 규칙들이 좋은 것은 아니니, 팀원들의 규칙들을 잘 통합하여 각자 팀만의 코딩 컨벤션을 적용하길 권장합니다. 


1. 코딩 컨벤션(스타일 가이드)가 필요한 이유
2. 들여쓰기
3. 연산자
4. 괄호
5. 주석
6. 기본 리터럴
7. 객체 리터럴
8. 변수 선언
9. 함수 선언
10. 문장 규칙
11. 가독성을 위한 공백







1. 코딩 컨벤션(스타일 가이드)가 필요한 이유

  대학 시절, 컴공과를 다니던 황OO군은 아무것도 없는 공백에 필요한 코드를 작성하여 '동작'을 목적으로 '성적'을 목적으로 의식의 흐름따라 코딩을 하였습니다.


예를 들면 이런 것 (내용도 내용이지만 필체마저 의식을 따라감)


  그렇게 잘 '동작'하는 코드를 통해 좋은 성적을 거두고 회사에 입사하게 되었습니다. 막상 와보니 교수님의 과제처럼 아무것도 없는 상태에서 뭔가를 구현하는 일은 생각보다 없습니다. 이미 선임이 짜놓은 코드를 기반으로 개발하게 된 것입니다. 문제는 여기서 발생합니다. "코드가 술술 읽히네 예술적이다." 라는 반응이 나오는 코드가 있는 반면 "이 코드 짠 XX 얼굴 한번 보고싶다." 라는 반응이 나오는 코드도 있습니다. 이 같은 문제를 해결하기 위해 나온 것이 자바스크립트 코딩 컨벤션(스타일 가이드)입니다. 


  실무에서는 새로운 코드 작성보다 '유지보수'에 더 많은 시간을 보낸다고 합니다. 대부분 이미 있는 코드에 새로운 코드를 추가하거나 수정합니다. 유지보수성이 좋게 코드를 작성했다면 작성자 본인 뿐만 아니라 다음 사람에게도 유지보수 시간을 단축할 수 있도록 도와줍니다. 다음은 '자바 언어를 위한 코드 컨벤션'에서 언급한 코딩 컨벤션의 중요성입니다.

- 소프트웨어 개발 시 드는 비용의 80%는 '유지보수'에 사용된다.
- 소프트웨어 개발 생명주기에서 최초 개발자가 끝까지 유지보수하는 경우는 거의 없다.
- 코딩 컨벤션은 소프트웨어 가독성을 향상시켜, 개발자가 새로운 코드를 더 빠르고, 완전하게 이해하게 함.

코딩 컨벤션의 필요성을 알았으니, 다음의 코딩 컨벤션 규칙들을 살펴보도록 하겠습니다.




2. 들여쓰기

  최근 에디터들은 자동으로 Enter를 치면 들여쓰기를 해주고 있습니다. 하지만 그것에 의존하지 말고 1번의 탭 또는 4번의 공백 둘 중 하나의 규칙을 습관적으로 적용합니다.
// 좋은 예
function test() {
console.log('들여쓰기 테스트');
}

// 나쁜 예
function test() {
console.log('들여쓰기 테스트');
}





3. 연산자

3.1 연산자 삽입 시 공백 삽입 위치

 두 개의 피연산자와 함께 사용하는 연산자는 사용 시 연산자 앞 뒤에 공백을 한 칸씩 추가해주도록 합니다. 이는 연산자의 목적를 명확하게 보여주기 위함입니다. (주의, 단항 연산자는 붙여서 사용)

// 좋은 예
var isSuccess = (condition <= 10);

var i;
for (i = 0; i < 10; i++) {
work();
}

// 나쁜 예
var isSuccess = (condition<=10);

var i;
for (i=0; i<10; i++) {
work();
}



3.2 할당 연산자


 할당 연산자 사용시 할당 값이 비교 연산식이면 괄호로 감싸줍니다.

// 좋은 예
var isBaby = (age < 10);

// 나쁜 예
var isBaby = age < 10;



3.3 동등 연산자


 동등 비교를 할 때 타입 강제 변환의 위험이 있으면 무조건 ==, != 대신 ===, !==를 사용해줍니다.

// 좋은 예
console.log('1' === 1);

// 나쁜 예
console.log('1' == 1);





4. 괄호

여는 괄호 다음과, 닫는 괄호 이전에 공백은 없습니다.

// 좋은 예
var isBaby = (age <= 10);

// 좋은 예
var i;
for (i = 0; i < 10; i++) {
work(hour, amount);
}

// 나쁜 예: 앞 뒤에 불필요한 공백 들어감
var isBaby = ( age <= 10 );

// 나쁜 예: 인자 사이에 불필요한 일 들어감
var i;
for (i = 0; i < 10; i++) {
work( hour, amount );
}




5. 주석

5.1 한 줄 주석
  • 하단의 코드를 설명하기 위해 독립된 줄에 주석 작성
  • 주석 앞의 코드를 설명하기 위해 줄 끝에 주석 작성
  • 여러 줄에 걸친 설명일 때는 사용하지 않는다.
  • 독립된 줄에 한 줄 주석 작성 시에는 설명할 코드와 같은 단계 들여쓰기 사용하며, 이전 줄은 한 줄 비웁니다.

// 좋은 예
if (age > 20) {

// 이 줄은 나이가 20살 이상일 때만 실행됩니다.
showAdultMovie();
}

// 나쁜 예: 이전 줄에 공백이 없어 가독성이 떨어짐
if (age > 20) {
// 이 줄은 나이가 20살 이상일 때만 실행됩니다.
showAdultMovie();
}

// 나쁜 예: 주석의 들여쓰기가 설명할 주석과 단계가 다릅니다.
if (age > 20) {

// 이 줄은 나이가 20살 이상일 때만 실행됩니다.
showAdultMovie();
}

// 나쁜 예: 한 줄 주석은 한 줄만 사용합시다.
// 이 코드는 만으로 나이가 20세 이상인 것이 아니고
// 그냥 20세 이상 아니아니 이게 아니고
// 아 아닙니다 만으로 나이가 20세 이상인
// 사람을 판별하기 위한 조건문입니다.
if (age > 20) {

// 이 줄은 나이가 20살 이상일 때만 실행됩니다.
showAdultMovie();
}




5.2 여러 줄 주석
  • 첫 번째 줄은 여러 줄 주석을 여는 방법인 /*를 삽입하며, 다른 텍스트는 넣지 않는다.
  • 그 다음 줄 부터는 *와 텍스트를 입력하는데 첫 째 줄의 *과 열을 맞춘다. *과 텍스트 사이에는 공백 하나를 넣어줍니다.
  • 마지막 줄은 여러 줄 주석을 닫는 방법인 */를 삽입하며 다른 텍스트는 넣지 않는다.

// 좋은 예
if (age > 20) {

/*
* 이 코드는 만으로 나이가 20세 이상인 것이 아니고
* 그냥 20세 이상 아니아니 이게 아니고
* 아 아닙니다 만으로 나이가 20세 이상인
* 사람을 판별하기 위한 조건문입니다.
*/
showAdultMovie();
}

// 나쁜 예: 이전 줄에 공백이 없어 가독성이 떨어짐
if (age > 20) {
/*
* 이 코드는 만으로 나이가 20세 이상인 것이 아니고
* 그냥 20세 이상 아니아니 이게 아니고
* 아 아닙니다 만으로 나이가 20세 이상인
* 사람을 판별하기 위한 조건문입니다.
*/
showAdultMovie();
}

// 나쁜 예: *과 텍스트 사이에 공백이 없음
if (age > 20) {

/*
*이 코드는 만으로 나이가 20세 이상인 것이 아니고
*그냥 20세 이상 아니아니 이게 아니고
*아 아닙니다 만으로 나이가 20세 이상인
*사람을 판별하기 위한 조건문입니다.
*/
showAdultMovie();
}



5.3 주석 어노테이션
어노테이션은 코드에 추가적인 설명을 더합니다. 한 단어이며 그 뒤에 콜론이 붙습니다.
ㄱ. TODO : 코드를 다 작성하지 않음. 다음에 작성할 내용이 반드시 기술되어 있어야합니다.
ㄴ. HACK : 어거지(임시변통)으로 해결한 코드. 핵을 왜 사용했는지 정보가 있어야하며, 더 나은 방법으로 해결할 수 있음을 뜻합니다.
ㄷ. XXX : 코드에 문제가 있어 가능한 빨리 수정되야 함을 의미
ㄹ. FIXME : 코드에 문제가 있어 수정해야하지만 XXX보다는 덜 중요합니다.
ㅁ. 변경 가능성이 있거나 더 나은 방법이 있을 수 있음으로 리뷰가 필요한 코드를 의미합니다.



6. 기본 리터럴

  • 문자열은 무조건 큰 따옴표로 묶습니다. 문자열을 \로 끊어 여러줄로 적지 않습니다.
  • 숫자는 10진수 정수, 지수표현법을 이용한 정수, 16진수 정수, 부동 소수점을 이용한 정수만 사용하며, 소수점 앞 뒤에는 숫자가 최소 하나는 있어야 합니다. 8진수는 사용하지 않습니다.

// 좋은 예
var name = "황혁진";

// 나쁜 예
var name = '황혁진';

// 나쁜 예: 문자열이 다음으로 넘어감
var story = "옛날 옛날에 어느 마을에 어떤 집에 \
어떤 사람과 어떤 사람이 살았어요.";


// 좋은 예
var num = 10;
var num = 10.0;
var num = 10.00;
var num = 0xB2;
var num = 3e1;

// 나쁜 예
var num = 10.; // 소수점 뒤에 숫자 없음
var num = .1; // 소수점 앞에 숫자 없음
var num = 010; // 8진수 사용 안함






7. 객체 리터럴

  • 여는 중괄호는 중괄호를 여는 문장과 같은 라인에 있어야합니다.
  • 프로퍼티 - 값 쌍은 여는 중괄호 다음 줄 부터 작성하고 여는 중괄호가 있는 라인을 기준으로 한단계 들여쓰기를 합니다.
  • '프로퍼티: 값' 의 형식을 지켜줍니다. 공백없이 콜론을 입력하고 공백 하나 후에 값을 입력합니다.
  • 값이 함수라면 프로퍼티명 다음에 한줄로 입력하지 않고 함수 이전 줄, 다음 줄에 공백을 넣어줍니다.
  • 관련된 프로퍼티끼리 묶기 위해 프로퍼티간 공백을 넣어도 됩니다.
  • 닫는 중괄호는 텍스트와 함께 두지 않으며 끝에 세미콜론(;)을 붙여줍니다.

// 좋은 예
var person = {
name: "송민재",
age: 26,

getName: function() {
return this.name;
}
};

// 나쁜 예: 함수 이전에 공백이 없음
var person = {
name: "송민재",
age: 26,
getName: function() {
return this.name;
}
};

// 나쁜 예: 잘못된 들여쓰기
var person = {
name: "송민재",
age: 26,

getName: function() {
return this.name;
}
};

// 나쁜 예
var person = {name: "송민재", age: 26};



 함수에 객체 리터럴을 전달할 때도 간단한 객체는 한 줄로 전달하고 싶겠지만, 가독성을 위해 위의 규칙을 적용해줍니다.

// 좋은 예
getDepartment({
name: "송민재",
age: 26
});

// 나쁜 예: 객체 리터럴 규칙을 지키지 않음
getDepartment({name: "송민재", age: 26});



 객체 프로퍼티 작성 규칙은 8.2 변수명 생성 규칙과 같습니다. 객체 메서드는 9.2 함수명 규칙을 따릅니다. 프로퍼티나 메서드가 private라면 _를 맨 앞에 붙여 private라고 명시적으로 알려줍니다.

var person = {
_homeAddress: "인천",

name: "황혁진",
age: 26,

_getHomeAdrress: function() {
return this._homeAddress;
}
}




8. 변수 선언

8.1 변수 선언 방법

 변수 연산자는 반드시 사용 전에 선언되어야합니다. 한 개의 var을 이용해 함수의 맨 윗줄에 선언하며, 대입 연산자는 같은 단계의 들여쓰기를 사용해주면 가독성에 도움이 됩니다. 마지막 변수 선언 전까지는 ,로 구분을 해주며 마지막 변수에는 세미콜론(;)을 붙여줍니다. 초기화 된 변수는 반드시 초기화 되지 않은 변수보다 앞에 위치 시킵니다.


// 좋은 예
var name = "권현아",
age = 23,
home = "방화동";

// 나쁜 예: 대입연산자의 들여쓰기가 맞지 않음
var name = "권현아",
age = 23,
home = "서울과 인천의 경계";

// 나쁜 예: 들여쓰기가 맞지 않음
var name = "권현아",
age = 23,
home = "서울과 인천의 경계";

// 나쁜 예: 한 줄에 여러 변수 선언
var name = "권현아", age = 23, home = "서울과 인천의 경계";

// 나쁜 예: 초기화 되지 않은 변수가 먼저 위치함
var name,
age = 23,
home = "서울과 인천의 경계";



8.2 변수명 규칙


변수명은 낙타표기법을 사용합니다. $나 \는 사용하지 않으며 _도 사용을 자제하겠습니다. 변수명은 소문자로 시작하며 새로운 단어의 첫 번째 문자는 대문자를 사용합니다. 변수명의 첫 단어는 반드시 명사를 사용해주어 함수와 구분하기 쉽도록 합니다. 

// 좋은 예
var firstName = "혁진";

// 나쁜 예: 대문자로 시작
var FirstName = "혁진";

// 나쁜 예: 빈칸 들어감
var first_name = "혁진";

// 나쁜 예: 동사로 시작
var getFirstName = "혁진";



변수를 값이 변하지 않는 상수로 사용하려면 이름의 모든 문자를 대문자로 사용하며 단어 사이에 밑줄( _ )을 넣어줍니다.

var TOTAL_COUNT      = 1,
TOTAL_POPULATION = 1000;






9. 함수 선언

9.1 함수 선언 방법
  • 객체에 선언된 메서드가 아니라면 반드시 함수 선언 형식을 사용합니다.
  • 함수 표현식, new를 이용한 생성자 형식을 사용하지 않습니다. (객체 생성 시 사용)
  • 함수명과 여는 괄호 '(' 사이에는 공백 넣지 않습니다. '(' 와 ')' 사이에는 공백 하나를 넣습니다.
  • 인자 입력시 , 뒤에 공백을 넣습니다.
  • 함수 본문은 한 단계 들여쓰기를 사용합니다.
// 좋은 예
function working(arg1, arg2) {
return money;
}

// 나쁜 예: 함수 명과 괄호 사이에 공백
function working (arg1, arg2) {
return money;
}

// 나쁜 예: 함수 표현식 사용
var working = function(arg1, arg2) {
return money;
}

// 나쁜 예: 생성자 방식 사용
var money = new Function("arg1", "arg2");



 익명 함수는 객체에 메서드 할당 시나, 다른 함수에 인자로 전달할 때 사용합니다.

person.name = function() {
// 코드
};

getName(function() {
// 코드
});



9.2 함수명 규칙


함수명 역시 낙타표기법을 사용합니다. 첫 번째 단어는 동사를 사용하여 변수명과 구분해줍니다. 

// 좋은 예
function getName() {

};

// 나쁜 예: 대문자로 시작
function GetName() {

};

// 나쁜 예: 명사 사용
function name() {

};

// 나쁜 예: _ 사용
function get_name() {

};



 생성자 함수는 new를 통해 생성할 때 실행되는 함수며 객체 인스턴스를 생성할 때 사용하므로 동사로 시작하지 않고, 첫 문자를 대문자로 시작합니다.

// 좋은 예
function Enemy() {

};

// 나쁜 예: 소문자로 시작
function enemy() {

};






10. 문장 규칙

15.1 return문
반환하는 값의 명확한 의미를 알기 위해 괄호를 사용하지 않습니다.
// 좋은 예
var generation = (age <= 7 ? "baby" : "teenager");
return generation;

// 나쁜 예
return (age <= 7 ? "baby" : "teenager");



15.2 if 문
한 문장이라도 중괄호를 포함해줍니다. (다음에 문장을 추가할 때 중괄호를 빼먹는 실수하지 않도록)
// 좋은 예
if (person != null) {
work();
}

// 나쁜 예
if (person != null)
work();


15.3 for 문
변수는 for문의 초기화 구문 이전에 선언해줍니다.
// 좋은 예
var i = 0,
len = 10;
for (i = 0; i < len; i++) {

}

// 나쁜 예
for (var i = 0; i < 10; i++) {

}


15.4 switch 문
  • case는 switch를 기준으로 한단계 들여쓰기 합니다.
  • 첫 번째 case를 제외한 case와 default 사이에는 한 줄의 공백이 있어야합니다.
  • default를 제외한 case는 return, break, throw 중 하나로 마쳐야 하고 다음 case로 의도적으로 넘기는 부분은 주석처리를 해줍니다.
  • default를 의도적으로 생략했으면 주석처리 해줍니다.
// 좋은 예
switch (num) {
case 0:
break;

case 1:
break;

default:
break;
}

// 좋은 예
switch (num) {
case 0:
// 다음 case와 같은 동작 처리

case 1:
break;

default:
break;
}

// 좋은 예
switch (num) {
case 0:
break;

case 1:
break;

// default 구문 생략
}







11. 가독성을 위한 공백

의미 없는 공백은 사용하지 않습니다. 한 줄 공백은 다음의 상황에 사용합니다.
  • 메서드 사이
  • 메서드와 지역 변수와 첫 번째 문장 사이
  • 여러 줄 주석이나 한 줄 주석 이전
  • 메서드 내에서 가독성 향상을 위해 논리적으로 나눈 그룹 사이

공백은 다음 상황 때 사용합니다.
  • 인자가 여러개 일때 콤마(,) 뒤에 공백을 넣습니다.
  • 이항 연산자는 앞 뒤에 공백을 넣고, 단일은 넣지 않는다.
  • for 문의 표현식은 공백을 넣어 구분



출처: http://itmining.tistory.com/72 [IT 마이닝]


'Dev pattern' 카테고리의 다른 글

WPF Developement  (0) 2017.07.21
AngularJs service unit test via jasmine.  (0) 2017.06.29
Jasmine getting started to test javascript (Angular)  (5) 2017.05.26

DA - 데이터 관점에서 업무 수행

DBA - DB 관점에서 업무 수행



[DA]

- 개발하려고 하는 업무 분석하여 Entity와 Attribute 추출 및 정의(전산화 대상 추출)

- ERD 작성

- 관계 설정

- 작성 문서 : Entity 정의서, ERD..


[DBA]

- 개발에 필요한 DB 설치, 관리

- DA가 만든 ERD로 부터 물리적인 테이블, Index, PK, FK 생성

- 개발자 교육 및 기술 자문(SQL 작성 관련)

- Data migration

- 작성 문서 : 설계서, 인덱스 정의서..



업무 시에 예로 들자면 

1. 변경 되는 사항은 DA가 먼저 모델에 반영을 하고 

2. 바뀐 모델로 DBA가 테이블 변경하고 

3. 프로그래머가 관련 프로그램 수정하는 

형태가 되겠네요. 



오늘 프로젝트에서 DBA의 업무에 대한 이슈가 있었습니다. 

DBA로 투입 되신 분께 신규 메뉴에 대한 Entity 추출 등을 요청 드렸는데(내가 요청 드린 건 아니고..)

이런 저런 이유로 철수 하면서 나온 철수 사유 중 

'분석하고 Entitiy 추출하는건 본인의 업무 롤이 아니다'라고 했다더라구요. 


그 얘기를 전해 듣고 그럼 DBA는 DB 튜닝하고 백업 정책 만드는 거 외에 

또 뭘 하는 위치인가...궁금증이 생겨서 검색 해 보니 DA라는게 나오네요. 


챙피하지만 전 처음 들은 용어. ㅡ,.ㅡ;;

검색 해 보니 우리가 몰라서 실수 한 것 같네요. 


그나저나 이 프로젝트는 어찌 되려나. 에혀..

(아 지금은 제가 DA, DBA 다 하는 중입니다. 으레히 그래 왔던 것 처럼 ㅜㅜ)







'Database > Common' 카테고리의 다른 글

Migration with MS Excel  (3) 2017.06.16

들어가며

자, 오늘도 TDD에 대한 얘기입니다. :-)


Mars(마르스 or 마즈, 마스 아님!!) version은 ionic2를 지원하죠.

ionic2는 Angular2를 근간으로 하고 있으며, Angular2의 문법은 Typescript입니다. (꿈과 같은 Google과 Microsoft의 콜라보레이션?)

Mars 미국식 [mɑ:rz] 발음 듣기 영국식 [mɑ:z] 발음 듣기 중요

화성


Mars [maʀs] 발음 듣기 

1. 마르스 2. 화성


이런 새로운 환경 하에서 우리는 또 다시 어떻게 하면 TDD를 할 수 있을지를 심각하게 고민해 보아야 합니다.


간단하게 ionic2 test with jasmine으로 검색해 봤습니다.


AngularJs를 공부하면서 신세를 졌던 조쉬 모로니(joshmorony) 사이트가 나오네요.

들어가서 읽어보고 테스트를 해 봅니다.

https://www.joshmorony.com/how-to-unit-test-an-ionic-2-application/


으흠...

테스트 환경을 구축하는 방법이 분리된 post에 정리되어 있네요.

https://www.joshmorony.com/introduction-to-testing-ionic-2-applications-with-testbed/


엄청 깁니다! 그렇지만 포기하지 않고 열심히 따라해 보았습니다.

그런데 이런 된장!! 안되네요...


예제에서 import 하는 일부 class들이 현재와 조금 달라 보입니다.

Angular2 guide에서 찾아보니 이제는 사용하지 않는다네요... OTL


open source라는 게 이렇게 위험합니다 여러분~!! (!true)


...


잠깐 정신을 깨끗하게 하려 해우소에 다녀왔습니다.


어떻게 구글신에게 물으면 원하는 답변을 얻을 수 있을 지 잠깐 고민해 봅니다.

Simple is best!!


'ionic2 unit test' 으로 검색합니다.


ionic2 forum이 보입니다. 아하!!

들어가서 열심히 뒤져봅니다.


건졌습니다!!

http://roblouie.com/article/376/ionic-2-set-up-unit-testing-the-best-way/


몇 가지 수정해야 할 부분이 있지만, guide 거의 그대로 test 가능한 project를 만들 수 있었습니다. :D



Install ionic2

당연히 ionic2 app이 있어야 겠지요.

http://ionicframework.com/getting-started/

물론, 그 전에 node.js가 필요합니다. (# => LTS version을 다운로드 받아 설치해 줍시다.)


install ionic

npm install -g cordova ionic

ionic에는 cordova가 필요하죠. 한 번에 같이 설치하는 명령입니다.


start an app

ionic start {appname} blank

빈페이지를 시작페이지로 갖는 ionic app을 만듭니다. {appname}으로 folder가 생기고 그 아래에 필요한 파일들이 설치됩니다. (대략 150MB)


run your app

ionic serve

app folder로 이동해서 명령어를 실행하면 빈 페이지를 가지는 app이 실행됩니다.



Setup for test

먼저 karma를 설치해야 합니다.

(app folder로 이동해서 실행해주세요.)

npm install -g karma-cli

-g option은 global하게 쓰게 설치하는 option입니다.


그 뒤 테스트에 필요한 module들을 추가로 설치합니다. 

npm install --save-dev @types/jasmine@2.5.41 @types/node html-loader jasmine karma karma-webpack ts-loader karma-sourcemap-loader karma-jasmine karma-jasmine-html-reporter angular2-template-loader karma-chrome-launcher null-loader

뭔가 엄청나게 많은 모듈들이 필요하네요.

가만히 보면 webpack, karma, jasmine 이런 녀석들입니다.


karma를 실행하기 위해서는 몇 가지 configuration이 필요합니다.

보통 config.js파일을 미리 만들어 두고, 이를 로드해서 테스트를 수행하는 형태를 띕니다.

아래 파일을 다운로드 받아서, project folder에 'test-config'라는 folder를 만들고 그 아래에 붙여 넣으세요.


test-config.zip


앞으로 우리가 만들 test code는 실제로 배포를 할 성질의 것이 아니므로, tsconfig.json파일을 수정해서 exclude하도록 합시다.

"exclude": [
"node_modules",
"src/**/*.spec.ts"
],


준비는 모두 마쳤습니다.

이제 test가 잘 되는지 test해 보죠. :-)


karma start test-config/karma.conf.js

참조한 post에서는 해당 명령어를 package.json파일에 선언해 두고, npm test라는 명령어로 수행했는데, 왠지 저는 안되더라고요. 혹시 solution을 아시면 댓글 남겨주세요.


문제 없이 세팅이 되었다면 아래와 같은 메시지를 보실 수 있을 겁니다.

webpack: Compiled successfully.

webpack: Compiling...


그러면, 이제부터는 unit test code를 만들어 보겠습니다.



Write a test

module로 구성된 Angular2의 기능들 중에서 Service라는 녀석은 공용으로 사용할 library같은 녀석입니다.

그런 역할을 가진 만큼 다른 어떤 module 보다도 테스트의 우선순위가 높은 녀석이라고 생각합니다.


그래서 간단한 기능을 가진 serivce를 만들고, 이를 테스트해 보겠습니다.

(Component module은 test하기 어려워서 대는 핑계입니다...)


파일의 위치는 아래와 같습니다.



book.service.ts

import { Injectable } from '@angular/core';

@Injectable()
export class BookService {

constructor() { }

public greeting(): string {
return 'hello';
}
}

greeting이라는 function을 호출하면 'hello'를 반환하는 기능 밖에는 없는 단순한 service입니다.

실제 service는 보통 ajax call 등을 수행하고 그 결과를 반환하는 역할을 하겠지요.

우리의 경우는 native call이 될 수도 있고요.


Angular2의 서비스는 어디에든 가져다 쓸 수 있게 끔 @Injectable이라는 데코레이션을 달아줘야 합니다. (.net에서는 비슷한 용도의 코드를 attribute라고 불렀던 것 같은데)


book.service.spec.ts

import { BookService } from './book.service';

describe('Service: BookService', () => {
let service : BookService;

beforeEach(() => {
service = new BookService();
});

it('should be create', () => {
expect(service).toBeTruthy();
});

it('should be say hello', () => {
expect(service.greeting()).toEqual('hello');
});
});

BookSerivce를 참조하기 위해서 import해주었습니다.

서비스는 test 이전에 매번 새로운 instance를 만들도록 beforeEach구문을 통해서 생성해 주었고요.


여기 두 개의 test가 있습니다.

하나는 service가 제대로 instance화 되었는 지를 먼저 확인합니다.

다른 하나는 greeting function이 'hello'를 반환하는 지 확인합니다.


결과가 다음과 같이 나왔습니다.




참고로, test code는 대상 source code와 같은 folder에 위치하고, 그 파일의 이름을 .spec.ts이라고 명명합니다.

왜냐하면, test-config/karma-test-shim.js 파일에 그렇게 찾아서 테스트하라고 정의했거든요.

var appContext = require.context('../src', true, /\.spec\.ts/);


저는 이제부터 M모 방송사의 POC 앱을 만들러 갑니다.


References

http://roblouie.com/article/376/ionic-2-set-up-unit-testing-the-best-way/

'Javascript' 카테고리의 다른 글

Implement base controller  (0) 2017.07.26
Service workers.  (0) 2017.07.06
npm lite-server  (0) 2017.07.06
Calculate distance between two geolocations.  (1) 2017.06.28

+ Recent posts