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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
CSC307 Lecture 02
javiergs
PRO
1
780
高速開発のためのコード整理術
sutetotanuki
1
410
AtCoder Conference 2025
shindannin
0
1.1k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
140
AgentCoreとHuman in the Loop
har1101
5
240
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
200
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
690
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.5k
Patterns of Patterns
denyspoltorak
0
1.4k
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
Paper Plane (Part 1)
katiecoart
PRO
0
4.3k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Everyday Curiosity
cassininazir
0
130
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
What does AI have to do with Human Rights?
axbom
PRO
0
2k
What's in a price? How to price your products and services
michaelherold
247
13k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
200
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
56
Raft: Consensus for Rubyists
vanstee
141
7.3k
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ςετςετ͕ࣦഊ͢Δ·Ͱ࣮ߦ͠ଓ͚ΔͷͰɺλΠϜΞτͷ࣌ؒΛઃఆ͢Δ