TDD를 공부하기 위해서 열심히 유튜브를 통해 jest 사용법을 공부하고 있는 와중. 충격을 먹은 부분이 있어서 잊지 않고자 블로그에 포스팅해보려고 한다.
바로 배열 없이 스택 구ㅡ현하기!!
우선 기본적인 설정부터 해보자. 일반적은 node js 환경에서 test를 돌리는 것이기 때문에, jest
와 @types/jest
가 필요하다. npm init
을 커맨드에 작성하고 두 라이브러리를 다운받아 주자.
그 후 package.json
을 다음과 같이 바꿔주자.
{
"test" : jest --watchAll --verbose --coverage
}
위와 같이 구성을 하면 이제 TDD로 배열 없이 배열 만들기 준비가 끝났다. 배열 없는 배열 팀
describe('배열 만들기',()=>{
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
});
it('스택 top에 push?');
it('pop도 가능?');
});
TDD의 기본 방향은 우선 틀린 테스트 케이스 작성
-> 고쳐서 작동하게 만들기
-> 반복이다.
위처럼 코드를 짜서 test를 돌려보면 당연히 fail이다. Stack이 정의되지 않았기 때문. stack을 구현해준다.
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
}
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?');
it('pop도 가능?');
});
test가 끝난 후 다음 번 test를 진행하기 전에 initialize가 필요하다.
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?');
it('pop도 가능?');
});
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?');
});
stack의 push에 대한 test case 먼저 작성
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
get peek() {
return this.items[this.top];
}
push(value){
this.top += 1;
this.items[this.top] = value;
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?');
});
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
get peek() {
return this.items[this.top];
}
push(value){
this.top += 1;
this.items[this.top] = value;
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?',() => {
stack.push('haha');
stack.pop();
expect(stack.top).toBe(-1);
exprect(stack.peek).toBe(undefined);
});
});
test case 기반으로 구현한다.
describe('배열 만들기',()=>{
class Stack {
constructor(){
this.top = -1;
this.items = {}; // 배열을 못 쓰니 빈 객체를 넣자.
}
get peek() {
return this.items[this.top];
}
push(value){
this.top += 1;
this.items[this.top] = value;
}
pop(){
this.top -= 1;
delete this.items[this.top];
}
}
// 초기화
beforeEach(()=>{
stack = new Stack();
})
it('스택이 empty로 만들어졌는가?', () => {
const stack = new Stack();
expect(stack.top).toBe(-1);
expect(stack.items).toEqual({}); // toBe(x) toEqual(0)
});
it('스택 top에 push?',()=>{
stack.push('haha');
expect(stack.top).toBe('haha');
exprect(stack.peek).toBe('haha);
});
it('pop도 가능?',() => {
stack.push('haha');
stack.pop();
expect(stack.top).toBe(-1);
exprect(stack.peek).toBe(undefined);
});
});
class
를 항상 기억하자.