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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
木内 智史之介
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
Built Our Own Background Agent at LayerX
layerx
PRO
9
4.9k
yield再入門 #phpcon
o0h
PRO
0
960
メールのエイリアス機能を履き違えない
isshinfunada
0
220
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
110
霧の中の代数的エフェクト
funnyycat
1
480
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
440
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
460
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
530
React本体のコードリーディング
high_g_engineer
1
140
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
590
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
230
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
480
Code Reviewing Like a Champion
maltzj
528
40k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
930
Building the Perfect Custom Keyboard
takai
2
830
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Building an army of robots
kneath
306
46k
The Invisible Side of Design
smashingmag
301
52k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
290
Scaling GitHub
holman
464
140k
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