はじめに
おはようございます。当ブログにアクセス頂き、ありがとうございます。テストコードを書く時、気持ちの昂りを抑えきれない、たなけんです。
本エントリでは、Datomicを利用したClojureアプリケーションのテストについて記述します。
本体の改修
テストコードを実行した際、想定した通りにデータの改廃がされていなかったため、本体コードを改修しました。元のソースでは、定数connの宣言部で一度だけt/connect関数を呼び、その接続を他の関数内で利用していました。しかし、この場合、データベースが削除されても接続(peer)のキャッシュにデータが乗っているため、検索が可能な状態でした。
テストコードでは、各テストの前にデータベースを削除し、全てのデータを初期化する必要があったため、find-all関数などに含まれている接続オブジェクトも更新(具体的にはt/connect関数の呼び直し)が必要となりました。
そこで、接続オブジェクトを各関数の引数とし、接続オブジェクトの更新が必要無い本体コードでは、一度だけ宣言したconnを、テストコードでは毎回呼び直したオブジェクトを利用する様変更しました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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"}))))) |
単体テスト
事前条件として、peerのGC、データベースの削除、追加、スキーマの作成を行っています。その後データ挿入、検索のテスト。再度条件を初期化し、利用制限確認関数の境界値テストを実施するようにしました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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])) |
結合テスト
手動でテストを実施しました。データベースを初期化、限界件数を1にした状態で、画面を操作し、1度目の検索は正常に実行され、2度目の検索でsorryメッセージが表示されることを確認しました。
今回の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間30分)
0 件のコメント:
コメントを投稿