Today
-
Yesterday
-
Total
-
  • 간단한 데이타베이스를 TDD 로 개발하기 3회: add-record
    Programmer/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))))


    댓글

Designed by Tistory.