-
간단한 데이타베이스를 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 댓글