Linked List with TDD-1

hun·2020년 3월 22일
0

TDD(Test Driven Development)에 익숙하지 않은 개발자들에게 TDD란 항상 언젠가는 익혀야될 숙제같은 존재입니다. 그래서 타입스크립트Singly-Linked List 구현을 통해서 TDD를 익혀보고자합니다.


환경설정

우선 테스트 환경을 만들어보겠습니다. 터미널에서 빈 폴더를 만들고 폴더 내부로 들어갑니다. 폴더 명은 임의로 만드시면 됩니다. pakage.json 파일을 만들어보겠습니다.

npm init

자 이제, package.json 파일이 생성되었습니다. 필요한 패키지들을 설치해보도록 하겠습니다.

npm install chai mocha ts-node @types/chai @types/mocha --save-dev

타입스크립트를 잊어버리면 안되겠죠?

npm install typescript --save

이제 package.json의 scripts를 고쳐보겠습니다.

"test": "mocha -r ts-node/register src/**/*.spec.ts"

환경 설정이 완료되었습니다.

단일 연결리스트


우리가 구현 할 Singly-Linked List 입니다. Singly-Linked List는 순차적으로 연결된 노드들의 집합입니다. 노드는 다음 노드의 Reference를 가르킬 변수 next와 데이터를 저장할 data 변수를 가집니다. 노드의 메모리 사용량은 만약 data 가 number 형이라면 8 bytes를(ECMAScript startd에 따르면 8bytes라고합니다) string 형이라면 문자당 2 bytes를 boolean 형이라면 4bytes의 메모리 사용량이 발생합니다. next 포인터는 number 형일경우 8bytes의 메모리라고 가정하겠습니다(이는 C언어를 참고하였으며 정확한 정보는 아닙니다). 하여 노드의 총 메모리 사용량은 16bytes 가 되겠습니다.

첫번째 테스트 작성 및 구현

노드를 구현? 아니 테스트 해보겠습니다. 우선 root 경로에 src 디렉토리를 만들고 src 디렉토리 내에 SinglyLinkedList.spec.tsSinglyLinkedList.ts 파일을 생성해줍니다.

그럼 SinglyLinkedList.spec.ts에 테스트를 먼저 작성해봅시다. 노드 클래스에 data와 next field가 있는지를 테스트 하겠습니다.

import { expect } from 'chai'
import { Node } from './SinglyLinkedList'
import 'mocha'

describe('Node Class는', ()=>{
	it('data와 next 필드를 가지고있다', ()=>{
    	const node1 = new Node<number>();
        expect(node1.data).to.equal(undefined);
        expect(node1.next).to.equal(undefined);
    })
})

테스트가 작성이 완료되었습니다. 터미널에 npm test를 돌려봅니다. 이런 오류가 납니다. 구현을 하지 않았기 때문입니다. 그럼 테스트가 통과 될 수 있게 SinglyLinkedList.ts 파일에 구현을 해줍니다.

export const class Node<T> {
	public data: T;
    	public next: Node<T>
}

타입스크립트의 제네렉을 통해서 data 자료형을 변경할 수 있도록 만들어줍니다. next에는 다음 노드의 reference 즉 주소값이 저장되어야합니다. c나 c++의 경우 포인터가 되겠죠. 때문에 next 포인터에 Node 자료형을 넣어줍니다.

구현이 완료되었습니다. 터미널 창으로 돌아가서 npm test를 돌려줍니다.


첫번째 테스트가 성공했습니다.

두번째 테스트 작성 및 구현

이제 Node들로 구성된 SinglyLinkedList를 구현? 아니 먼저 테스트를 작성해보도록 하겠습니다. SinglyLinkedList는 첫번째 노드의 포인터를 가지는 head field와 노드를 삽입하는 Add 메소드, 삽입된 노드의 데이터를 변경하는 Modify 메소드, 노드를 삭제하는 Delete 메소드 그리고 전체 노드 데이터를 출력하는 Print 메소드를 가지고 있어야한다고 가장합니다.

그럼 SinglyLinkedList.spec.ts에 이어서 테스트 코드를 작성합니다.

import { expect } from 'chai'
import 'mocha'
import { Node, SinglyLinkedList } from './SinglyLinkedList'

  
~~~~~~~~~~~~~~~~~~~~~~~
  
describe('SinglyLinkedList Class는', ()={
    it('head field를 가지고있다', ()=>{
    	const linkedList = new SinglyLinkedList<number>();
        expect(linkedList.head).to.equal(undefined);
    })
    it('Add, Modify, Delete 그리고 Print 메소드를 가지고있다', ()=>{
    	const linkedList = new SinglyLinkedList<number>();
        expect(linkedList.Add).to.be.a('function');
  	expect(linkedList.Modify).to.be.a('function');
  	expect(linkedList.Delete).to.be.a('function');
  	expect(linkedList.Print).to.be.a('function');
    })
})

테스트 코드를 작성한 뒤 돌려보면 당연히 실패합니다. 그럼 이어서SinglyLinkedList.ts 파일에 구현을 해보겠습니다.

export class SinglyLinkedList<T>{
  public head: Node<T>;
  Add(){}
  Modify(){}
  Delete(){}
  Print(){}
}

구현이 완료되었습니다. 그럼 테스트를 돌려줍니다.

성공했습니다! 상당히 뿌듯합니다. 여기까지 따라오시라 수고 많으셨습니다.
다음 포스트에서는 각 메소드들의 세부 구현을 테스트 및 작성하도록 하겠습니다.

profile
front-end developer

0개의 댓글