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
様々な環境へコマンドラインツールを提供する上での苦労とその対策 / YAPC::Kyoto 2023
Search
Konboi
March 19, 2023
Technology
0
2.9k
様々な環境へコマンドラインツールを提供する上での苦労とその対策 / YAPC::Kyoto 2023
Konboi
March 19, 2023
Tweet
Share
More Decks by Konboi
See All by Konboi
非同期開発体制を支えるドキュメント文化 / YAPC::Hiroshima 2024
konboi
28
10k
煩雑な運用を Goを使って楽にする / Go Conference 2019 Spring
konboi
4
4.2k
あなたってどんな方(型)?/ kamakura.go#4
konboi
1
540
中規模チームを支える自動化とノウハウ共有の仕組み/CEDEC2017
konboi
8
9.5k
golang tokyo #6 / ゲーム開発には欠かせない?! あれをシュッと見る
konboi
1
7.4k
git-schemlexとddl-makerを使ったDB migrationの紹介 / git-schemalex and ddl-maker migration #golangtokyo
konboi
1
10k
Redisの調査についてとrmlp
konboi
5
4.4k
カヤックの新卒研修 #師弟登壇2015
konboi
0
3.8k
開発環境をどっかんどっかん立てる
konboi
0
590
Other Decks in Technology
See All in Technology
日本版とグローバル版のモバイルアプリ統合の開発の裏側と今後の展望
miichan
1
130
20241220_S3 tablesの使い方を検証してみた
handy
4
590
alecthomas/kong はいいぞ / kamakura.go#7
fujiwara3
1
300
なぜCodeceptJSを選んだか
goataka
0
160
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
PHPからGoへのマイグレーション for DMMアフィリエイト
yabakokobayashi
1
170
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
200
20241214_WACATE2024冬_テスト設計技法をチョット俯瞰してみよう
kzsuzuki
3
510
[Ruby] Develop a Morse Code Learning Gem & Beep from Strings
oguressive
1
170
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
310
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
150
サイバー攻撃を想定したセキュリティガイドライン 策定とASM及びCNAPPの活用方法
syoshie
3
1.3k
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
The Invisible Side of Design
smashingmag
298
50k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Done Done
chrislema
181
16k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Music & Morning Musume
bryan
46
6.2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
520
Statistics for Hackers
jakevdp
796
220k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
GraphQLとの向き合い方2022年版
quramy
44
13k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Transcript
様々な環境へコマンドラインツールを提 供する上での苦労とその対策 YAPC::Kyoto 2023 2023.03.19 Presented by Ryosuke Yabuki a.k.a
Konboi
自己紹介 ▶ 矢吹 遼介 (Ryosuke Yabuki) ▶ Senior Software Engineer
(Launchable, Inc.) ▶ 福島県在住 ▶ SNS ▶ ブログ: https://blog.konboi.com ▶ Github: Konboi ▶ Twitter: Konboi 2 2
今日話す内容 ▶ Launchableについて ▶ launchableinc/cli (launchable command) ▶ 苦労とその対策 ▶
まとめ ▶ 今後 3 3
Launchableについて 4
Launchableについて ▶ テスト結果および傾向の可視化/分析 ▶ Test Suite Insights ▶ テスト実行の効率化 ▶
Predictive Test Selection (a.k.a PTS) ▶ ※ここでの”テスト”はUnitTestやE2E Testなどの自動テストを指します 5 5
Launchableについて ▶ テスト結果&傾向の可視化/分析 / Test Suite Insights 6 6
Launchableについて ▶ テスト実行の効率化 / Predictive Test Selection (a.k.a PTS) 7
7
Launchableについて ▶ ユーザーはサービスを利用するために 8 8
Launchableについて ▶ ユーザーはサービスを利用するために ▶ テスト結果のレポート ▶ Test Suite Insight, PTS
9 9
Launchableについて ▶ ユーザーはサービスを利用するために ▶ テスト結果のレポート ▶ Test Suite Insight, PTS
▶ テスト対象を送る/テストすべきリストを受け取る ▶ PTS 10 10 46 test files 36 test files
Launchableについて ▶ ユーザーはサービスを利用するために ▶ テスト結果のレポート ▶ Test Suite Insight, PTS
▶ テスト対象を送る/テストすべきリストを受け取る ▶ PTS ▶ Launchable側はマッピングする必要がある 11 11
launchableinc/cli 12
launchableinc/cli ▶ Python製 ▶ $ pip install launchable ▶ 17のテストランナー(TR)/テストフレームワーク(TF)をサポート
▶ Linux/Windows/Mac ▶ Python 3.5 ~3.10 をサポート ▶ テスト結果を送る / テスト対象をやりとりする ▶ CI環境で利用されることを想定 13 13
launchableinc/cli ▶ テスト結果のレポート / launchable record tests 14 14
launchableinc/cli ▶ テスト対象の選定 / launchable subset 15 15 46 test
files 36 test files
launchableコマンドの 苦労とその対策 16
苦労 17
苦労: 複数TR/TFのサポート 18
複数TR/TFのサポート ▶ TR/TFによって ▶ レポートの出力内容 /フォーマットが異なる ▶ 実行可能な単位が異なる ▶ test
case, class, file, etc ▶ テスト対象を取得できるもの /できないものがある ▶ 結果: 17のテストランナー(TR)/テストフレームワーク(TF)をサポート 19 19
複数TR/TFのサポート ▶ Perlの場合 ▶ Test Anything Protocol (TAP) ▶ テスト実行時間はSpecには含まれず
▶ 実行時間はテストの分析やテストを効率よく実行する上では欠かせないデータ ▶ TAP::Formatter::JUnitのレポートに実行時間は含まれないが TAP::Harness::JUnitのレポートには含まれる 20 20
複数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
複数TR/TFのサポート ▶ Goの場合 ▶ 標準のコマンドでテスト一覧が取得可能 ▶ go test -list="Test|Example" ./…
▶ 標準でのテストレポートは ▶ カバレッジレポートは標準でサポート ▶ Launchableでは jstemmer/go-junit-report を利用 22 22
複数TR/TFのサポート ▶ Goの場合 ▶ -run optionに対応したフォーマットでテスト対象を出力する必要が ▶ go test -run
“^TestExampl1$|^TestExample2$|^ExampleGreeting$” 23 23
(再掲)複数TR/TFのサポート ▶ TR/TFによって ▶ レポートの出力内容 /フォーマットが異なる ▶ 実行可能な単位が異なる ▶ test
case, class, file, etc ▶ テスト対象を取得できるもの /できないものがある ▶ 結果: 17のテストランナー(TR)/テストフレームワーク(TF)をサポート 24 24
複数TR/TFのサポート ▶ 利用者の多いTR/TFはLaunchableが公式でサポート ▶ 全てのTR/TFをサポートするは難しい ▶ TR/TFの中には使用している Pluginによってレポートのフォーマットが変わるものも ▶ 他にも
25 25
社内TR/TF 26
複数TR/TFのサポート ▶ 社内TR/TF ▶ スクラッチ ▶ OSSをforkして独自に機能を追加している ▶ etc ▶
仕様を聞いてサポートすることもあるが... ▶ 社内TR/TFサポート用のコードを メインストリームに入れるのは難しい 27 27
苦労: 複数環境のサポート 28
(再掲)launchableinc/cli ▶ Python製 ▶ $ pip install launchable ▶ 17のテストランナー(TR)/テストフレームワーク(TF)をサポート
▶ Linux/Windows/Mac ▶ Python 3.5 ~3.10 をサポート ▶ テストの結果を送る / テスト対象をやりとりする ▶ CI環境で多く利用されることを想定 29 29
複数環境のサポート ▶ OS ▶ Linux/Window/Mac ▶ e.g) pathの扱い ▶ Linux/Mac:
foo/bar/hoge.txt ▶ Windows: foo\bar\hoge.txt 30 30
Cygwin対応 ▶ 稀にCygwin(ローカルの開発)環境で動かない問い合わせ ▶ 担当チケットをCTOにアサインするとシュッと解決 ▶ 31 31
複数環境のサポート ▶ 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
複数環境のサポート ▶ 開発者向けツールの宿命 ▶ e.g) ▶ 我々のユーザーのユーザーが 3.5をサポートして欲しい ▶ 我々のユーザーはユーザーのために
3.5をサポート ▶ 我々はユーザーのために 3.5をサポート ▶ CTO曰く ▶ 我々はマラソンで一番後ろを走る人の伴走者 33 33
複数環境のサポート ▶ OS × Python バージョンの組み合わせでサポートが必要 ▶ 古いバージョンをサポートするために新しい機能を使えないことも ... ▶
更にCI環境による違いも ▶ GitHub Actions, CircleCI, GitLab CI/CD, Jenkins ▶ ビルド番号やビルドURLを取得するための環境変数の違いなど 34 34
閑話休題: なぜPythonなのか 35
なぜPythonなのか ▶ 最初に担当したエンジニアが最も得意だったのがPython ▶ Perlも選択肢にあったが Windows対応を考えるとPythonに軍配 ▶ Go/Rustならよかったのか? ▶ 配布方法/アップデートの仕組みを考える必要がある
▶ plugin 機構をどう提供するのか悩ましい 36 36
苦労: エラーハンドリング 37
エラーハンドリング ▶ CIに組み込む都合上サービス側(Launchable)の都合で止めてはいけない ▶ テストはPASSしているのにLaunchableへのリクエストがエラーで FAILに...はNG ▶ Launchableがシステム障害で落ちていても動作させる必要があります ▶ エラーにすべきものもある
▶ 設定ミス ▶ 不正なパラメーターの組み合わせ ▶ etc 38 38
苦労 ▶ 複数TR/TFのサポート ▶ 複数環境へのサポート ▶ エラーハンドリング 39 39
対策 40
対策 ▶ plugin 機構 ▶ raw profile ▶ テスト &
ドッグフーディング ▶ エラーメッセージ 41 41
plugin 機構 ▶ plugin機構をサポート ▶ plugin ファイル (Pythonファイル)を任意のディレクトリに設置 ▶ 実行時にディレクトリを指定
▶ launchable –plugin plugin-dr/ ▶ 社内TR/TFなどに対応 ▶ plugin作成方法のドキュメントは不十分 ▶ Launchable Advent Calendar 23日目 - custom plugin 42 42
raw profile ▶ 個別にpluginを提供するのはコストが高い ▶ 入出力フォーマットを定義しユーザー側で対応してもらう ▶ サポートコストは減る ▶ 複雑なフォーマットではないがユーザー側の対応コストが増える
▶ plugin 機構/ raw profile よりも良いアイディアがあれば採用したい 43 43
テスト & ドッグフーディング ▶ 実装中に気を付ける には限界がある ▶ Matrix test ▶
Windows/Linux ▶ Python version 3.5 ~ 3.10 ▶ E2Eテスト ▶ launchable コマンドのリリース前に複数の主要プロファイルでベースシナリオを実行 ▶ 定期実行を行いAPI側が互換性を崩してないかもチェック 44 44
テスト & ドッグフーディング ▶ Launchableの開発環境では最新版(main branch)を使用 ▶ API側の開発ブランチがmainにマージされる度に開発環境へE2Eを実施 ▶ launchable
commandの大きい機能をリリースする際はマージ後 開発環境で数日様子をみてからリリースすることも ▶ ミスを100%防ぐことは不可能なので早く気付ける仕組みを厚くしている 45 45
エラーメッセージ ▶ エラーメッセージを分かりやすく ▶ なぜエラーになっているのか ▶ どうやったら解決するのか ▶ ユーザー側で解決できるのが理想 ▶
地味。だが効果大 46 46
まとめ ▶ 様々な環境へ提供する上での苦労について紹介 ▶ TR/TFの差、OSの差、エラーハンドリング ▶ 残念ながら解決方法に銀の弾丸は無い ▶ 問い合わせや起こしてしまったエラーに対して一つ一つ対策していく ▶
抽象度のレベルをあげて解決できるように気をつけている 47 47
今後 ▶ 中期的 ▶ EOLバージョンのサポートコストと plugin機構の提供方法を踏まえて脱 Python ▶ 長期的(野望) ▶
テストレポートフォーマットの標準化 ▶ 各テストランナーへの機能提案 48 48
Thank you! 49
Questions 50
51 We’re hiring
Thank you! 52