2012年9月13日木曜日

Datomicの利用(3)

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
テストコードを書く時、気持ちの昂りを抑えきれない、たなけんです。
本エントリでは、Datomicを利用したClojureアプリケーションのテストについて記述します。

本体の改修

テストコードを実行した際、想定した通りにデータの改廃がされていなかったため、本体コードを改修しました。
元のソースでは、定数connの宣言部で一度だけt/connect関数を呼び、その接続を他の関数内で利用していました。しかし、この場合、データベースが削除されても接続(peer)のキャッシュにデータが乗っているため、検索が可能な状態でした。
テストコードでは、各テストの前にデータベースを削除し、全てのデータを初期化する必要があったため、find-all関数などに含まれている接続オブジェクトも更新(具体的にはt/connect関数の呼び直し)が必要となりました。
そこで、接続オブジェクトを各関数の引数とし、接続オブジェクトの更新が必要無い本体コードでは、一度だけ宣言したconnを、テストコードでは毎回呼び直したオブジェクトを利用する様変更しました。
(def uri "datomic:mem://my-dictionary")
(d/create-database uri)
(def conn
(d/connect uri))
(defn add-attribute-work-word
""
[cnct]
(d/transact cnct [{
:db/id #db/id[:db.part/db]
:db/ident :work/word
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "A word"
:db.install/_attribute :db.part/db}]))
(defn add-attribute-work-time
""
[cnct]
(d/transact cnct [{
:db/id #db/id[:db.part/db]
:db/ident :work/time
:db/valueType :db.type/instant
:db/cardinality :db.cardinality/one
:db/doc "Time"
:db.install/_attribute :db.part/db}]))
(add-attribute-work-word conn)
(add-attribute-work-time conn)
(defn add-a-work
""
[cnct word date]
(d/transact cnct [{:db/id #db/id[:db.part/user] :work/word word :work/time (time-coerce/to-date date)}]))
(defn find-all
""
[cnct]
(q '[:find ?n ?t :where [?e :work/word ?n] [?e :work/time ?t]] (db cnct)))
(defn today?
""
[date]
(let [now (time/now) today (time/date-time (time/year now) (time/month now) (time/day now))]
(time/within? (time/interval today (time/plus today (time/days 1))) (time-coerce/from-date date))))
(defn find-today
""
[cnct]
(q '[:find ?n ?t :where [?e :work/word ?n] [?e :work/time ?t] [(my-dictionary.core/today? ?t)]] (db cnct)))
(defn limit?
""
[n cnct]
(> n (count (find-today cnct))))
(defn call-api
""
[url prms extract-function]
(if (limit? 50 conn)
(do
(add-a-work conn ((nth prms 1) 1) (time-coerce/to-date (time/now)))
(-> (build-url-with-prms url prms)
(get-body ,)
(extract-function ,)
(json/generate-string ,)))
(json/generate-string (create-data '({:pos "" :text "I am sorry, this system is busy. Please access again tomorrow"})))))
view raw core.clj hosted with ❤ by GitHub


単体テスト

事前条件として、peerのGC、データベースの削除、追加、スキーマの作成を行っています。その後データ挿入、検索のテスト。再度条件を初期化し、利用制限確認関数の境界値テストを実施するようにしました。
(defn pre-test-datomic
""
[]
(do (d/gc-storage (d/connect test-url) (time-coerce/to-date (time/now)))
(d/delete-database test-url)
(d/create-database test-url)
(add-attribute-work-word (d/connect test-url))
(add-attribute-work-time (d/connect test-url))))
(deftest test-add-a-work
(is
(do (pre-test-datomic)
(add-a-work (d/connect test-url) "test" (time-coerce/to-date (time/now)))
((first (find-all (d/connect test-url))) 0))
"test"))
(deftest test-today?
(today? (time-coerce/to-date (time/now))))
(deftest test-limit?
(is
(do (pre-test-datomic)
(add-a-work (d/connect test-url) "test" (time-coerce/to-date (time/now)))
[(limit? 1 (d/connect test-url)) (limit? 2 (d/connect test-url))])
[false true]))
view raw core_test.clj hosted with ❤ by GitHub


結合テスト

手動でテストを実施しました。
データベースを初期化、限界件数を1にした状態で、画面を操作し、1度目の検索は正常に実行され、2度目の検索でsorryメッセージが表示されることを確認しました。

今回の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間30分)

0 件のコメント:

コメントを投稿