Today
-
Yesterday
-
Total
-
  • 간단한 데이타베이스를 TDD 로 개발하기 1회: dump-db
    Programmer/Programming 2014. 3. 19. 09:47

    앞으로 몇번에 걸쳐서 연재할 내용은 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

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

    댓글

Designed by Tistory.