Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Clojure のテストについて
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ayato
April 21, 2016
Programming
760
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Clojure のテストについて
ayato
April 21, 2016
More Decks by ayato
See All by ayato
マイクロサービス内で動くAPIをF#で書いている
ayato0211
1
1.5k
Clojureという言語が私逹にもたらしたもの
ayato0211
6
3.2k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
300
Re:REPL-Driven Development
ayato0211
3
1.4k
Meta Template Engine
ayato0211
2
1.2k
超変換! Hiccup data structure!!
ayato0211
2
660
About Integrant
ayato0211
0
600
Muscle Assert
ayato0211
0
320
Clojureを用いたWebアプリケーション開発
ayato0211
2
3.2k
Other Decks in Programming
See All in Programming
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
130
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
Oxcを導入して開発体験が向上した話
yug1224
4
310
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.1k
The NotImplementedError Problem in Ruby
koic
1
770
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
240
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
240
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
330
ふつうのFeature Flag実践入門
irof
7
3.9k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
350
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
170
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.2k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
240
Become a Pro
speakerdeck
PRO
31
6k
Evolving SEO for Evolving Search Engines
ryanjones
0
220
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
380
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
RailsConf 2023
tenderlove
30
1.5k
How to build a perfect <img>
jonoalderson
1
5.6k
Writing Fast Ruby
sferik
630
63k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
Transcript
$MPKVSFͷςετ ʹ͍ͭͯ $MPKVSFೱ͍Ί ୈճौ୩KBWB !BZBUP@Q$ZCP[V4UBSUVQT *OD
BZBUP@Q ͋ͽʔͰ͢ &NBDTͱ$MPKVSF͕͖Ͱ͢ $MPKVSFྺͷ$MPKVSFΤϯδχΞͰ͢ ݄͔Βฐࣾ$MPKVSJBOਓʹͳΓ·͢
ຖճ$MPKVSFͷΛͯ͠ΔํͰ͢
࣍ ͦͦ$MPKVSFͬͯͳΜͩ $MPKVSFͰͷςετʹ͍ͭͯ DMPKVSFUFTUΛͬͨجຊతͳςετͷॻ͖ํ ΑΓ࣮ફతͳॻ͖ํ ଞͷςετϑϨʔϜϫʔΫʹ͍ͭͯ
ͦͦ$MPKVSF ͬͯͳΜͩ
ͦͦ$MPKVSFͬͯͳΜͩ -JTQ ಈత։ൃ ؔܕϓϩάϥϛϯά ࣮ߦ࣌ϙϦϞʔϑΟζϜ ฒߦϓϩάϥϛϯά +7.ϗετ PS+BWB4DSJQU /&5
$MPKVSFͰͷ ςετʹ͍ͭͯ
3&1-ฤ 3&1-%SJWFO%FWFMPQNFOU ୯७ͳಈ࡞֬ೝͰςετέʔεॻ͘ΑΓ 3&1-Ͱ֬ೝͨ͠ํ͕ૣ͍
ςετίʔυฤ ࠓͷຊฤ 3%%Λओு͢Δ͜ͱଟ͍͚ͲςετΛશ͘ ॻ͔ͳ͍Θ͚Ͱͳ͍ ଞͷݴޠʹൺΔͱςετ͕ॻ͖͍͢ͱ ײ͡Δͱ͜Ζଟ͍
DMPKVSFUFTUΛͬͨ جຊతͳ ςετͷॻ͖ํ
(require '[clojure.test :refer :all]) (is (= 4 (+ 2 2)))
(is (instance? Long 256)) (is (.startsWith "abcde" "ab")) Ξαʔγϣϯ DMPKVSFUFTUωʔϜεϖʔεΛ͏ JTϚΫϩ͚֮ͩ͑Ε؆୯ʹςετ͕ग़དྷΔ
user> (is (= 5 (+ 2 2))) FAIL in ()
(form-init305064439250635979.clj:3) expected: (= 5 (+ 2 2)) actual: (not (= 5 4)) false Ξαʔγϣϯ 3&1-Ͱ࣮ߦՄೳ
(is (thrown? ArithmeticException (/ 1 0))) (is (thrown-with-msg? ArithmeticException #"Divide
by zero" (/ 1 0))) Ξαʔγϣϯ ྫ֎ͷ߹ಛघͳUISPXO ͳͲΛ͏
(is (= 5 (+ 2 2)) "Arithmetic") ςετͷυΩϡϝϯτԽ JTϚΫϩୈೋҾʹΞαʔγϣϯͷ આ໌ΛՃग़དྷΔ
(testing "Arithmetic" (testing "with positive integers" (is (= 4 (+
2 2))) (is (= 7 (+ 3 4)))) (testing "with negative integers" (is (= -4 (+ -2 -2))) (is (= -1 (+ 3 -4))))) ςετͷυΩϡϝϯτԽ UFTUJOHϚΫϩͰςετͷάϧʔϓԽ͕ग़དྷΔ จࣈྻGBJMVSFSFQPSUTʹؚ·ΕΔ Ϩϙʔτ34QFD෩
(with-test (defn my-function [x y] (+ x y)) (is (=
4 (my-function 2 2))) (is (= 7 (my-function 3 4)))) ςετͷఆٛ XJUIUFTUΛ͏ͱؔͷఆٛͱಉ࣌ʹ ςετΛهड़ग़དྷΔ ௨ৗ͏͜ͱͳ͍ ίʔυશମͷݟ௨͕͠ѱ͘ͳΔ
(deftest addition (is (= 4 (+ 2 2))) (is (=
7 (+ 3 4)))) (deftest subtraction (is (= 1 (- 4 3))) (is (= 3 (- 7 4)))) ςετͷఆٛ EFGUFTUϚΫϩΛ͏ ςετରͱςετΛ͚ͯهड़ग़དྷΔ ௨ৗͪ͜ΒΛ͏ͷ͕Ұൠత
(defn my-fixture [f] ;; 前処理 (f) ;; テストの実行 ;; 後処理
) (use-fixtures :each my-fixture) ςετϑΟΫενϟ ϑΟΫενϟࣗମؔΛͻͱͭड͚औΔ ؔͱͯ͠ఆٛͰ͖Δ ωʔϜεϖʔεʹରͯ͠Ξλον͢Δ
ΑΓ࣮ફతͳॻ͖ํ
!U@XBEB͞ΜͷΛղ͘ Լهͷ༷ΛςεςΟϯάϑϨʔϜϫʔΫΛͬͯςετίʔυΛ ॻ͖ͳ͕Β࣮͍ͯͩ͘͠͞ɻ ʲ༷ʳʮݱࡏ࣌ࠁʯʹԠͯ͡ɺѫࡰͷ༰ΛԼهͷΑ͏ʹͦΕͧΕฦ ͢ػೳΛ࡞͍ͨ͠ɻ λΠϜκʔϯ"TJB5PLZPͱ͢Δ ே Ҏ্ະຬ ͷ߹ɺʮ͓Α͏͍͟͝·͢ʯͱฦ͢
ன Ҏ্ະຬ ͷ߹ɺʮ͜Μʹͪʯͱฦ͢ Ҏ্ະຬ ͷ߹ɺʮ͜ΜΜʯͱฦ͢ ྫ࣌ʹHSFFUFSHSFFU ΛݺͿͱ͜Μʹͪͱฦ͢ IUUQTDPEFJRKQNBHB[JOF
(ns demoapp.greeter) (defn current-date-time [] (java.time.LocalDateTime/now)) (defn greet [] (let
[current-hour (.getHour (current-date-time))] (cond (<= 5 current-hour 11) "おはようございます" (<= 12 current-hour 17) "こんにちは" :else "こんばんは"))) ςετରͷίʔυ
(ns demoapp.greeter-test (:require [clojure.test :refer :all] [demoapp.greeter :as g :refer
:all]) (:import [java.time LocalDateTime])) (deftest greet-test (are [dt-str expect] (with-redefs [g/current-date-time (constantly (LocalDateTime/parse dt-str))] (= (greet) expect)) "2016-04-22T00:00" "こんばんは" "2016-04-22T04:59" "こんばんは" "2016-04-22T05:00" "おはようございます" "2016-04-22T11:59" "おはようございます" "2016-04-22T12:00" "こんにちは" "2016-04-22T17:59" "こんにちは" "2016-04-22T18:00" "こんばんは" "2016-04-22T23:59" "こんばんは")) ςετίʔυ
͍ͬͯΔςΫχοΫ BSFϚΫϩʹΑΔύϥϝλϥΠζυςετ XJUISFEFGTʹΑΔςετμϒϧͷ࣮ݱ
BSFϚΫϩ Έࣗମ୯७ JTϚΫϩͷܗʹల։͞ΕΔ ;; これが (are [a b x] (=
(+ a b) x) 1 2 3 5 10 15) ;; こう展開される (do (is (= (+ 1 2) 3)) (is (= (+ 5 10) 15)))
XJUISFEFGT 7BSΛ࠶ఆٛ͢Δ CPEZ෦ͷΈͰ༗ޮ (defn add3 [x] (+ x 3)) (with-redefs
[add3 (fn [x] (+ x 10))] (= (add3 10) 20)) ;; => true
(do (is (with-redefs [g/current-date-time (constantly (LocalDateTime/parse "2016-04-22T00:00"))] (= (greet) "こんばんは")))
;; ... 中略 (is (with-redefs [g/current-date-time (constantly (LocalDateTime/parse "2016-04-22T23:59"))] (= (greet) "こんばんは")))) ͭ·Γ͜͏ͳΔ
ଞͷ ςετϑϨʔϜϫʔΫ ʹ͍ͭͯ
લఏͱͯ͠ ࠷ۙͰ৽͍͠%4-ΛΘͳ͍Ͱ DMPKVSFUFTUΛ͏ͷ͕ྲྀߦΓ IUUQTSBTUFSJ[FJPCMPHDMPKVSFUIFHPPE QBSUTIUNM ͍ͬͯΔଆͷײ֮ͱͯ͠ DMPKVSFUFTUͰΓΔͱײ͡Δ͜ͱଟ͍
TQFDMK 34QFDΛ$MPKVSFͱ$MPKVSF4DSJQUʹ ͖࣋ͬͯͨͱ͍͏ײ͡ͷςετϑϨʔϜϫʔΫ ͋·Γಛ༗ͷػೳΈ͍ͨͳͷ͕ͳ͍ͷͰ ͏ϝϦοτ͕ྑ͔͘Βͳ͍
.JEKF ϙϐϡϥʔͳςετϑϨʔϜϫʔΫ GBDUBDUVBMFYQFDU ͱॻ͚Δ ߏͷൺֱ͕༰қͰ͋Δͷͱ.FUBDPOTUBOUT ͕ศརͰ͋Δ Ϧϩʔυ͢Δͱςετ͕࣮ߦ͞Εͯ͠·͏ υΩϡϝϯτ͕͋·Γ៉ྷʹ·ͱΊΒΕͯͳ͍
(def complex-data {"平成" [ {:id 1 :name "ayato_p"} {:id 2
:name "alea12"} ] "昭和" [ {:id 99 :name "foo"} {:id 100 :name "bar"} ]}) (fact complex-data => (contains {"平成" (contains [{:id 1 :name "ayato_p"}])})) .JEKF
(def members {1 "ayato_p" 2 "alea12" 3 "zer0_u"}) (defn get-id
[m] (get m :id)) (defn find-member [m] (get members (get-id m))) (fact (find-member ...m...) => "ayato_p" (provided (get-id ...m...) => 1)) .JEKF
GVEKF ܰྔ൛.JEKF _LCKBS ґଘ͕ؔগͳ͍ͷಛ ·ͩࢼͨ͜͠ͱͳ͍͚Ͳྑͦ͞͏
DMPKVSFUFTUDIFDL 2VJDL$IFDLGPS$MPKVSF $MPKVSFຊମͷςετʹΘΕ͍ͯΔ
·ͱΊ
·ͱΊ $MPKVSFͰςετΛॻ͘ͷ؆୯ ͱΓ͋͑ͣ໎ͬͨΒDMPKVSFUFTUΛ͏ UFTUDIFDLҰॹʹ͑Δ