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
0
79
【Go言語】テスト
Goのテストについて解説しています。
Tomoki Ota
October 10, 2024
Tweet
Share
More Decks by Tomoki Ota
See All by Tomoki Ota
アーキテクチャの価値
tomo1227
0
120
アーキテクチャとビジネスロジック
tomo1227
0
120
【Go言語】クロージャ
tomo1227
0
300
【Go言語】イテレータ
tomo1227
0
100
【Go言語】エラーハンドリング
tomo1227
0
82
AIに淘汰されないようにするには?
tomo1227
0
80
【Go言語】range
tomo1227
0
89
【Go言語】break
tomo1227
0
80
【Go言語】反復処理
tomo1227
0
57
Other Decks in Programming
See All in Programming
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
340
The free-lunch guide to idea circularity
hollycummins
0
270
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
130
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
120
Ruby and LLM Ecosystem 2nd
koic
1
990
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
610
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
270
20260315 AWSなんもわからん🥲
chiilog
2
160
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
300
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
190
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
6
2.1k
Windows on Ryzen and I
seosoft
0
320
Featured
See All Featured
Designing Powerful Visuals for Engaging Learning
tmiket
0
280
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
270
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Faster Mobile Websites
deanohume
310
31k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Navigating Weather and Climate Data
rabernat
0
140
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
240
The Invisible Side of Design
smashingmag
302
51k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
190
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ςετςετ͕ࣦഊ͢Δ·Ͱ࣮ߦ͠ଓ͚ΔͷͰɺλΠϜΞτͷ࣌ؒΛઃఆ͢Δ