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
Pythonを使った APIサーバー開発を始める際に 整備したCIとテスト機構 / pytho...
Search
Kazuki Higashiguchi
September 16, 2019
Technology
2
9.8k
Pythonを使った APIサーバー開発を始める際に 整備したCIとテスト機構 / python-api-ci-test
PyCon JP 2019で発表するAPIサーバー開発で始めるCI・テスト機構の話です
Kazuki Higashiguchi
September 16, 2019
Tweet
Share
More Decks by Kazuki Higashiguchi
See All by Kazuki Higashiguchi
Practical Monitoring for Knative Serving / KubeCon + CloudNativeCon Japan 2025
hgsgtk
0
94
Cell-Based Architecture Design in AWS
hgsgtk
1
210
インフラコストとセキュリティ課題解決のためのリアーキテクチャリング / srekaigi2025
hgsgtk
3
8.2k
Design of a Stateful system for Robust Deployment and Observability
hgsgtk
0
1.5k
A guide to joining operational work in your new DevOps team
hgsgtk
1
1.6k
HTTP Tunneling in Go
hgsgtk
0
1.6k
ブラウザ自動操作技術の深層へ、直接触れて学ぶ WebDriver と Chrome DevTools Protocol
hgsgtk
3
6.9k
HTTP Server on random available port in Go
hgsgtk
0
1.2k
Agile Testingを夢見たテスト自動化 〜ATDDへの挑戦から始まる 1年間の試行錯誤〜 / dreaming agile testing at basebank
hgsgtk
13
8.4k
Other Decks in Technology
See All in Technology
ADK + Gemini Enterprise で 外部 API 連携エージェント作るなら OAuth の仕組みを理解しておこう
kaz1437
0
140
2026年もソフトウェアサプライチェーンのリスクに立ち向かうために / Product Security Square #3
flatt_security
1
740
欠陥分析(ODC分析)における生成AIの活用プロセスと実践事例 / 20260320 Suguru Ishii & Naoki Yamakoshi & Mayu Yoshizawa
shift_evolve
PRO
0
310
Goのerror型がシンプルであることの恩恵について理解する
yamatai1212
1
290
20260320_JaSST26_Tokyo_登壇資料.pdf
mura_shin
0
110
Blue/Green Deployment を用いた PostgreSQL のメジャーバージョンアップ
kkato1
0
100
脳が溶けた話 / Melted Brain
keisuke69
0
450
Phase06_ClaudeCode実践
overflowinc
0
1.5k
ソフトバンク流!プラットフォームエンジニアリング実現へのアプローチ
sbtechnight
1
250
SLI/SLO 導入で 避けるべきこと3選
yagikota
0
140
SaaSに宿る21g
kanyamaguc
2
110
【社内勉強会】新年度からコーディングエージェントを使いこなす - 構造と制約で引き出すClaude Codeの実践知
nwiizo
17
7.7k
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
330
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
92
How to Think Like a Performance Engineer
csswizardry
28
2.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.2k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
220
Done Done
chrislema
186
16k
SEO for Brand Visibility & Recognition
aleyda
0
4.4k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
250
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
310
Into the Great Unknown - MozCon
thekraken
40
2.3k
Transcript
© - BASE, Inc. X Pythonを使った APIサーバー開発を始める際に 整備したCIとテスト機構 . .
PyCon JP - @hgsgtk
© - BASE, Inc. 本⽇話すこと https://pycon.jp/ /sessions CIでのコード検査‧⾃動テストを取り上げます。
© - BASE, Inc. 本⽇話すこと CIによるコード検査‧⾃動テストの 開発者⾃⾝にとっての メリット を話します。 https://pycon.jp/
/sessions
© - BASE, Inc. 話すこと • 学習サイクル促進のためのCI導⼊‧⾃動 テストの考え⽅ • Pythonでのコード検査‧⾃動テスト整
備のためのキーワード • コード検査‧⾃動テストから得られる フィードバック
© - BASE, Inc. 話さないこと • CIツールの⽐較 • 詳細なCIの設定⽅法 •
テスティングフレームワークの⽐較
© - BASE, Inc. : @hgsgtk Who am I? 東⼝
和暉 ( Higashiguchi Kazuki ) Back-end Engineer (Go, PHP, Python ) BASE BANK, Inc. (BASE, Inc.) / Dev Division / Tech Lead
© - BASE, Inc. お品書き .CI‧コード検査/テストに対する捉え⽅ .CI導⼊‧コード検査 .⾃動テスト作成‧実施 .まとめ
© - BASE, Inc. お品書き .CI‧コード検査/テストに対する捉え⽅ .CI導⼊‧コード検査 .⾃動テスト作成‧実施 .まとめ
© - BASE, Inc. CI (Continuous Integration) • 継続的インテグレーション •
ビルド‧テストを頻繁に繰り返し⾏うこ とにより、問題を早期に発⾒、開発の効 率化‧省⼒化を図る⼿法
© - BASE, Inc. CIはなぜ⼊れたい?開発の効率化‧省⼒化? • エラーを⼩さな単位で早期に修正するこ とによる、修正コストの削減 • ex.
コミット単位でコンパイル‧テス ト‧静的解析 …etc
© - BASE, Inc. このトークでの捉え⽅:学習サイクル促進 • 業務開発での commit‧ pushから得 られるフィードバックを増やす
• XXX に対するフィードバック • コーディング • コード設計
© - BASE, Inc. CIで防ぎ CIに学ぶ
© - BASE, Inc. コーディングに対するフィードバック • PEP ‧PEP といったコーディン グ‧ドキュメントスタイルを守っている
か • すべてを読み込むのは⼤変‧漏れている 可能性もある • コード検査で確認し、指摘結果から学ぶ
© - BASE, Inc. コード設計に対するフィードバック • テスト、特にユニットテストを書くこと で、テスタビリティの声を聞く • テストがしやすい‧テストがしにくいの
肌感をフィードバックとして受ける • 関⼼の分離がされた疎結合なパーツが協 調するコード設計へ
© - BASE, Inc. フィードバックからすぐアクションする • テストで振る舞いを保護する • 保護されたコードの内部詳細の実装‧ コーディングを改善していく
© - BASE, Inc. お品書き .CI‧コード検査/テストに対する捉え⽅ .CI導⼊‧コード検査 .⾃動テスト作成‧実施 .まとめ
© - BASE, Inc. 背景:題材事例となるアプリケーション • DB‧外部APIへ依存するAPIサービス • エンドポイントは4つほど、⽐較的⼩さ いがビジネスロジックを持った
• ex. ⾦額計算などを⾏う
© - BASE, Inc. 様々なCIツール • 様々CI導⼊するためのツールがある • Jenkins, Travis
CI, CircleCI etc • 本資料ではCircleCIを⽤いた事例を紹介
© - BASE, Inc. CircleCI jobs 例 https://circleci.com/gh/hgsgtk/pycon -app/tree/master
© - BASE, Inc. CircleCIでのコード検査実施
© - BASE, Inc. Pythonコードスタイルチェック • pycodestyle • https://pypi.org/project/pycodestyle/ •
flake • http://flake .pycqa.org/en/latest/ • Pylint • https://www.pylint.org • autopep • https://github.com/hhatto/autopep
© - BASE, Inc. コードスタイル pycodestyle • Pythonコードスタイルガイドチェック ツール •
PEP - Style Guide for Python Code • https://www.python.org/dev/peps/pep- /
© - BASE, Inc. pycodestyleからのフィードバック • Python Codeのスタイルガイドに準拠 しているかどうかが指摘される •
「Pythonの標準的なコードが書けてい るか?」
© - BASE, Inc. Pythonドキュメントスタイルチェック • pydocstyle • https://pypi.org/project/pydocstyle/
© - BASE, Inc. pydocstyle • Pythonのdocstring規約への準拠を確 認する静的分析ツール • PEP
— Docstring Conventions • https://www.python.org/dev/peps/pep- /
© - BASE, Inc. pydocstyleからのフィードバック • “Code is read much
more often than it is written” by Guido • 「読まれるコードドキュメントが作れて いるか?」
© - BASE, Inc. Pythonコード型検査 • mypy • http://mypy-lang.org/
© - BASE, Inc. mypy • コード上の型を静的解析するツール • PEP —
Type Hints • https://www.python.org/dev/peps/pep- /
© - BASE, Inc. mypyからのフィードバック • 「型アノテーションを設定するコード‧ 設定に違反したコードが書かれていない か?」
© - BASE, Inc. CI導⼊‧コード検査のまとめ • CIツールを⽤いる • コーディングスタイル‧ドキュメントス タイル‧型検査を実施する
• それらからコーディングに対するフィー ドバックをもらう
© - BASE, Inc. お品書き .CI‧コード検査/テストに対する捉え⽅ .CI導⼊‧コード検査 .⾃動テスト作成‧実施 .まとめ
© - BASE, Inc. ⾃動テスト実施の選択肢 • テストコードを作成‧実⾏するためのテ スティングツールを利⽤する • pytest
• https://docs.pytest.org/en/latest/ • unittest • nose etc
© - BASE, Inc. pytest テストコード例
© - BASE, Inc. ⾃動テストでしたいこと • コード設計へのフィードバックを得る • 関⼼の分離がされた疎結合なパーツが 協調するコード設計か
• 既存の振る舞いを保護し、リファクタリ ングをスピーディにする
© - BASE, Inc. そのために考えること .外部環境からの隔離 .依存関係の差し替え可能なコード設計
© - BASE, Inc. そのために考えること .外部環境からの隔離 .依存関係の差し替え可能なコード設計
© - BASE, Inc. そのために考えること(1):外部環境からの隔離 • テストスコープを対象アプリケーション 内に留めたい • 対象外(ex.
外部APIなど)を含めた場 合ネットワーク状態などに依存し不安定 なテストになりうる
© - BASE, Inc. 背景:アプリケーション構造(概要) 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic
© - BASE, Inc. (補⾜)背景:アプリケーション詳説 • HTTP Handler: aiohttp •
Asynchronous HTTP Client/Server for asyncio and Python. • http://docs.aiohttp.org/en/stable/ • Database Access: sqlalchemy • The Python SQL Toolkit and Object Relational Mapper • https://www.sqlalchemy.org/
© - BASE, Inc. テスト⽤ライブラリを活⽤する 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic pytest-aiohttp • pytest plugin for aiohttp • 擬似的なリクエストを再現 • https://github.com/aio-libs/pytest- aiohttp
© - BASE, Inc. テスト⽤ライブラリを活⽤する 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic kevin /vcrpy • 実⾏されたHTTPリクエスト/レスポンス を記録‧再⽣する • https://vcrpy.readthedocs.io/en/ latest/
© - BASE, Inc. テスト⽤ライブラリを活⽤しないもの 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic
© - BASE, Inc. テスト⽤ライブラリを活⽤しないもの • データベースへの問い合わせをモックす るかどうか • たとえば、Goでは
DATA-DOG/go- sqlmock という実⾏されるSQLが期待 通りかを検証するモックを作成する⽅法 がある • https://github.com/DATA-DOG/go-sqlmock
© - BASE, Inc. モックに置き換えるかどうか • ⻑所は、テストの速度‧安定度 • ⼀⽅、短所は、統合した際に期待通り動 作するという安⼼感
• ex. SQLが本当に正しい?
© - BASE, Inc. 結果的に⾏った施策 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic • テスト⽤DBを作成する (本例ではコンテナ)
© - BASE, Inc. テスト⽤DBを作成する
© - BASE, Inc. テスト⽤DBを利⽤する ※ スキーマ‧フィクスチャ管理については時間の都合上‧‧‧
© - BASE, Inc. 「外部環境からの隔離」のフィードバック • テスト⽤ライブラリで外部環境との接点 を差し替えれる • ⼀⽅で、すべてのテストケースでこれら
で差し替えるようなコードの場合、疎結 合なコード設計になっていない可能性を ⽰唆
© - BASE, Inc. そのために考えること .外部環境からの隔離 .依存関係の差し替え可能なコード設計
© - BASE, Inc. 背景:アプリケーション構造(概要) 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic
© - BASE, Inc. 背景:アプリケーション構造(概要) 外部 API DB HTTP REQUEST
HTTP Handler Database Access Inside API Application API Client Domain Logic たとえば、HTTP Handlerのテストをするのに DB‧外部APIすべてライブラリで差し替えるの は「前準備のコスト」が⾼い
© - BASE, Inc. 依存関係の差し替え可能なコード設計 • 依存関係をなるべく差し替え可能へ • DI(Dependency Injection:
依存関係の 注⼊)可能な設計へ
© - BASE, Inc. DI可能にする constructorからオブジェクトを受け付ける
© - BASE, Inc. DI可能にする テスト時には仮の値を返すテストダブルに置き 換える ※ テストダブル: テスト固有の同等物(ex.
スタブ‧モック)
© - BASE, Inc. 依存関係の差し替え⼿段 • ⾃分でテスト⽤の代替クラスを作成 • モックライブラリ利⽤ •
pytest-mock • https://pypi.org/project/pytest-mock/ • spy, stub, mockが可能
© - BASE, Inc. 「依存関係の差し替え可能なコード設計」 のフィードバック • テストの前準備のコスト‧実⾏速度が、 疎結合なコード設計へ⽬を向けるきっか けへ
© - BASE, Inc. おまけ 〜⾃動テストの維持のために〜 • pytest-randomly で不安定なテストに 気づく
• https://pypi.org/project/pytest-randomly/ • 実⾏順に依存するテストは、⼀般的に不安定な テストと呼ばれる、⾃動テスト維持にはデメ リットになる Refs: “Pythonでの開発を効率的に進めるためのツール設定” at PyCon JP by @aodag さん https://www.slideshare.net/aodag/python-
© - BASE, Inc. お品書き .CI‧コード検査/テストに対する捉え⽅ .CI導⼊‧コード検査 .⾃動テスト作成‧実施 .まとめ
© - BASE, Inc. まとめ • CIを回すことで継続的なフィードバック 環境を作る • コード検査からコーディングを、テスト
からコード設計へのフィードバックをも らう
© - BASE, Inc. まとめ • コード検査‧⾃動テストなどはある種 「⾯倒だけどやったほうが良いこと」と 捉えられがち •
開発者にフィードバックをくれるものと 捉えて、「前向き」な捉え⽅をする⼀つ のアイデアでした