Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Clojure のテストについて
Search
ayato
April 21, 2016
Programming
780
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.7k
Clojureという言語が私逹にもたらしたもの
ayato0211
6
3.2k
3年間考え続けてきたWebアプリケーションにおけるテストの話
ayato0211
3
320
Re:REPL-Driven Development
ayato0211
3
1.4k
Meta Template Engine
ayato0211
2
1.2k
超変換! Hiccup data structure!!
ayato0211
2
680
About Integrant
ayato0211
0
610
Muscle Assert
ayato0211
0
340
Clojureを用いたWebアプリケーション開発
ayato0211
2
3.3k
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
340
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
440
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
250
ジョジョの世界をXRで再現する
mofurune
0
110
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
7
1.8k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
120
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
270
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
13
6.6k
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
contenteditable と日本語入力に向き合う
colorful12
0
110
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Design in an AI World
tapps
1
350
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
350
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
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Ұॹʹ͑Δ