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
私のテストコードの書き方
Search
Atsushi Okui
January 12, 2026
Programming
0
6
私のテストコードの書き方
Atsushi Okui
January 12, 2026
Tweet
Share
More Decks by Atsushi Okui
See All by Atsushi Okui
プログラミングどうやる? ~テスト駆動開発から学ぶ達人の型~
a_okui
0
430
『Accelerate State of DevOps Report 2022』翻訳とまとめ
a_okui
0
2.5k
コード品質がもたらすビジネスへの影響(社内向け翻訳、まとめ)
a_okui
0
380
『Accelerate State of DevOps Report 2021』翻訳とまとめ
a_okui
0
620
Other Decks in Programming
See All in Programming
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
240
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
200
Best-Practices-for-Cortex-Analyst-and-AI-Agent
ryotaroikeda
1
110
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
140
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
430
AI時代の認知負荷との向き合い方
optfit
0
160
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
130
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
130
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
220
CSC307 Lecture 05
javiergs
PRO
0
500
Raku Raku Notion 20260128
hareyakayuruyaka
0
310
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
450
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2k
The Cult of Friendly URLs
andyhume
79
6.8k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
170
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
93
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
410
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Making Projects Easy
brettharned
120
6.6k
Transcript
私のテストコードの書き方
自己紹介 Atsushi Okui (@blue32a_jp) ソフトウェアエンジニア / Webアプリケーション エンジニア / PHPer
関心:設計、コード品質、リファクタリング、テス ト、モデリング
【悩み】テストコードをどのように 書いていけばいいのか分からない😥
自分がどのように書いているか 言語化してみる🤔
前置き
1. 自動テストへの期待
自動テストに期待すること 自動テストに期待されることは様々ありますが、大雑把には下記の2つであると思われ ます。 • 品質保証 • 即時フィードバック
自動テストに期待すること • 品質保証 • 即時フィードバック 👉
品質保証としてはもの足りない ”「最も効果が高いのはテスト対象コードを書いた本人がテストコードを書くときである」 と述べましたが、これを裏返すと、開発者主導の自動テストからは第三者検証の観点 が抜け落ちてしまうということでもあります。書いた本人が気づいていない欠陥を、その 張本人が書いた自動テストがすべて検出してくれるわけではありません。品質を保証 するには実装者以外の目が必要で、それはピアレビュー(コードを別の人が詳細に評 価・検証するレビュー)やコードインスペクション(コードに不具合がないか人の目で確 認する作業 ) 、ペアプログラミング(1つのプログラムを2人で共同開発する手法)などで
適宜補わなければなりません。” 保守しやすく変化に強いソフトウェアを支える柱 自動テストとテスト駆動開発 、その全体像 – 和田卓人(t-wada) https://gihyo.jp/article/2024/01/automated-test-and-tdd
品質を保証するには実装者以外の目が必要 原則2: プログラマは自分自身のプログラムをテストしてはなら ない. ソフトウェア・テストの技法 第2版 – p.15 https://www.kindaikagaku.co.jp/book_list/detail/9784764903296/
では、なぜ開発者自身が テストコードを書いてテストするのか🤔
自動テストに期待すること • 品質保証 • 即時フィードバック 👉
即時フィードバック テストを手動やっている多くのプロジェクトでは、スケジュールの後半にテスト工程が設 けられます。その場合、開発者が抱く「自分は何も壊さず、新しい機能を追加できている だろうか」という疑問や不安への答えが、数日~数週間、場合によって数カ月先まで得 ることができません。よって、より良い品質を求めるために試行錯誤できる回数が極端 に少なくなります。 テストが自動化されることによって、フィードバックをオンデマンドに得ることが可能になり ます。開発者は不安を感じた時にすぐテストを実行し、自分が進んでいる方向が正しい ことを確信したり、あるいは誤りに気づいてすぐに後戻りすることができるようになり、安 心して試行錯誤することができます。結果として、数カ月に1回のようなサイクルだった
試行錯誤が、数分に1回のようなサイクルになります。
テストには「品質保証」への期待もあるが、 設計・実装フェーズにおいては 「即時フィードバック」への期待が大きい
2. テストはいつからできるか
成果物が完成してから でないとテストは出来ない?
例)2つの数値を足し算する test('2つの数値を足し算する ', () => { // Arrange // ???
// Act // ??? // Assert // ??? }); // todo
どのような結果が欲しい? test('2つの数値を足し算する ', () => { // Arrange // ???
// Act // ??? // Assert expect(result).toBe(3); }); // todo 実行結果して2つの整数を足した数値が欲しい🤔
結果を得るために、どのように実行する? test('2つの数値を足し算する ', () => { // Arrange // ???
// Act const result = plus(a, b); // Assert expect(result).toBe(3); }); // todo 2つの数値を引数に取り、戻り値として足し算した結果を返す関数にしよう🤔
実行するために必要なものは? test('2つの数値を足し算する ', () => { // Arrange const a
= 1; const b = 2; // Act const result = plus(a, b); // Assert expect(result).toBe(3); }); // todo 引数として渡すための2つの数値が必要だ🤔
実装する test('2つの数値を足し算する ', () => { // Arrange const a
= 1; const b = 2; // Act const result = plus(a, b); // Assert expect(result).toBe(3); }); function plus(a, b) { return a + b; } 👍
成果物が完成していなくても テストを考えることはできる
どうやって(How)だけではなく 振る舞い・仕様(What)を一緒に考える
本題
Q. どうやってテストコードを書いているか
A. プロダクトコードとテストコードを 一緒に育てていく
プログラミングするときの画面
プログラミングするときの画面 交互に少しずつ書いて、一緒に育てていく
実践編 実際に書いている様子を記載したかったのですが諸般の事情で割愛します。 代わりとして、過去にプログラミングしている時の思考を記事にしているので、そちらをご 覧いただければ幸いです。(記事の内容はテスト駆動開発にフォーカスしたものですが、 だいたいこんな感じで書いています) 【実践 TDD Katas】 ローマ数字 https://qiita.com/blue32a/items/2084c9e5cff97980a1c7
プロダクトコードとテストコードを一緒に育てる 個人的な経験としても、レガシーコードに後からテストコードを追加するのはとても苦労し ます。これはテストのことが考えられていないため、テスト容易性が低い状態です。テス トコードを早いうちから書いていくことで、必然的にテスト用意性が備わることになりま す。 また「テストがしにくい」というのは「使いにくい」ということでもあります。「どうやって実現 するか(How)」ばかりに注目していると、完成した時に「動きはするが使いにくい」状態 になっていることがあります。こういった事態を防ぐため、常に使う側の視点を持っておく 必要があります。
完成形が「分からない」からテストを書く プログラミングにおいてあまり効率的ではないと感じるのが「最短距離の完成形を考え てから一気に書く」という考え方です。分からない状態で考え込んでいても頭の中の成 果物はいつまでもボヤケたままで、時間だけが過ぎていきます。残念ながら、まだ道が ないところに最短距離はありません。このような手が動かない状態を回避するために、 テストを書くことで「何が求められているのか」を言語化し、それを「どのように実現する か」を試行錯誤していきます。
正解はないし、一筆書きもできない https://x.com/t_wada/status/1892118836402405595
うまくいかない方法をたくさん見つける “I have not failed. I’ve just found 10,000 ways
that won’t work.” 「私は失敗したわけではない。ただ、うまくいかない方法を1万通り見つけただけだ」 – Thomas Edison(トーマス・エジソン)
【TIPS】必ずテストを先に書くべきか テストを先に書くテストファーストを採用するかどうかはスタイルだと思っています。実際 に先に書くこともあれば後になることもあります。重要なのは「テストが先か後か」よりも 「一緒に、少しずつ書いていく」ことの方だと思います。
まとめ • 開発者として、自動テストには「品質保証」よりも「即時フィードバック」への期待が 大きい • フィードバックをオンデマンドで得られることで、開発者は安心して試行錯誤すること ができる • 成果物が完成する前でもテストのことを考えることはできる •
プロダクトコードとテストコードを一緒に育てていくことで、「テストしやすさ」「使いや すさ」も一緒に作っていく • 完成形が分からないからこそ、テストを書いて試行錯誤する
How do you like Testing?
完