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
74
【Go言語】テスト
Goのテストについて解説しています。
Tomoki Ota
October 10, 2024
Tweet
Share
More Decks by Tomoki Ota
See All by Tomoki Ota
アーキテクチャの価値
tomo1227
0
110
アーキテクチャとビジネスロジック
tomo1227
0
110
【Go言語】クロージャ
tomo1227
0
300
【Go言語】イテレータ
tomo1227
0
94
【Go言語】エラーハンドリング
tomo1227
0
76
AIに淘汰されないようにするには?
tomo1227
0
75
【Go言語】range
tomo1227
0
83
【Go言語】break
tomo1227
0
77
【Go言語】反復処理
tomo1227
0
55
Other Decks in Programming
See All in Programming
MUSUBIXとは
nahisaho
0
140
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
270
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
210
CSC307 Lecture 07
javiergs
PRO
1
560
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
Fluid Templating in TYPO3 14
s2b
0
130
AtCoder Conference 2025
shindannin
0
1.1k
SourceGeneratorのススメ
htkym
0
200
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
140
Oxlintはいいぞ
yug1224
5
1.4k
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
620
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
40
2.3k
A Tale of Four Properties
chriscoyier
162
24k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
78
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
67
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
100
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ςετςετ͕ࣦഊ͢Δ·Ͱ࣮ߦ͠ଓ͚ΔͷͰɺλΠϜΞτͷ࣌ؒΛઃఆ͢Δ