Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ギはGinkgoのギ
Search
木内 智史之介
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.2k
herokuは死んだのか
8823scholar
0
100
Other Decks in Programming
See All in Programming
Family mrubyの進捗
kishima
1
120
スマート反転とウェブアクセシビリティ
camiha
0
210
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
690
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
270
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
120
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
110
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
120
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
個人開発基盤をまるごとCloudflareに引っ越して爆速で総合的体験を向上させた話
tinykitten
0
190
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.8k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
410
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Design in an AI World
tapps
1
320
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
510
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Side Projects
sachag
456
43k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
670
Facilitating Awesome Meetings
lara
57
7.1k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
290
How to make the Groovebox
asonas
2
2.4k
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