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
93
エンジニアだからこそ投資をしよう
8823scholar
0
1.2k
herokuは死んだのか
8823scholar
0
100
Other Decks in Programming
See All in Programming
ジョジョの世界をXRで再現する
mofurune
0
160
カツオ、ご期待ください
suneo3476
0
190
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.5k
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.2k
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
550
残高管理から台帳サービスへの進化
artoy
1
200
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
890
Designing for humans not robots
tammielis
254
26k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Designing for Performance
lara
612
70k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
Crafting Experiences
bethany
1
380
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
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