様々な環境へコマンドラインツールを提供する上での苦労とその対策 / YAPC::Kyoto 2023
by
Konboi
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
様々な環境へコマンドラインツールを提 供する上での苦労とその対策 YAPC::Kyoto 2023 2023.03.19 Presented by Ryosuke Yabuki a.k.a Konboi
Slide 2
Slide 2 text
自己紹介 ▶ 矢吹 遼介 (Ryosuke Yabuki) ▶ Senior Software Engineer (Launchable, Inc.) ▶ 福島県在住 ▶ SNS ▶ ブログ: https://blog.konboi.com ▶ Github: Konboi ▶ Twitter: Konboi 2 2
Slide 3
Slide 3 text
今日話す内容 ▶ Launchableについて ▶ launchableinc/cli (launchable command) ▶ 苦労とその対策 ▶ まとめ ▶ 今後 3 3
Slide 4
Slide 4 text
Launchableについて 4
Slide 5
Slide 5 text
Launchableについて ▶ テスト結果および傾向の可視化/分析 ▶ Test Suite Insights ▶ テスト実行の効率化 ▶ Predictive Test Selection (a.k.a PTS) ▶ ※ここでの”テスト”はUnitTestやE2E Testなどの自動テストを指します 5 5
Slide 6
Slide 6 text
Launchableについて ▶ テスト結果&傾向の可視化/分析 / Test Suite Insights 6 6
Slide 7
Slide 7 text
Launchableについて ▶ テスト実行の効率化 / Predictive Test Selection (a.k.a PTS) 7 7
Slide 8
Slide 8 text
Launchableについて ▶ ユーザーはサービスを利用するために 8 8
Slide 9
Slide 9 text
Launchableについて ▶ ユーザーはサービスを利用するために ▶ テスト結果のレポート ▶ Test Suite Insight, PTS 9 9
Slide 10
Slide 10 text
Launchableについて ▶ ユーザーはサービスを利用するために ▶ テスト結果のレポート ▶ Test Suite Insight, PTS ▶ テスト対象を送る/テストすべきリストを受け取る ▶ PTS 10 10 46 test files 36 test files
Slide 11
Slide 11 text
Launchableについて ▶ ユーザーはサービスを利用するために ▶ テスト結果のレポート ▶ Test Suite Insight, PTS ▶ テスト対象を送る/テストすべきリストを受け取る ▶ PTS ▶ Launchable側はマッピングする必要がある 11 11
Slide 12
Slide 12 text
launchableinc/cli 12
Slide 13
Slide 13 text
launchableinc/cli ▶ Python製 ▶ $ pip install launchable ▶ 17のテストランナー(TR)/テストフレームワーク(TF)をサポート ▶ Linux/Windows/Mac ▶ Python 3.5 ~3.10 をサポート ▶ テスト結果を送る / テスト対象をやりとりする ▶ CI環境で利用されることを想定 13 13
Slide 14
Slide 14 text
launchableinc/cli ▶ テスト結果のレポート / launchable record tests 14 14
Slide 15
Slide 15 text
launchableinc/cli ▶ テスト対象の選定 / launchable subset 15 15 46 test files 36 test files
Slide 16
Slide 16 text
launchableコマンドの 苦労とその対策 16
Slide 17
Slide 17 text
苦労 17
Slide 18
Slide 18 text
苦労: 複数TR/TFのサポート 18
Slide 19
Slide 19 text
複数TR/TFのサポート ▶ TR/TFによって ▶ レポートの出力内容 /フォーマットが異なる ▶ 実行可能な単位が異なる ▶ test case, class, file, etc ▶ テスト対象を取得できるもの /できないものがある ▶ 結果: 17のテストランナー(TR)/テストフレームワーク(TF)をサポート 19 19
Slide 20
Slide 20 text
複数TR/TFのサポート ▶ Perlの場合 ▶ Test Anything Protocol (TAP) ▶ テスト実行時間はSpecには含まれず ▶ 実行時間はテストの分析やテストを効率よく実行する上では欠かせないデータ ▶ TAP::Formatter::JUnitのレポートに実行時間は含まれないが TAP::Harness::JUnitのレポートには含まれる 20 20
Slide 21
Slide 21 text
複数TR/TFのサポート ▶ TAP::Harness::JUnit のデフォルトのレポートフォーマット ▶ t/00_compile.t → t_00_compile_t ▶ t/00/compile.t, t_00/compile.t ▶ “t/00_compile.t” で受け取りたい ▶ prove ▶ ファイル名/ディレクトリ単位で個別実行が可能だがテスト対象を返す機能はない ▶ launchable command が指定されたディレクトリからテストファイルを取得 21 21
Slide 22
Slide 22 text
複数TR/TFのサポート ▶ Goの場合 ▶ 標準のコマンドでテスト一覧が取得可能 ▶ go test -list="Test|Example" ./… ▶ 標準でのテストレポートは ▶ カバレッジレポートは標準でサポート ▶ Launchableでは jstemmer/go-junit-report を利用 22 22
Slide 23
Slide 23 text
複数TR/TFのサポート ▶ Goの場合 ▶ -run optionに対応したフォーマットでテスト対象を出力する必要が ▶ go test -run “^TestExampl1$|^TestExample2$|^ExampleGreeting$” 23 23
Slide 24
Slide 24 text
(再掲)複数TR/TFのサポート ▶ TR/TFによって ▶ レポートの出力内容 /フォーマットが異なる ▶ 実行可能な単位が異なる ▶ test case, class, file, etc ▶ テスト対象を取得できるもの /できないものがある ▶ 結果: 17のテストランナー(TR)/テストフレームワーク(TF)をサポート 24 24
Slide 25
Slide 25 text
複数TR/TFのサポート ▶ 利用者の多いTR/TFはLaunchableが公式でサポート ▶ 全てのTR/TFをサポートするは難しい ▶ TR/TFの中には使用している Pluginによってレポートのフォーマットが変わるものも ▶ 他にも 25 25
Slide 26
Slide 26 text
社内TR/TF 26
Slide 27
Slide 27 text
複数TR/TFのサポート ▶ 社内TR/TF ▶ スクラッチ ▶ OSSをforkして独自に機能を追加している ▶ etc ▶ 仕様を聞いてサポートすることもあるが... ▶ 社内TR/TFサポート用のコードを メインストリームに入れるのは難しい 27 27
Slide 28
Slide 28 text
苦労: 複数環境のサポート 28
Slide 29
Slide 29 text
(再掲)launchableinc/cli ▶ Python製 ▶ $ pip install launchable ▶ 17のテストランナー(TR)/テストフレームワーク(TF)をサポート ▶ Linux/Windows/Mac ▶ Python 3.5 ~3.10 をサポート ▶ テストの結果を送る / テスト対象をやりとりする ▶ CI環境で多く利用されることを想定 29 29
Slide 30
Slide 30 text
複数環境のサポート ▶ OS ▶ Linux/Window/Mac ▶ e.g) pathの扱い ▶ Linux/Mac: foo/bar/hoge.txt ▶ Windows: foo\bar\hoge.txt 30 30
Slide 31
Slide 31 text
Cygwin対応 ▶ 稀にCygwin(ローカルの開発)環境で動かない問い合わせ ▶ 担当チケットをCTOにアサインするとシュッと解決 ▶ 31 31
Slide 32
Slide 32 text
複数環境のサポート ▶ Python3.5~3.10 ▶ EOL ▶ Python 3.5: 2020/09/13 ▶ Python 3.6: 2021/12/23 ▶ Python 3.7: 2023/06/27 ▶ なぜ古いバージョンを切らないのか? 32 32
Slide 33
Slide 33 text
複数環境のサポート ▶ 開発者向けツールの宿命 ▶ e.g) ▶ 我々のユーザーのユーザーが 3.5をサポートして欲しい ▶ 我々のユーザーはユーザーのために 3.5をサポート ▶ 我々はユーザーのために 3.5をサポート ▶ CTO曰く ▶ 我々はマラソンで一番後ろを走る人の伴走者 33 33
Slide 34
Slide 34 text
複数環境のサポート ▶ OS × Python バージョンの組み合わせでサポートが必要 ▶ 古いバージョンをサポートするために新しい機能を使えないことも ... ▶ 更にCI環境による違いも ▶ GitHub Actions, CircleCI, GitLab CI/CD, Jenkins ▶ ビルド番号やビルドURLを取得するための環境変数の違いなど 34 34
Slide 35
Slide 35 text
閑話休題: なぜPythonなのか 35
Slide 36
Slide 36 text
なぜPythonなのか ▶ 最初に担当したエンジニアが最も得意だったのがPython ▶ Perlも選択肢にあったが Windows対応を考えるとPythonに軍配 ▶ Go/Rustならよかったのか? ▶ 配布方法/アップデートの仕組みを考える必要がある ▶ plugin 機構をどう提供するのか悩ましい 36 36
Slide 37
Slide 37 text
苦労: エラーハンドリング 37
Slide 38
Slide 38 text
エラーハンドリング ▶ CIに組み込む都合上サービス側(Launchable)の都合で止めてはいけない ▶ テストはPASSしているのにLaunchableへのリクエストがエラーで FAILに...はNG ▶ Launchableがシステム障害で落ちていても動作させる必要があります ▶ エラーにすべきものもある ▶ 設定ミス ▶ 不正なパラメーターの組み合わせ ▶ etc 38 38
Slide 39
Slide 39 text
苦労 ▶ 複数TR/TFのサポート ▶ 複数環境へのサポート ▶ エラーハンドリング 39 39
Slide 40
Slide 40 text
対策 40
Slide 41
Slide 41 text
対策 ▶ plugin 機構 ▶ raw profile ▶ テスト & ドッグフーディング ▶ エラーメッセージ 41 41
Slide 42
Slide 42 text
plugin 機構 ▶ plugin機構をサポート ▶ plugin ファイル (Pythonファイル)を任意のディレクトリに設置 ▶ 実行時にディレクトリを指定 ▶ launchable –plugin plugin-dr/ ▶ 社内TR/TFなどに対応 ▶ plugin作成方法のドキュメントは不十分 ▶ Launchable Advent Calendar 23日目 - custom plugin 42 42
Slide 43
Slide 43 text
raw profile ▶ 個別にpluginを提供するのはコストが高い ▶ 入出力フォーマットを定義しユーザー側で対応してもらう ▶ サポートコストは減る ▶ 複雑なフォーマットではないがユーザー側の対応コストが増える ▶ plugin 機構/ raw profile よりも良いアイディアがあれば採用したい 43 43
Slide 44
Slide 44 text
テスト & ドッグフーディング ▶ 実装中に気を付ける には限界がある ▶ Matrix test ▶ Windows/Linux ▶ Python version 3.5 ~ 3.10 ▶ E2Eテスト ▶ launchable コマンドのリリース前に複数の主要プロファイルでベースシナリオを実行 ▶ 定期実行を行いAPI側が互換性を崩してないかもチェック 44 44
Slide 45
Slide 45 text
テスト & ドッグフーディング ▶ Launchableの開発環境では最新版(main branch)を使用 ▶ API側の開発ブランチがmainにマージされる度に開発環境へE2Eを実施 ▶ launchable commandの大きい機能をリリースする際はマージ後 開発環境で数日様子をみてからリリースすることも ▶ ミスを100%防ぐことは不可能なので早く気付ける仕組みを厚くしている 45 45
Slide 46
Slide 46 text
エラーメッセージ ▶ エラーメッセージを分かりやすく ▶ なぜエラーになっているのか ▶ どうやったら解決するのか ▶ ユーザー側で解決できるのが理想 ▶ 地味。だが効果大 46 46
Slide 47
Slide 47 text
まとめ ▶ 様々な環境へ提供する上での苦労について紹介 ▶ TR/TFの差、OSの差、エラーハンドリング ▶ 残念ながら解決方法に銀の弾丸は無い ▶ 問い合わせや起こしてしまったエラーに対して一つ一つ対策していく ▶ 抽象度のレベルをあげて解決できるように気をつけている 47 47
Slide 48
Slide 48 text
今後 ▶ 中期的 ▶ EOLバージョンのサポートコストと plugin機構の提供方法を踏まえて脱 Python ▶ 長期的(野望) ▶ テストレポートフォーマットの標準化 ▶ 各テストランナーへの機能提案 48 48
Slide 49
Slide 49 text
Thank you! 49
Slide 50
Slide 50 text
Questions 50
Slide 51
Slide 51 text
51 We’re hiring
Slide 52
Slide 52 text
Thank you! 52