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

不具合調査とTest

Kazuki Chigita
December 12, 2024
230

 不具合調査とTest

2024/12/12 Android Test Night #10 の発表「不具合調査とTest」で使用したスライドです
https://testnight.connpass.com/event/338079/

参考文献へのリンク
Testing Strategies https://developer.android.com/training/testing/fundamentals/strategies
Android Vitals https://developer.android.com/topic/performance/vitals

Kazuki Chigita

December 12, 2024
Tweet

Transcript

  1. [🏎] Workaroundパッチを当てる • 必ず TODO コメントと後でfoundamental fixを行うための GitHub issues /

    チケット等を作成する • テストが不足しているならこのタイミングでも追加する ◦ foundamental fix を行う際に修正が適当であることを、 テストをもって保証する。
  2. [🛠] 根本の問題を修正する • 統計情報 ◦ 例1: 特定のOSバージョンで発生している ◦ 例2: 特定のバージョンで発生している

    ◦ 例3: 特定の条件で発生ている • ユーザシナリオ ◦ (私の経験的に)コードから追うよりも、ユースケースから 考える方が根本の原因に辿り着きやすく、本質的な 改修に繋がりやすい ◦ ログなどからユーザの動作を追って再現させるのも効果的
  3. [🛠] 根本の問題を修正する • 統計情報 ◦ 例1: 特定のOSバージョンで発生している ◦ 例2: 特定のバージョンで発生している

    ◦ 例3: 特定の条件で発生ている • ユーザシナリオ ◦ (私の経験的に)コードから追うよりも、ユースケースから 考える方が根本の原因に辿り着きやすく、本質的な 改修に繋がりやすい ◦ ログなどからユーザの動作を追って再現させるのも効果的 よっしゃ原因特定!
  4. [🛠] 根本の問題を修正する • 統計情報 ◦ 例1: 特定のOSバージョンで発生している ◦ 例2: 特定のバージョンで発生している

    ◦ 例3: 特定の条件で発生ている • ユーザシナリオ ◦ (私の経験的に)コードから追うよりも、ユースケースから 考える方が根本の原因に辿り着きやすく、本質的な 改修に繋がりやすい ◦ ログなどからユーザの動作を追って再現させるのも効果的 修正とテストはセット
  5. [🛠] 根本の問題を修正する • 統計情報 ◦ 例1: 特定のOSバージョンで発生している ◦ 例2: 特定のバージョンで発生している

    ◦ 例3: 特定の条件で発生ている • ユーザシナリオ ◦ (私の経験的に)コードから追うよりも、ユースケースから 考える方が根本の原因に辿り着きやすく、本質的な 改修に繋がりやすい ◦ ログなどからユーザの動作を追って再現させるのも効果的
  6. [🛠] 根本の問題を修正する • 統計情報 ◦ 例1: 特定のOSバージョンで発生している ◦ 例2: 特定のバージョンで発生している

    ◦ 例3: 特定の条件で発生ている • ユーザシナリオ ◦ (私の経験的に)コードから追うよりも、ユースケースから 考える方が根本の原因に辿り着きやすく、本質的な 改修に繋がりやすい ◦ ログなどからユーザの動作を追って再現させるのも効果的 Unit Testに追加しやすい
  7. [🛠] 根本の問題を修正する • 統計情報 ◦ 例1: 特定のOSバージョンで発生している ◦ 例2: 特定のバージョンで発生している

    ◦ 例3: 特定の条件で発生ている • ユーザシナリオ ◦ (私の経験的に)コードから追うよりも、ユースケースから 考える方が根本の原因に辿り着きやすく、本質的な 改修に繋がりやすい ◦ ログなどからユーザの動作を追って再現させるのも効果的 Unit Testに追加しやすい Feature Testに追加しやすい
  8. [🕰] 問題をrevertする • git bisect ◦ 二分探索を用いながら、問題が発生したcommitを見つける ◦ https://git-scm.com/docs/git-bisect ◦

    git bisect run ./bisect.sh ▪ bisect.sh で、問題を検知できるテストを実行させる ▪ 問題が混入した commit が特定できる
  9. 2: 不具合の検知を早くしたい • anti-pattern ◦ UnitTest、Feature Test、Release Candidate Test等 全てのテストを全てのPRのCIで走らせる

    ◦ マージ/機能リリースまでのリードタイムが長くなる • 適切なフェーズで適切なテストを行う!
  10. @Test fun testKeyCompleteness() { val definedKeys = SPECIFIC_PURPOSE_SET + KEYS_NOT_TO_SPECIFIC_PURPOSE_SET

    FooKey.entries.forEach { assertTrue(it in definedKeys) } } @Test fun testNoDuplicatedKeys() { assertEquals( SPECIFIC_PURPOSE_SET.size + KEYS_NOT_TO_SPECIFIC_PURPOSE_SET.size, FooKey.entries.size ) } companion object { private val KEYS_NOT_TO_SPECIFIC_PURPOSE_SET = setOf( FooKey.C ) }
  11. [tips] [example] UnitTestで実装漏れを検知する • (補足) 集合 S を S_1、S_2、...、S_nに分割するときに 素集合となる条件は以下2つを満たすことだから

    ∀ s ∈ S, ∃ i ( s ∈ S_i ) ∀ i, j, s ∈ S_i ( i ≠ j ⇒ s ∉ S_j ) testKeyCompletenessに対応 testNoDuplicateKeysに対応
  12. 3: 類似の問題の発生を防ぐ • 地道にテストピラミッドを充実させていくしかない ◦ これまで紹介した不具合修正とテストの追加を 継続して続ける ◦ 可視化は効果的 •

    クラッシュ・ANR・アプリサイズなどのAndroid Vitals トレンドを継続的に追う ◦ テストをすり抜けてしまった問題についてもケアする ◦ 修正の際はテストを追加する
  13. まとめ • 不具合調査もテストドリブンにできる ◦ 細かなテクニックや分類分けがある • 日々のテスト資産が、不具合発生から修正までの リードタイムを短くする • Testing

    strategiesのページは必読 ◦ https://developer.android.com/training/testing/fundamentals/strategies • 細かな話は省いているので、ぜひ後ほど