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
15
私のテストコードの書き方
Atsushi Okui
January 12, 2026
Tweet
Share
More Decks by Atsushi Okui
See All by Atsushi Okui
モックを適切に使ったテスト
a_okui
0
9
カバレッジとは?
a_okui
0
13
プログラミングどうやる? ~テスト駆動開発から学ぶ達人の型~
a_okui
0
440
『Accelerate State of DevOps Report 2022』翻訳とまとめ
a_okui
0
2.5k
コード品質がもたらすビジネスへの影響(社内向け翻訳、まとめ)
a_okui
0
390
『Accelerate State of DevOps Report 2021』翻訳とまとめ
a_okui
0
630
Other Decks in Programming
See All in Programming
ロボットのための工場に灯りは要らない
watany
12
3.2k
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
250
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.2k
Smarter Angular mit Transformers.js & Prompt API
christianliebel
PRO
1
100
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
170
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
7
3.2k
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
150
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
260
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.6k
PHPで TLSのプロトコルを実装してみる
higaki_program
0
520
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
200
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
780
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
490
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
200
Bash Introduction
62gerente
615
210k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
150
Odyssey Design
rkendrick25
PRO
2
560
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
130
Rails Girls Zürich Keynote
gr2m
96
14k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
170
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Darren the Foodie - Storyboard
khoart
PRO
3
3k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
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?
完