Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonを使った APIサーバー開発を始める際に 整備したCIとテスト機構 / pytho...

Pythonを使った APIサーバー開発を始める際に 整備したCIとテスト機構 / python-api-ci-test

PyCon JP 2019で発表するAPIサーバー開発で始めるCI・テスト機構の話です

Kazuki Higashiguchi

September 16, 2019
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. © - BASE, Inc. 話すこと • 学習サイクル促進のためのCI導⼊‧⾃動 テストの考え⽅ • Pythonでのコード検査‧⾃動テスト整

    備のためのキーワード • コード検査‧⾃動テストから得られる フィードバック
  2. © - BASE, Inc. : @hgsgtk Who am I? 東⼝

    和暉 ( Higashiguchi Kazuki ) Back-end Engineer (Go, PHP, Python ) BASE BANK, Inc. (BASE, Inc.) / Dev Division / Tech Lead
  3. © - BASE, Inc. CI (Continuous Integration) • 継続的インテグレーション •

    ビルド‧テストを頻繁に繰り返し⾏うこ とにより、問題を早期に発⾒、開発の効 率化‧省⼒化を図る⼿法
  4. © - BASE, Inc. コーディングに対するフィードバック • PEP ‧PEP といったコーディン グ‧ドキュメントスタイルを守っている

    か • すべてを読み込むのは⼤変‧漏れている 可能性もある • コード検査で確認し、指摘結果から学ぶ
  5. © - BASE, Inc. 様々なCIツール • 様々CI導⼊するためのツールがある • Jenkins, Travis

    CI, CircleCI etc • 本資料ではCircleCIを⽤いた事例を紹介
  6. © - 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
  7. © - BASE, Inc. コードスタイル pycodestyle • Pythonコードスタイルガイドチェック ツール •

    PEP - Style Guide for Python Code • https://www.python.org/dev/peps/pep- /
  8. © - BASE, Inc. pydocstyleからのフィードバック • “Code is read much

    more often than it is written” by Guido • 「読まれるコードドキュメントが作れて いるか?」
  9. © - BASE, Inc. 背景:アプリケーション構造(概要) 外部 API DB HTTP REQUEST

    HTTP Handler Database Access Inside API Application API Client Domain Logic
  10. © - 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/
  11. © - 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
  12. © - 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/
  13. © - BASE, Inc. テスト⽤ライブラリを活⽤しないもの 外部 API DB HTTP REQUEST

    HTTP Handler Database Access Inside API Application API Client Domain Logic
  14. © - BASE, Inc. テスト⽤ライブラリを活⽤しないもの • データベースへの問い合わせをモックす るかどうか • たとえば、Goでは

    DATA-DOG/go- sqlmock という実⾏されるSQLが期待 通りかを検証するモックを作成する⽅法 がある • https://github.com/DATA-DOG/go-sqlmock
  15. © - BASE, Inc. 結果的に⾏った施策 外部 API DB HTTP REQUEST

    HTTP Handler Database Access Inside API Application API Client Domain Logic • テスト⽤DBを作成する (本例ではコンテナ)
  16. © - BASE, Inc. 背景:アプリケーション構造(概要) 外部 API DB HTTP REQUEST

    HTTP Handler Database Access Inside API Application API Client Domain Logic
  17. © - BASE, Inc. 背景:アプリケーション構造(概要) 外部 API DB HTTP REQUEST

    HTTP Handler Database Access Inside API Application API Client Domain Logic たとえば、HTTP Handlerのテストをするのに DB‧外部APIすべてライブラリで差し替えるの は「前準備のコスト」が⾼い
  18. © - BASE, Inc. おまけ 〜⾃動テストの維持のために〜 • pytest-randomly で不安定なテストに 気づく

    • https://pypi.org/project/pytest-randomly/ • 実⾏順に依存するテストは、⼀般的に不安定な テストと呼ばれる、⾃動テスト維持にはデメ リットになる Refs: “Pythonでの開発を効率的に進めるためのツール設定” at PyCon JP by @aodag さん https://www.slideshare.net/aodag/python-
  19. © - BASE, Inc. まとめ • コード検査‧⾃動テストなどはある種 「⾯倒だけどやったほうが良いこと」と 捉えられがち •

    開発者にフィードバックをくれるものと 捉えて、「前向き」な捉え⽅をする⼀つ のアイデアでした