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
【Go言語】テスト
Search
Tomoki Ota
October 10, 2024
Programming
92
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【Go言語】テスト
Goのテストについて解説しています。
Tomoki Ota
October 10, 2024
More Decks by Tomoki Ota
See All by Tomoki Ota
アーキテクチャの価値
tomo1227
0
120
アーキテクチャとビジネスロジック
tomo1227
0
120
【Go言語】クロージャ
tomo1227
0
330
【Go言語】イテレータ
tomo1227
0
110
【Go言語】エラーハンドリング
tomo1227
0
93
AIに淘汰されないようにするには?
tomo1227
0
95
【Go言語】range
tomo1227
0
100
【Go言語】break
tomo1227
0
95
【Go言語】反復処理
tomo1227
0
74
Other Decks in Programming
See All in Programming
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
330
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
340
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
150
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.2k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
140
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
230
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
150
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.7k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
200
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
270
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
630
Exploring anti-patterns in Rails
aemeredith
3
430
Building Adaptive Systems
keathley
44
3.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Facilitating Awesome Meetings
lara
57
7k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
800
The Cost Of JavaScript in 2023
addyosmani
55
10k
BBQ
matthewcrist
89
10k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Marketing to machines
jonoalderson
1
5.5k
Transcript
Tomoki Ota ʲGoݴޠʳςετ
ςετͷྨ go:build γϣʔτϞʔυ -race ςετ࣮ߦϞʔυ ςʔϒϧۦಈςετ setup & teardown Fuzzing
ΞδΣϯμ 2
ςετͷྨ
ςετͷछྨ 4 ෳࡶɾ͍ɾܾఆੑ ؆୯ɾ͍ɾܾఆੑߴ
E2Eςετ 5 •γεςϜશମͷςετ •Ϣʔεέʔεςετ(Ϣʔβࢹ) •stagingڥͳͲͰςετ͢Δ
౷߹ςετ 6 •αʔϏεʗίϯϙʔωϯτؒͷ૬ޓ࡞༻Λ ςετ͢Δ •γφϦΦςετ •ϞοΫαʔόͳͲΛ༻͍ͯςετ͢Δ
ϗϫΠτϘοΫεςετ 7 • ػೳͷϩδοΫೖग़ྗΛϕʔεʹςετ͢Δ • ͯ͢ͷϓϩάϥϜ͕ҙਤͨ͠ͱ͓Γʹಈ࡞͍ͯ͠Δ͔Λ֬ೝ͢Δ • ੜ࢈ऀଆࢹͷςετ
ϒϥοΫϘοΫεςετ 8 • ػೳͷ࣮ࡍͷৼΔ͍Λϕʔεʹςετ͢Δ • γεςϜࣗମͷ༷Λຬ͍ͨͯ͠Δ͔Ͳ͏͔Λ֬ೝ͢Δ • ΫϥΠΞϯτଆͷςετ
ςετύοέʔδ
ςετύοέʔδ໊ʹ_testΛ͚ͭΔ͖͔ʁ 10 • _testΛ͚ͭͳ͍ : ϗϫΠτϘοΫεςετ • _testΛ͚ͭΔ : ϒϥοΫϘοΫεςετ
ͱଏʹݴΘΕͯΔ͚Ͳ… _testΛ͚ͭͳ͍ํ͕Α͘ݟ͑Δ
ςετύοέʔδ໊ʹ_testΛ͚ͭΔ͖͔ʁ 11 • _testΛ͚ͭͳ͍ : ϓϥΠϕʔτؔͷςετ͕Ͱ͖Δ • _testΛ͚ͭΔ : ϓϥΠϕʔτؔͷςετ͕Ͱ͖Δ
ͦͦprivateؔΛςετ͖͔͢ʁ 12
݁ 13 ͪΌΜͱૄ݁߹ͳίʔυΛॻ͍͍ͯΕ privateͳؔΛςετ͢Δඞཁ΄ͱΜͲͳ͍
14
go:build
go:buildͱʁ 16 ϏϧυλάͱݺΕɺGoϑΝΠϧͷઌ಄ʹ͋Δಛผͳίϝϯτ Build Constraints ͱݺΕΔ ͪͳΈʹGo1.17ҎલͰ //go:build Ͱͳ͘ɺ //+buildͩͬͨ
go:buildͱʁ 17 ۭߦ͕ඞཁ
go:buildͱʁ 18 ۭߦ͕ඞཁ εϖʔεෆཁ
go:buildͱʁ 19 ಛఆͷϑΝΠϧͷΈΛࢦఆͯ͠Ϗϧυ͍ͨ͠ͱ͖ʹ༻͢Δ
go:buildͱʁ 20 cgo͕༗ޮͳ߹ʹͷΈbuild͢Δ
go:buildͱʁ 21 WindowsͰͷΈϏϧυ͞ΕΔ
ϏϧυΦϓγϣϯ 22 windowsҎ֎ʹGOOSGOARCHʹࢦఆͰ͖ΔΞʔΩςΫνϟɺcgoɺίϯύΠϥɺ goͷϝδϟʔόʔδϣϯΛࢦఆͰ͖Δɻྫ͑ओͳྫΛڍ͛ΔͱҎԼͷΑ͏ͳͷ͕͋Δɻ
ϏϧυΦϓγϣϯ 23 • windows, linux, darwin • unix • ignore(ͦͷଞಠࣗͷΧελϜλάͰՄೳ)
: build࣌ʹແࢹ͍ͨ͠ͱ͖ • cgo : CGO_ENABLED͕1ͷͱ͖ʹbuildରͱͳΔ • linux • unix • darwin • go1.22 (ϚΠφʔόʔδϣϯࢦఆͰ͖ͳ͍) • gc, gccgo • android, ios • arm,arm.5, arm.6, arm.7 • amd64, amd64.v1, amd64.v2, amd64.v3 • mips64x, ppc64x, wasm
Ϗϧυλά༻࣌ͷҙ 24 go build main.goͷΑ͏ʹςετϑΝΠϧΛࢦఆͯ͠ɺϏϧυͨ͠ͱ͖ Ϗϧυλάʹؔͳ͘ɺϏϧυ͞ΕΔɻ
Ϗϧυλάͷԋࢉࢠ 25 ϏϧυλάͰ&&, || , !ԋࢉࢠ͕ར༻Ͱ͖Δ
Ϗϧυλάͷԋࢉࢠ 26 cgo͕ར༻Ͱ͖ͯɺlinux·ͨɺdarwinͰ͋Δ࣌ʹϏϧυ͞ΕΔ
ϏϧυλάʹΑΔςετͷྨ 27 ݁߹ςετͱ୯ମςετΛ͚͍ͨͱ͖ ౷߹ςετରʹ্هͷΑ͏ͳϏϧυλάΛ͚ͭΔ
ϏϧυλάʹΑΔςετͷྨ 28 1. ౷߹ςετରʹϏϧυλάintegrationΛ͚ͭΔ 2. ݁߹ςετͰಈ͔ͨ͘͠ͳ͍୯ମςετରͷϑΝΠϧʹ !integration ͷϏϧυλάΛࢦఆͯ͠ແޮʹ͢Δ 3. ݁߹ςετͱ୯ମςετΛ͚͍ͨͱ͖ͷྫ
ϏϧυλάʹΑΔςετͷྨ 29 ݁߹ςετͰಈ͔ͨ͘͠ͳ͍୯ମςετରͷϑΝΠϧʹ ! ͷϏϧυλάΛࢦఆͯ͠ແޮʹ͢Δ
ϏϧυλάʹΑΔςετͷྨ 30 tagΛࢦఆͯ͠ςετΛ࣮ߦ͢Δ
ϏϧυλάʹΑΔςετͷྨͷҙ 31 1. //go:build !integration Λ͚ͭͳ͍ͱɺgo test -tags=integration Ͱ λά͕͍͍ͭͯͳ͍ͷ࣮ߦ͞ΕΔɻ
2. ϏϧυλάͰςετΛεΩοϓͨ͠ࡍɺͲͷςετ͕εΩοϓ͞Ε͔ͨ ग़ྗ͞Εͳ͍ → ڥมΛ༻͢Δͱग़ྗͰ͖Δ
ڥมʹΑΔεΩοϓͷग़ྗ 32 ڥมINTEGRATION͕trueʹͳ͍ͬͯΔ߹ɺςετΛεΩοϓ͢Δɻ
γϣʔτϞʔυ
γϣʔτϞʔυͱʁ 34 γϣʔτϞʔυΛ༻͍ΔͱɺʹΑͬͯྨ͢Δ͜ͱ͕Ͱ͖Δɻ
γϣʔτϞʔυʹΑΔςετͷྨ 35 testing.Short Λ༻͍Δͱ γϣʔτϞʔυ͕༗ޮ࣌ʹ SkipͰ͖Δ
γϣʔτϞʔυͷ࣮ߦ 36 -short Λ͢ͱγϣʔτϞʔυʹͳΔ
-race
-raceͱʁ 38 ඪ४ͷrace detector(ڝ߹ݕग़ث)Λ༗ޮʹ͢Δϑϥά σʔλڝ߹Λݕग़Ͱ͖Δ
-raceͱʁ 39
-raceͷҙ 40 ڝ߹ݕग़ث͕༗ޮ࣌ʹɺίϯύΠϥσʔλڝ߹Λݕग़͢ΔͨΊʹ ίʔυʹରͯ͠instrumentationΛ࣮ߦ͢Δ
-raceͷҙ 41 instrumentation : ίϯύΠϥ͕Ճͷ໋ྩΛੜ͢Δ͜ͱ
-raceͷҙ 42 ࣮ߦ࣌ͷΦʔόϔου͕͋Δ • ϝϞϦ༻ྔ : 5ʙ10ഒ૿͑ΔՄೳੑ͕͋Δ • ࣮ߦ࣌ؒ :
2ʙ20ഒ͘ͳΔՄೳੑ͕͋Δ
-raceͷҙ 43 CIϩʔΧϧͰͷςετͰͷΈ༗ޮʹ͢Δ ຊ൪ڥͰΘͳ͍(͘͠ΧφϦΞϦϦʔεͰͷΈ͏)
ڝ߹ݕग़͔Βআ֎͢Δ 44
ςετ࣮ߦϞʔυ
ςετ࣮ߦϞʔυ 46 • -parallel : ฒྻ࣮ߦϞʔυ • -shuf f le
: ࣮ߦॱংΛϥϯμϜʹ͢Δ
-parallel 47 σϑΥϧτͰಉ࣮࣌ߦͰ͖Δςετͷ࠷େGOMAXPROCSͱಉ͡
-shuf f le 48 Go 1.17͔ΒઃఆͰ͖Δɻ ϥϯμϜʹ͢Δ͜ͱͰɺݸʑͷςετΛಠཱͰ͖Δ
-shuf f le 49 on/offΛࢦఆͰ͖ΔɻσϑΥϧτoff
-shuf f le 50 -vΛ͚ͭΔ͜ͱͰɺϞʔυͱͳΓɺγϟοϑϧ͞ΕͨςετΛ࣮ߦ͢Δࡍʹ ͦͷγʔυΛΔ͜ͱ͕Ͱ͖Δɻˠ ಉ͡ॱংͰ࠶࣮ߦͰ͖Δ
-shuf f le 51
ςʔϒϧۦಈςετ
ςʔϒϧۦಈςετ 53 ܾ·Γ͖ͬͨςετϩδοΫΛڞ௨Խ͢Δ
None
ςʔϒϧۦಈςετ 55 ςετέʔε
interfaceΛ༻͍ͯDIʹΑͬͯૄ݁߹͠ͳ͍ͱɺ ςετͰ͖ͳ͍߹͋Δ
setup&teardown
setup & teardown 58 • ࣄલ४උ : setup • ࣄޙॲཧ
: teardown
59 ࣄલ४උؔΛલॲཧͱͯ͠ ࣄޙॲཧؔΛdeferͱͯ͠ݺͼग़͢ɻ setup & teardown
60 t.CleanupΛ͏ͱ͡͝ॲཧؔΛొͰ͖Δɻ setup & teardown
Fuzzing
Fuzzing 62
Fuzzing 63
Fuzzing 64 Fuzzςετɺ*_test.goϑΝΠϧͰͳ͍ͱ࣮ߦͰ͖ͳ͍ ϑΝζςετʹ͖ͭɺϑΝζλʔήοτਖ਼֬ʹ1ͭͰͳ͚ΕͳΒͳ͍
Fuzzing 65 -fuzz=ͷ͋ͱʹɺਖ਼نදݱͰςετ͢ΔؔΛࢦఆ͢Δ
Fuzzing 66 Fuzzingςετςετ͕ࣦഊ͢Δ·Ͱ࣮ߦ͠ଓ͚ΔͷͰɺλΠϜΞτͷ࣌ؒΛઃఆ͢Δ