SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
テストコードのない

レガシーアプリケーション

との向き合い方

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

関数群を切り出すことによって 

スコープが明確になった

関数がある



副次的にその関数の 

リファクタを推し進められた

まとめ

\もうこんな時間/

レガシーな肥大化した

アプリケーションを

リファクタするのは

難しい

特にテストコードが

ない場合はなおさら

でもアプローチを

工夫すれば必ず安全に

やり遂げられる

皆さんもテストを書いて

安全にリファクタして

いきましょう!

ご清聴ありがとう

ございました


Weitere ähnliche Inhalte

Was ist angesagt?

開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論Tokoroten Nakayama
 
Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Shinya Okano
 
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活Takaaki Umada
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホンYou_Kinjoh
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていることonozaty
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
初学者のためのプロンプトエンジニアリング実践.pptx
初学者のためのプロンプトエンジニアリング実践.pptx初学者のためのプロンプトエンジニアリング実践.pptx
初学者のためのプロンプトエンジニアリング実践.pptxAkifumi Niida
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 

Was ist angesagt? (20)

いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論
 
Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証
 
ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活ゼロからはじめるプロダクトマネージャー生活
ゼロからはじめるプロダクトマネージャー生活
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
初学者のためのプロンプトエンジニアリング実践.pptx
初学者のためのプロンプトエンジニアリング実践.pptx初学者のためのプロンプトエンジニアリング実践.pptx
初学者のためのプロンプトエンジニアリング実践.pptx
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 

Ähnlich wie 2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方

Scratchを使った CaT的脳トレのすすめ
Scratchを使った CaT的脳トレのすすめScratchを使った CaT的脳トレのすすめ
Scratchを使った CaT的脳トレのすすめMasao Niizuma
 
2022-12-07 この素晴らしいアプリケーションにテストコードを
2022-12-07 この素晴らしいアプリケーションにテストコードを2022-12-07 この素晴らしいアプリケーションにテストコードを
2022-12-07 この素晴らしいアプリケーションにテストコードをnaoto teshima
 
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)natsu_bm
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後Takayuki Shimizukawa
 
特にタイトルはない
特にタイトルはない特にタイトルはない
特にタイトルはないAya Komuro
 
江戸川大学講義 "How to Connect the Dots"
江戸川大学講義 "How to Connect the Dots"江戸川大学講義 "How to Connect the Dots"
江戸川大学講義 "How to Connect the Dots"Osamu Ise
 
20230314_JBUG_miyagi_LT_tm_v4.pptx
20230314_JBUG_miyagi_LT_tm_v4.pptx20230314_JBUG_miyagi_LT_tm_v4.pptx
20230314_JBUG_miyagi_LT_tm_v4.pptxToshiki Miyaji
 
Experience Visionのはじめかた に見るDevLOVE勉強会のススメ
Experience Visionのはじめかた に見るDevLOVE勉強会のススメExperience Visionのはじめかた に見るDevLOVE勉強会のススメ
Experience Visionのはじめかた に見るDevLOVE勉強会のススメ陽一 滝川
 
Rでを作る
Rでを作るRでを作る
Rでを作るNagi Teramo
 

Ähnlich wie 2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方 (13)

DevIoSapporo.pdf
DevIoSapporo.pdfDevIoSapporo.pdf
DevIoSapporo.pdf
 
Scratchを使った CaT的脳トレのすすめ
Scratchを使った CaT的脳トレのすすめScratchを使った CaT的脳トレのすすめ
Scratchを使った CaT的脳トレのすすめ
 
Can We Change The World?
Can We Change The World?Can We Change The World?
Can We Change The World?
 
2022-12-07 この素晴らしいアプリケーションにテストコードを
2022-12-07 この素晴らしいアプリケーションにテストコードを2022-12-07 この素晴らしいアプリケーションにテストコードを
2022-12-07 この素晴らしいアプリケーションにテストコードを
 
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
塹壕戦から揚陸艇強襲上陸まで (2012/03/17 pyfes)
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後
 
特にタイトルはない
特にタイトルはない特にタイトルはない
特にタイトルはない
 
千年繁栄する法
千年繁栄する法千年繁栄する法
千年繁栄する法
 
江戸川大学講義 "How to Connect the Dots"
江戸川大学講義 "How to Connect the Dots"江戸川大学講義 "How to Connect the Dots"
江戸川大学講義 "How to Connect the Dots"
 
20230314_JBUG_miyagi_LT_tm_v4.pptx
20230314_JBUG_miyagi_LT_tm_v4.pptx20230314_JBUG_miyagi_LT_tm_v4.pptx
20230314_JBUG_miyagi_LT_tm_v4.pptx
 
Experience Visionのはじめかた に見るDevLOVE勉強会のススメ
Experience Visionのはじめかた に見るDevLOVE勉強会のススメExperience Visionのはじめかた に見るDevLOVE勉強会のススメ
Experience Visionのはじめかた に見るDevLOVE勉強会のススメ
 
