Practice/Lisp, Scala

간단한 데이타베이스를 TDD 로 개발하기 1회: dump-db

앞으로 몇번에 걸쳐서 연재할 내용은 Peter Seibel가 쓴 “Practical Common Lisp” 중에 3장 “A Simple Database”를 테스트 주도 개발(Test-Driven Development: TDD)로 재구성한 것이다. 책과 비교해서 프로그램의 작성 순서만 달리할 뿐 소스는 책의 것과 같다.

이번 연재에는 테스트 프레임워크로 lisp-unit을 이용한다

CD 데이타베이스인 cd-db 패키지와 테스트가 있는 cd-tests 패키지로 분리하여 개발을 시작한다.

(defpackage :cd-db
  (:use :common-lisp)
  (:export #:dump-db))

(in-package :cd-db)

(defpackage :cd-tests
  (:use :common-lisp :lisp-unit :cd-db))

(in-package :cd-tests)

DB의 저수준의 형태를 그대로 출력하는 기능부터 시작해보자. 실제 사용할 인터페이스와 출력 결과를 상상하면 된다. 함수 이름은 dump-db이며, 아무런 인자 없이 호출된다. 출력 포맷은 리습에서 다루기 쉬운 리스트를 사용하자. DB는 CD의 레코드를 가지는 리스트이고, 각 레코드는 키-값 방식의 속성 리스트(property list, 줄여서 plist) 형태의 리스트이다. 키는 제목(title), 아티스트(artist), 순위(rating), 리핑 여부(ripped)으로 구성된다.

하나의 레코드는 아래와 같이 표현되며,

(:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t)

DB는 이와 같은 레코드의 리스트로, dump-db를 수행하면 아래와 같이 출력이 된다.

((:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t)
 (:title "Roses" :artist "Kathy Mattea" :rating 7 :ripped t))

테스트 작성부터 시작한다. (함수의 구현하지 전에 테스트부터 작성한 것을 주목하길 바란다.)

(define-test dump-db-test
    (assert-equal '((:title "Home"
                     :artist "Dixie Chicks"
                     :rating 9
                     :ripped t))
                  (dump-db)))

방금 작성한 테스트는 dump-db 함수가 정의되지 않아서 실패한다.

Unit Test Summary
 | 1 assertions total
 | 0 passed
 | 1 failed
 | 0 execution errors
 | 0 missing tests

테스트 이후에는 빠르게 실패와 오류를 제거해나가는 것이 중요하다.

dump-db 함수를 단순하게 기대하는 결과를 출력하는 것으로 빠르게 작성한다.

(defun dump-db ()
  '((:title "Home" :artist "Dixie Chicks" :rating 9 :ripped t)))

테스트를 깔끔하게 통과하는 것을 확인할 수 있다.

Unit Test Summary
 | 1 assertions total
 | 1 passed
 | 0 failed
 | 0 execution errors
 | 0 missing tests

테스트의 통과를 축하하고 기뻐하며 커피라도 한잔 마시자.

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 13
Yesterday : 204
Total : 213,793