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
ギはGinkgoのギ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
木内 智史之介
February 01, 2021
Programming
1.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ギはGinkgoのギ
木内 智史之介
February 01, 2021
More Decks by 木内 智史之介
See All by 木内 智史之介
コロナ体験記
8823scholar
0
92
エンジニアだからこそ投資をしよう
8823scholar
0
1.1k
herokuは死んだのか
8823scholar
0
100
Other Decks in Programming
See All in Programming
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
210
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
130
信頼性の目標を誰も求めてない
shubox
0
490
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
900
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
220
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
340
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
440
Deep dive into the select statement (GopherCon UK)
jespino
0
170
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
2
1.6k
Oxlintはいいぞ(続)
yug1224
1
550
Featured
See All Featured
Music & Morning Musume
bryan
47
7.4k
Visualization
eitanlees
152
17k
Paper Plane
katiecoart
PRO
2
53k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
510
エンジニアに許された特別な時間の終わり
watany
108
250k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Deep Space Network (abreviated)
tonyrice
0
290
It's Worth the Effort
3n
188
29k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Docker and Python
trallard
47
4.2k
Transcript
ギはGinkgoのギ
自己紹介 • 木内 智史 ◦ twitter: @8823scholar • スキルセット ◦
ruby、php、python、go、java、c++、c#、typescript、unity ◦ terraform • 趣味 ◦ 麻雀 ◦ スノーボード ◦ 投資 • 好きなテストフレームワーク ◦ rspec
Ginkgoとは?
go製のテスティングフレームワーク RSpecのgoリプレイス
RSpecとは?
ruby製のBDDフレームワーク TDDをより生産的で楽しくする!
TDD?BDD?
TDD? “Test” Driven Development (テスト駆動開発) 「まずはテストを書こう」という開発手法 実装は後にして、まずは期待する挙動をテストとして先に書いてしまう。 その後、テストが通るように実装を書く。
TDDの何がいいの? • 「テストを書く」という事が習慣づく • テストがコード資産として積み上がる • 「テストがない」という状態に居心地の悪さを感じるようになる • さらにテストを書くようになっていく コードがより堅牢になっていく
BDD? “Behavior” Driven Development (振る舞い駆動開発) 「まずはテストを書く」という発想をより深く掘り下げて、 「まずは振る舞いを書く」という意識まで昇華させた呼び方。
BDD? “Behavior” Driven Development (振る舞い駆動開発) 「まずはテストを書く」という発想をより深く掘り下げて、 「まずは振る舞いを書く」という意識まで昇華させた呼び方。 振る舞いって何よ?
振る舞いって何よ? • 何が
振る舞いって何よ? • 何が • どういう状況下で
振る舞いって何よ? • 何が • どういう状況下で • どうなるのか
振る舞いって何よ? • 何が • どういう状況下で • どうなるのか これらを先に書いていくのが 振る舞い駆動開発!
うーん、よくわからん
普通のテストと何がどう違うの?
よろしい ならば戦争実際のコードを見てみよう
要件 麻雀の牌姿を文字列で受け取り 点数を返す関数
従来のテスト (testing.T) package main import ( "testing" "github.com/stretchr/testify/assert" ) func
TestCalcPoint(t *testing.T) { for _, tc := range []struct { name string text string oya bool tsumo bool res []int err error }{ { name: "タンヤオ", text: "s222678m333456p8 8", oya: false, tsumo: false, res: []int{1300}, err: nil, }, } { t.Run(tc.name, func(t *testing.T) { res, err := CalcPoint(tc.text, tc.oya, tc.tsumo) assert.Equal(t, tc.res, res) assert.Equal(t, tc.err, err) }) } }
これはこれでいい、だがしかし • テストケースの条件が増えた時、条件と実際の呼び出し部分とに大きな距 離が開いてしまう • いったいなんのテストを書いているのか分からなくなる • テストケースの構造体以上の表現力を持てない • テストケースの書き方に制限はなく、それぞれが書きたいように書いてしま
う
BDD的テスト (ginkgo) package main import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega"
) var _ = Describe("CalcPoint", func() { var text string var tsumo bool = false Context("タンヤオロン", func() { BeforeEach(func() { text = "s222678m333456p8 8" }) Context("子", func() { It("should be 1300", func() { Expect(CalcPoint(text, false, tsumo)).To(Equal(1300)) }) }) Context("親", func() { It("should be 2000", func() { Expect(CalcPoint(text, true, tsumo)).To(Equal(2000)) }) }) }) })
テスト対象が俯瞰しやすくなる! • Describe: テスト対象 • Context: 条件の違い • It: 期待する動作
これらの単語を用いて表現していくので、テスト対象や、その条件などを把握し やすくなる
つまり 呼び方や、書き方を変えただけ?
その通り!
but 「その、書き方が重要なんだ」 という強い意思が RSpecやGinkgoを作った
「テストを書く」 「スペック(仕様)を書く」
BDDの世界へようこそ
ありがとうございました [参考文献] スはスペックのス https://magazine.rubyist.net/articles/0021/0021-Rspec.html