-
간단한 데이타베이스를 TDD 로 개발하기 3회: add-recordProgrammer/Programming 2014. 3. 19. 10:02
이번 강의에서는 CD 레코드를 DB에 추가하는 함수 add-record를 개발한다. 이 함수는 인자로 CD 레코드를 받는다.
비어있는 DB에 add-record로 레코드를 추가하면,
(add-record (make-cd
"Home"
"Dixie Chicks"
9 t))
dump-db는 다음과 같은 결과를 출력한다.
'((:title
"Home"
:artist
"Dixie Chicks"
:rating 9 :ripped t))
1차 테스트의 구현과 통과는 쉽고 간단함으로 빠르게 진행하자.
(define-test add-record-test
(add-record (make-cd
"Home"
"Dixie Chicks"
9 t))
(assert-equal '((:title
"Home"
:artist
"Dixie Chicks"
:rating 9
:ripped t))
(dump-db)))
위 테스트는 레코드를 리스트로 만듬으로 쉽게 통과했다.
(
defun
add-record
(cd) (list cd))
add-record 테스트를 여러개의 레코드를 추가하도록 수정해보자.
(define-test add-record-test
(add-record (make-cd
"Home"
"Dixie Chicks"
9 t))
(assert-equal '((:title
"Home"
:artist
"Dixie Chicks"
:rating 9
:ripped t))
(dump-db))
(add-record (make-cd
"Roses"
"Kathy Mattea"
7 t))
(assert-equal '((:title
"Home"
:artist
"Dixie Chicks"
:rating 9
:ripped t)
(:title
"Roses"
:artist
"Kathy Mattea"
:rating 7
:ripped t))
(dump-db)))
어떠한 문제가 있을까? 레코드를 저장하는 DB가 존재하지 않는다.
- DB를 저장하는 전역 변수를 추가하고, 이에 따라 add-record와 dump-db 함수를 수정한다.
- 이전 테스트가 다음의 테스트에 영향을 주지 않도록, DB 상태를 초기화하는 drop-db 함수를 추가한다.
- DB를 비교할 때, 레코드의 순서와 상관없이 비교할 수 있도록 DB의 레코드를 정렬해주는 sort-db 함수를 추가한다.
아래는 위 문제를 해결한 코드이다.
(
defpackage
:cd-db
(:use :common-lisp)
(:export #:dump-db
#:drop-db
#:make-cd
#:add-record))
(
in-package
:cd-db)
(
defvar
*db*
nil)
(
defun
dump-db
() *db*)
(
defun
drop-db
() (setq *db* nil))
(
defun
make-cd
(title artist rating ripped)
(list :title title :artist artist :rating rating :ripped ripped))
(
defun
add-record
(cd) (push cd *db*))
더불어, 지금까지 작성된 전체 테스트는 아래와 같다.
(
defpackage
:cd-tests
(:use :common-lisp :lisp-unit :cd-db))
(
in-package
:cd-tests)
(define-test make-cd-test
(assert-equal '(:title
"Home"
:artist
"Dixie Chicks"
:rating 9
:ripped t)
(make-cd
"Home"
"Dixie Chicks"
9 t))
(assert-equal '(:title
"Roses"
:artist
"Kathy Mattea"
:rating 7
:ripped t)
(make-cd
"Roses"
"Kathy Mattea"
7 t)))
(
defun
sort-db
(db) (sort db #'string< :key #'cadr))
(define-test add-record-test
(drop-db)
(add-record (make-cd
"Home"
"Dixie Chicks"
9 t))
(assert-equal (sort-db '((:title
"Home"
:artist
"Dixie Chicks"
:rating 9
:ripped t)))
(sort-db (dump-db)))
(add-record (make-cd
"Roses"
"Kathy Mattea"
7 t))
(assert-equal (sort-db '((:title
"Roses"
:artist
"Kathy Mattea"
:rating 7
:ripped t)
(:title
"Home"
:artist
"Dixie Chicks"
:rating 9
:ripped t)))
(sort-db (dump-db))))
'Programmer > Programming' 카테고리의 다른 글
MAPCAR와 그 친구들(MAPC, MAPCAN) (0) 2014.05.30 간단한 데이타베이스를 TDD 로 개발하기 소스 코드 (0) 2014.03.19 간단한 데이타베이스를 TDD 로 개발하기 2회: make-cd (0) 2014.03.19 간단한 데이타베이스를 TDD 로 개발하기 1회: dump-db (0) 2014.03.19 현상을 분석하여 문제의 원인을 찾아내라 (1) 2013.11.12