Rでを作る
Rでを作るRでを作る
Rでを作る
 
Jaws niigata#8
Jaws niigata#8Jaws niigata#8
Jaws niigata#8
 

Mehr von naoto teshima

2022-03-25 コミュニティから学ぶエンジニアリング
2022-03-25 コミュニティから学ぶエンジニアリング2022-03-25 コミュニティから学ぶエンジニアリング
2022-03-25 コミュニティから学ぶエンジニアリングnaoto teshima
 
2019-07-27 はじめよう、ニコカレ!
2019-07-27 はじめよう、ニコカレ!2019-07-27 はじめよう、ニコカレ!
2019-07-27 はじめよう、ニコカレ!naoto teshima
 
2019-03-23 プルリクとの上手な付き合い方
2019-03-23 プルリクとの上手な付き合い方2019-03-23 プルリクとの上手な付き合い方
2019-03-23 プルリクとの上手な付き合い方naoto teshima
 
2018-12-12 ティファニーで転職を〜夏の日の2018〜
2018-12-12 ティファニーで転職を〜夏の日の2018〜2018-12-12 ティファニーで転職を〜夏の日の2018〜
2018-12-12 ティファニーで転職を〜夏の日の2018〜naoto teshima
 
ニコカレという名のアジャイルプラクティス
ニコカレという名のアジャイルプラクティスニコカレという名のアジャイルプラクティス
ニコカレという名のアジャイルプラクティスnaoto teshima
 
コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎
コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎
コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎naoto teshima
 
アジャイルジャパン2018 参加レポート
アジャイルジャパン2018 参加レポートアジャイルジャパン2018 参加レポート
アジャイルジャパン2018 参加レポートnaoto teshima
 
社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり
社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり
社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわりnaoto teshima
 
社内SEはVBAを投げ捨ててPHPの夢を見るか?
社内SEはVBAを投げ捨ててPHPの夢を見るか?社内SEはVBAを投げ捨ててPHPの夢を見るか?
社内SEはVBAを投げ捨ててPHPの夢を見るか?naoto teshima
 
いっぽんのサービスの向こうに_公開用
いっぽんのサービスの向こうに_公開用いっぽんのサービスの向こうに_公開用
いっぽんのサービスの向こうに_公開用naoto teshima
 
現場からは以上です。
現場からは以上です。現場からは以上です。
現場からは以上です。naoto teshima
 
Relation with Nagasaki And Agile
Relation with Nagasaki And AgileRelation with Nagasaki And Agile
Relation with Nagasaki And Agilenaoto teshima
 

Mehr von naoto teshima (12)

2022-03-25 コミュニティから学ぶエンジニアリング
2022-03-25 コミュニティから学ぶエンジニアリング2022-03-25 コミュニティから学ぶエンジニアリング
2022-03-25 コミュニティから学ぶエンジニアリング
 
2019-07-27 はじめよう、ニコカレ!
2019-07-27 はじめよう、ニコカレ!2019-07-27 はじめよう、ニコカレ!
2019-07-27 はじめよう、ニコカレ!
 
2019-03-23 プルリクとの上手な付き合い方
2019-03-23 プルリクとの上手な付き合い方2019-03-23 プルリクとの上手な付き合い方
2019-03-23 プルリクとの上手な付き合い方
 
2018-12-12 ティファニーで転職を〜夏の日の2018〜
2018-12-12 ティファニーで転職を〜夏の日の2018〜2018-12-12 ティファニーで転職を〜夏の日の2018〜
2018-12-12 ティファニーで転職を〜夏の日の2018〜
 
ニコカレという名のアジャイルプラクティス
ニコカレという名のアジャイルプラクティスニコカレという名のアジャイルプラクティス
ニコカレという名のアジャイルプラクティス
 
コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎
コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎
コミュニケーションから始まるアジャイル - Agile Japan 2018 サテライト長崎
 
アジャイルジャパン2018 参加レポート
アジャイルジャパン2018 参加レポートアジャイルジャパン2018 参加レポート
アジャイルジャパン2018 参加レポート
 
社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり
社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり
社内SEはVBAを投げ捨ててPHPの夢を見るか?-おかわり
 
社内SEはVBAを投げ捨ててPHPの夢を見るか?
社内SEはVBAを投げ捨ててPHPの夢を見るか?社内SEはVBAを投げ捨ててPHPの夢を見るか?
社内SEはVBAを投げ捨ててPHPの夢を見るか?
 
いっぽんのサービスの向こうに_公開用
いっぽんのサービスの向こうに_公開用いっぽんのサービスの向こうに_公開用
いっぽんのサービスの向こうに_公開用
 
現場からは以上です。
現場からは以上です。現場からは以上です。
現場からは以上です。
 
Relation with Nagasaki And Agile
Relation with Nagasaki And AgileRelation with Nagasaki And Agile
Relation with Nagasaki And Agile
 

2021-12-16 テストコードのないレガシーアプリケーションとの向き合い方