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
[2021/12/16]テストコードのないレガシーアプリケーションとの向き合い方
Search
tosite
December 16, 2021
Programming
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[2021/12/16]テストコードのないレガシーアプリケーションとの向き合い方
ソフトウェアテストシンポジウム 2021 九州
https://www.jasst.jp/symposium/jasst21kyushu.html
tosite
December 16, 2021
More Decks by tosite
See All by tosite
[2026-09-30]ロックンロールは鳴り止まないっ - 信頼性かまってちゃん - 「データ駆動を投げ捨ててまで。」追いかける信頼性改善に向けた取り組みの話
tosite
0
16
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
220
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
400
[2026-08-25]AIによる自動化と人の介入、その狭間で揺れる信頼性についての俺の思いを、波よ聞いてくれ
tosite
0
220
[2026-03-07]あの日諦めたスクラムの答えを僕達はまだ探している。〜守ることと、諦めることと、それでも前に進むチームの話〜
tosite
0
1k
[2026-02-26]Road to NEXT CRE 〜SRE活動を通して見つけた、次世代CRE組織の在り方SP〜
tosite
0
290
[2025-12-12]あの日僕が見た胡蝶の夢 〜人の夢は終わらねェ AIによるパフォーマンスチューニングのすゝめ〜
tosite
0
1.2k
[2025-02-07]生成AIで変える問い合わせの未来 〜チームグローバル化の香りを添えて〜
tosite
1
1.5k
[2024/10/25]CREの守護者たち 〜DevOps×シフトレフト - 俺またプロダクト救っちゃいました!?〜
tosite
0
2.1k
Other Decks in Programming
See All in Programming
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
4.5k
App Intentsのビルドプロセスを支える技術
kntkymt
0
460
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
500
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
360
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
310
Security issues being discussed on Web Platforms
petamoriken
0
1.3k
Webの地図
yosuke_furukawa
PRO
6
4.9k
iOSDCのペンライトを自動制御したい!
akkeylab
0
120
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.3k
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
460
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
210
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.1k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
750
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
580
Accessibility Awareness
sabderemane
1
220
Building Applications with DynamoDB
mza
96
7.2k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
The Invisible Side of Design
smashingmag
301
52k
Transcript
テストコードのない レガシーアプリケーション との向き合い方 in JaSST'21 Kyushu 2021-12-18 Sat
はじめまして \の方もそうでない方も/
はじめまして 3
はじめまして 4 GMOペパボ株式会社 ホスティング事業部 バックエンドエンジニア 趣味: インターネットJK・ キャンプ @tosite /
まおちゃ / 手島 尚人
はい \会社紹介/
はじめまして 6
はじめまして 7 ドメイン・レンタルサーバー ご用命の際はぜひ弊社サービスを よろしくお願いいたします!
はじめまして 8
はじめまして 9 コミュニティでステッカーやファングッズ・ ノベルティなどを作成したい場合は ご利用ください!
ここから本題 \いい仕事した/
突然ですが皆さん テストは 書いていますか? \かの有名な方もこうおっしゃっていますよね/
突然ですが皆さん テストは 書いていますか? 著者: @mty_mno 「テスターちゃん番外編『ヤツが来る!!』の巻&メイキングオブジョジョ風の絵 」
と言っても テストが不十分な アプリケーションが あるのも現実… \理想と現実ってやつ/
前提 14 今年のテーマは「歴史から学ぶ」
前提 15 歴史の話をしよう
前提 16
前提 17 ホスティング事業部のサービスは 20年もの長い歴史があります 今も一部リポジトリでは 次のようなレガシーな構成を 目にすることがあります \今回担当したのはムームードメインのPHPで書かれたアプリケーションコードでした/
前提 18 レガシーなアプリケーションではまれに 次のような構成を目にすることがあります \ちなみに案件はPHPでした/
前提 19 コントローラーロジック(数百行) 関数群(数百〜数千行) ビューファイル(数百〜数千行)
前提 20 コントローラーロジック(数百行) 関数群(数百〜数千行) ビューファイル(数百〜数千行) 1ファイルで全ての処理を実行している
コントローラー・ビュー・ ビジネスロジックが密結合している ためテストが難しい 当然、既存のテストコードは ほとんどない状態
前提 21 1ファイル(数千行) コントローラーロジック(数百行) 関数群(数百〜数千行) ビューファイル(数百〜数千行) ・1ファイルで全ての処理を実行
・コントローラー・ビュー・ ビジネスロジックが密結合 しているためテストが難しい ・当然、既存のテストコードは ほとんどない状態
前提 22 リファクタリングしたいが テストコードも仕様書もなく 「動いているコードが正しい」 という状態
前提 23 要件は 振る舞いを変えつつ 変更後の挙動を担保した状態で かつバグが混入しないこと というもの
前提 24 つまり リアーキテクティング した上で振る舞いを変える 必要があるということ
前提 25 リアーキテクティングするための テストがない コードが密結合しているため ユニットテストが書けない \鶏卵問題ですね/
前提 26 その状況でいきなり 振る舞いを変えるのは 自殺行為
前提 27 リファクタリングするためのテストがなく、 テストを書こうにも密結合しているため そのままではテストできない とは言えいきなりリファクタリングするのも エンバグする危険性が極めて高い \鶏卵問題ですね/
皆さんなら どうしますか? \一緒に考えてみましょう/
私は次のような アプローチを取りました \一例ですが/
フェーズ1. ロジックの分離 \ローマの道も一歩から/
フェーズ1. ロジックの分離 31
フェーズ1. ロジックの分離 32 これを
フェーズ1. ロジックの分離 33 index.php functions.php
フェーズ1. ロジックの分離 34 こう
フェーズ1. ロジックの分離 35 まずはファイルから ビジネスロジックを 切り出すだけの作業 を行った 😅
フェーズ2. 既存の関数に対して テストを記述 \リファクタリングらしくなってきました/
フェーズ2. 既存の関数に対してテストを記述 37
フェーズ2. 既存の関数に対してテストを記述 38 既存の仕様を満たす テストケースを記載
フェーズ2. 既存の関数に対してテストを記述 39 ファイルを分割したので テストが書ける!! 😃
フェーズ2. 既存の関数に対してテストを記述 40 とは言え全ての関数にテストを 追加する工数はなかったので リアーキテクティング対象 のみに留めた
フェーズ3. リアーキテクティング \テストがあるので安全だね/
フェーズ3. リアーキテクティング 42
フェーズ3. リアーキテクティング 43 気になる部分を リファクタ
フェーズ4. 落ちるテストを記述 \赤より始めよ/
フェーズ3. 落ちるテストを記述 45 修正する関数のテストケース 既存の仕様を満たすテスト郡 リファクタリング後に 仕様を満たすようになるテスト郡
リファクタリング前にレッドにな ることを確認しておく リファクタリング後は グリーンになることを確認 することで安全に仕様を 変えることができる 脆弱性が混入されていないことを 確認するテスト郡
フェーズ4. 落ちるテストを記述 46 振る舞い変更前 => レッド 振る舞い変更後 => グリーン
フェーズ4. 落ちるテストを記述 47 「既存仕様が壊れていないこと」は 現在の仕様を満たすテストコードから確認できる 「新規仕様が実装されたこと」は 落ちるテストが通ることで確認できる
フェーズ5. 振る舞いを変更 \さあ、コーディングの時間だ!/
フェーズ5. 振る舞いを変更 49 ここまで来たら安心安全に 振る舞いを変更できる ようになっている
フェーズ5. 振る舞いを変更 50
フェーズ5. 振る舞いを変更 51 フェーズ3で記述した 落ちるテストが 通るように修正 したら実装完了!
フェーズ5. 振る舞いを変更 52 全てグリーンで通過!
メリット \こんないいことがあったよ/
メリット1.
メリット 55 テストがない世界からの脱却! 今後機能追加や改修をやるとなった ときの開発基盤が整った
メリット2.
メリット 57 コードベースだけでなく テストケースベースで レビューできる ので安心感があった
メリット 58 特に一部関数には 正規表現が使用されており 修正前と後で目grepで挙動を 担保するのはつらぽよだった 修正後の挙動を
テストケースという仕様書 にできた
メリット3.
メリット 60 関数群を切り出すことによって スコープが明確になった 関数がある 副次的にその関数の リファクタを推し進められた
まとめ \もうこんな時間/
レガシーな肥大化した アプリケーションを リファクタするのは 難しい
特にテストコードが ない場合はなおさら
でもアプローチを 工夫すれば必ず安全に やり遂げられる
皆さんもテストを書いて 安全にリファクタして いきましょう!
ご清聴ありがとう ございました