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
Goの時刻に関するテスト/Testing time in Go
Search
Kentaro Kawano
July 07, 2017
Programming
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goの時刻に関するテスト/Testing time in Go
Goの時刻に関するテスト
Kentaro Kawano
July 07, 2017
More Decks by Kentaro Kawano
See All by Kentaro Kawano
Goでのレシーバーとnilの関係 / Receiver and nil relationship in Go
kawaken
0
540
Starting Python
kawaken
0
160
AWS Lambda + Go
kawaken
0
150
goaのdesignをラクに書く/Write goa design easily
kawaken
0
140
Goでのチーム開発とコード管理の悩み/Team development and code management in Go
kawaken
0
140
Pyvmomiとansibleのdynamic inventory
kawaken
0
150
Other Decks in Programming
See All in Programming
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
160
Jetpack Compose Mechanisms
skydoves
2
720
mrbgem 三角測量 開発
ogom
0
240
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
4
4.7k
SREの越境 / SRE Collaboration
y0hgi
2
300
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
240
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
golang-bob.pdf
iwatsukayura
0
130
Featured
See All Featured
For a Future-Friendly Web
brad_frost
184
10k
Large-scale JavaScript Application Architecture
addyosmani
516
110k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
270
Optimizing for Happiness
mojombo
378
71k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
750
Transcript
Goͷ࣌ࠁʹؔ͢Δςετ 2017/07/07 Umeda.go #2
ࣗݾհ • Տ ݈ଠ࿕ (@kawaken) • γφδʔϚʔέςΟϯάʢגʣ • ϓογϡ௨ج൫ɺLINE৴ج൫ •
Go3͘Β͍ • goaͷίʔυεχϖοτ࡞ͬͯ·͢
࣌ࠁͷςετͷ͠͞ʁ
func CanDeliver() bool { hour := time.Now().Hour() // 8࣌ʙ20࣌ͳΒ৴Մೳ return
8 <= hour && hour <= 20 } ࣌ࠁΛऔಘͯ͠அ͢Δfunc
ςετํ • 8࣌ʙ20࣌: trueͰ͋Δ͜ͱΛ֬ೝ͢Δ • 21࣌ʙ7࣌: falseͰ͋Δ͜ͱΛ֬ೝ͢Δ
μϝͳςετ func TestCanDeliver(t *testing.T) { hour := time.Now().Hour() expected :=
8 <= hour && hour <= 20 // ಉ͡ॲཧ result := CanDeliver() if expected == result { t.Log("OK") } else { t.Fatal("NG") } }
࣌ࠁͷςετͷ͠͞ • time.Now ৗʹҧ͏Λฦ͢ • ͕࣌ؒܦա͠ͳ͍ͱύλʔϯΛཏͰ͖ͳ͍
͍ΖΜͳςετͷύλʔϯ • ݄ลΓͷि • څྉ͕ٳ • य़ͷɺळͷ • ৼସٳ •
2݄29
࣮ͱςετͷύλʔϯ
࣮ͱςετͷύλʔϯ 1. ֎෦͔Βͷೖ 2. ελϒ 3. αʔυύʔςΟʔͷύοέʔδ
1. ֎෦͔Βͷೖ
func CanDeliver(hour int) bool { // 8࣌ʙ20࣌ͳΒ৴Մೳ return 8 <=
hour && hour <= 20 } ͦͦtime.NowΛ͏ඞཁ͕ͳ͍
func TestCanDeliver(t *testing.T) { cases := []struct { hour int
want bool }{ {7, false}, {8, true}, {20, true}, {21, false}, } for _, c := range cases { got := CanDeliver(c.hour) if got != c.want { t.Errorf("CanDeliver(%d) => %t, want %t", c.hour, got, c.want) } } }
2. ελϒ
var now = time.Now // time.NowΛnowʹೖΕ͓ͯ͘ func CanDeliver() bool {
hour := now().Hour() // nowΛ༻ͯ࣌͠ࠁΛऔಘ // 8࣌ʙ20࣌ͳΒ৴Մೳ return 8 <= hour && hour <= 20 } now Λςετ࣌ʹஔ͖͑Δ
func fakeHour(hour int) { // ݻఆͷtime.TimeΛฦ͢funcͰnowΛஔ͖͑Δ now = func() time.Time
{ return time.Date(2017, 7, 7, hour, 0, 0, 0, time.Local) } } func TestCanDeliver(t *testing.T) { // snip... for _, c := range cases { fakeHour(c.hour) // fakeHourͰ࣌ࠁΛॻ͖͑Δ got := CanDeliver() if got != c.want { t.Errorf("hour: %d, CanDeliver() => %t, want %t", c.hour, got, c.want) } } now = time.Now // reset time }
3. αʔυύʔςΟʔͷύοέʔδ
code.cloudfoundry.org/clock • timeͷସͱͯ͠͏ύοέʔδ • ͕ؔ๛ • ςετ࣌ʹɺclock/fakeclock/FakeClockΛ༻
var myClock = clock.NewClock() // myClockʹclock.ClockΛೖ func CanDeliver() bool {
hour := myClock.Now().Hour() // myClockΛ༻ͯ࣌͠ࠁΛऔಘ // 8࣌ʙ20࣌ͳΒ৴Մೳ return 8 <= hour && hour <= 20 } myClock Λςετ࣌ʹஔ͖͑Δ
func fakeHour(hour int) { // ࢦఆ͞Εͨ࣌ࠁ͔Β։࢝͢ΔΑ͏ʹFakeClockͰஔ͖͑Δ myClock = fakeclock.NewFakeClock(time.Date(2017, 7,
7, hour, 0, 0, 0, time.Local)) } func TestCanDeliver(t *testing.T) { // snip... for _, c := range cases { fakeHour(c.hour) // fakeHourͰ࣌ࠁΛॻ͖͑Δ got := CanDeliver() if got != c.want { t.Errorf("hour: %d, CanDeliver() => %t, want %t", c.hour, got, c.want) } } myClock = clock.NewClock() // reset time }
ϞϠϞϠϙΠϯτ • ґଘੑΛ֎෦͔Βೖ • Ͳ͔͜Ͱ time.Now ݺͳ͍ͱ͍͚ͳ͍ • ελϒαʔυύʔςΟʔύοέʔδ •
time.Now Λ༻͍͚ͯ͠ͳ͍
ૉʹtime.Now͍͍ͨ
4. ֎෦͔Βͷೖ̎
func CanDeliver(hour int) bool { // 8࣌ʙ20࣌ͳΒ৴Մೳ return 8 <=
hour && hour <= 20 } func CanDeliverNow() bool { hour := time.Now().Hour() return CanDeliver(hour) }
5. Monkey patch
github.com/bouk/monkey • GoͰϞϯΩʔύονΛ࣮ݱ͢Δύοέʔδ • ؔϙΠϯλΛࠩ͠ସ͑ͨΓͰ͖Δ • શͯͷڥͰಈ࡞͢ΔΘ͚Ͱͳ͍Έ͍ͨ
func CanDeliver() bool { hour := time.Now().Hour() // 8࣌ʙ20࣌ͳΒ৴Մೳ return
8 <= hour && hour <= 20 }
func fakeHour(hour int) { // time.NowΛࢦఆͷ࣌ࠁΛฦ͢funcͰஔ͖͑Δ monkey.Patch( time.Now, func() time.Time
{ return time.Date(2017, 7, 7, hour, 0, 0, 0, time.Local) }, ) } func TestCanDeliver(t *testing.T) { // snip... for _, c := range cases { fakeHour(c.hour) // fakeHourͰ࣌ࠁΛॻ͖͑Δ got := CanDeliver() if got != c.want { t.Errorf("hour: %d, CanDeliver() => %t, want %t", c.hour, got, c.want) } } monkey.Unpatch(time.Now) // reset time }
6. timeύοέʔδΛ֦ு͢Δ
// time.Now func Now() Time { sec, nsec := now()
return Time{sec + unixToInternal, nsec, Local} }
NowΛ͍͡Ε͍͍ͷͰʁ
/* src/time/time.go */ var fakeTime Time // χηͷ࣌ࠁ func Fake(t
Time) { fakeTime = t } func ResetFake() { fakeTime = Time{} } func Now() Time { if !fakeTime.IsZero() { return fakeTime } sec, nsec := now() return Time{sec + unixToInternal, nsec, Local} }
func CanDeliver() bool { hour := time.Now().Hour() // 8࣌ʙ20࣌ͳΒ৴Մೳ return
8 <= hour && hour <= 20 }
func fakeHour(hour int) { time.Fake(time.Date(2017, 7, 7, hour, 0, 0,
0, time.Local)) } func TestCanDeliver(t *testing.T) { // snip... for _, c := range cases { fakeHour(c.hour) // fakeHourͰ࣌ࠁΛॻ͖͑Δ got := CanDeliver() if got != c.want { t.Errorf("hour: %d, CanDeliver() => %t, want %t", c.hour, got, c.want) } } time.ResetFake() // reset time }
΄ΜͱʹͣΕͯΜͷ͔ͳʁʁʁ % /usr/local/go1.8.3_faketime/bin/go test -v ./timepkg === RUN TestCanDeliver ---
PASS: TestCanDeliver (0.00s) sample_test.go:22: 2017-07-07 07:00:00 +0900 JST sample_test.go:22: 2017-07-07 08:00:00 +0900 JST sample_test.go:22: 2017-07-07 20:00:00 +0900 JST sample_test.go:22: 2017-07-07 21:00:00 +0900 JST PASS ok github.com/kawaken/golang-time-testing/timepkg 0.466s
·ͱΊ ࣌ࠁͷςετ͍͕͠ɺճආํ๏͋Δ 1. ࣌ࠁͷऔಘͱɺ࣌ࠁΛॲཧ͢Δͱ͜ΖΛ͚Δ 2. code.cloudfoundry.org/clock ͕ແʁ 3. monkey͋Γʁ