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

RWC2025 Ninja-testing with smart playlist

Avatar for seki at druby.org seki at druby.org
November 07, 2025
170

RWC2025 Ninja-testing with smart playlist

RWC2025
本日のおすすめテストの作り方
~忍者式テストのテスト抽出アルゴリズム~

Avatar for seki at druby.org

seki at druby.org

November 07, 2025
Tweet

Transcript

  1. ೜ऀࣜςετ͸5%%ͷࣗવͳ֦ு ✦ ςετۦಈ։ൃʢ5%%ʣΛड͚ೖΕςετͷϨϕϧͰߦ͏ϓϥΫςΟε ✤ Y6OJUΛ࢖ͬͨ5%%ͷΑ͏ʹɺड͚ೖΕςετ͔Β͸͡ΊΔ։ൃ ✤ ςετίʔυʹಋ͔ΕͯϓϩάϥϜΛ։ൃ͢ΔΑ͏ʹɺड͚ೖΕςετʹಋ͔ΕͯετʔϦʔΛ࣮ݱ͢Δ ✤ ετʔϦʔ͕૿͑ΔͨͼʹɺͦΕ·Ͱʹ࡞ͬͨ͢΂ͯͷετʔϦʔͷड͚ೖΕςετΛ΍Γ௚͢ ೜ऀ͕ຖ೔੒௕͢Δຑ΍஛ͷ্Λඈͼӽ͑Δमߦʹ༝དྷɻ໊લ͸ʮςετʯͰ͕͢ςετ͚ͩͰͳ͘ɺιϑτ΢ΣΞ։ൃશମͷ׆ಈͰ͢ɻ

     ➢ テスト駆動開発(TDD)を受け入れテストのレベルで行うプラクティス ⚫ xUnitを使ったTDDのように、受け入れテストからはじめる開発 ⚫ テストコードに導かれてプログラムを開発するように、受け入れテストに導かれてストー リーを実現する ⚫ ストーリーが増えるたびに、それまでに作ったすべてのストーリーの受け入れテストをやり 直す 忍者式テスト 11 September 2023 名前は「テスト」ですがテストだけでなく、ソフトウェア開発全体の活動です
  2. ͍ͨ΁Μͳ͜ͱʹͳΓ·͢ Ͱ΋΍ΔΜͩΑ  たいへんなことになります Day n+1 Vn+1 Story n+1 Day

    n+2 Vn+2 Day n+3 Vn+3 Story n+2 Story n+3 Day n Vn Day n+ Vn+4 Story n+4
  3. ͍ͨ΁Μͳ͜ͱʹͳΓ·͢ Ͱ΋΍ΔΜͩΑ  たいへんなことになります Day n+1 Vn+1 Story n+1 Day

    n+2 Vn+2 Day n+3 Vn+3 Story n+2 Story n+3 Day n Vn Day n+ Vn+4 Story n+4
  4. ن໛ͱ޲͖߹͏ ✦ ௚ۙͷมߋ͸ૣ͔֬͘Ί͍ͨʗ͢΂ͯͷςετέʔεΛ͔֬Ί͍ͨ ✦ Ұ೔Ͱ͸ͳ͘ɺ͋ΔظؒͰςετέʔεΛ͢΂ͯճ͢࡞ઓʹ੾Γସ͑ͨ ✦ ·Μ΂Μͳ͘ɺ͔ͭɺޮՌͷߴ͍ςετέʔεΛநग़͢ΔΞϧΰϦζϜͷ։ൃ ✤ ৽͍͠ετʔϦʔɺमਖ਼ͨ͠͹͔ΓͷνέοτͷςετέʔεΛ࠷༏ઌ ✤

    લճͷςετ݁Ռ͕ύεͨ͠ςετέʔεͷग़ݱස౓Λঃʑʹམͱ͢ ✤ ։ൃͷঢ়گʹԠͯ͡ػೳ͝ͱʹग़ݱස౓Λௐ੔ ✤ ͋ΔظؒͰݟΔͱɺ͢΂ͯͷςετέʔε͕࣮ߦͰ͖Δ ✦ ΞϧΰϦζϜʹΑΓநग़ͨ͠ࠓ೔ͷςετεΠʔτˠʮຊ೔ͷ͓͢͢Ίςετʯ ✤ Ұ೔ʹͰ͖ͦ͏ͳྔͷςετέʔε͔͠දࣔ͠ͳ͍ʢྔʹѹ౗͞Εͳ͍Α͏ʹ͢Δʣ 👏΍ͬͱຊฤ͕͸͡·Γ·͢Αʂ 
  5. 毎日一回再生するプレイリスト 1日に同じ曲を何度も聴かない! 16 再生  するとリストから消えて、次の日に復活する ೔ 🕙 🕚 🕐 🕑

    🕒 🕓 🕔 ೔ 🕙 🕚 🕐 🕑 🕒 🕓 🕔 ೔ 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈
  6. ある期間で全部再生するプレイリスト 一度聴いた曲はしばらく再生されなくていい感じ! 21 ೔      

              㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 再生したらしばらくお休み
  7. 実装 休ませるテストの判定をするメソッドと、それを呼ぶ並べ替えのふたつ 27 休ませるテストの判定 並べ替え def idle_period?(item) return false unless

    item.last_result period = [300, 90, 28, 14, 7, 1].fetch(item.test_rate) item.last_date > Time.now - period * 24 * 60 *60 end ... list.delete_if { |item| idle_period?(item) }.sort_by { |item| [item.last_result ? 1 : 0, item.last_date, item.name] }.first(25)
  8. 並べ替え 32 休ませるテストを取り除く 最後のテストの実施が古い順に並べてN件選ぶ list.delete_if { |item| idle_period?(item) }.sort_by {

    |item| [item.last_result ? 1 : 0, # 最後の結果がNGを優先 item.last_date, # 最後の実施日が古いものを優先 item.name] # 安定ソートのために名前順 }.first(25)
  9. 完成! テストケースごとの結果の履歴は各自準備してください!レートや分類のタグ付けはオプションだよ 33 あなたのチケットシステムに組み込もう! def idle_period?(item) return false unless item.last_result

    period = [300, 90, 28, 14, 7, 1].fetch(item.test_rate) item.last_date > Time.now - period * 24 * 60 *60 end ... list.delete_if { |item| idle_period?(item) }.sort_by { |item| [item.last_result ? 1 : 0, item.last_date, item.name] }.first(25)
  10. テストスイート生成ツールの抜粋 ツールはRWikiと別のプロセスだよ 41 index = rwiki['test-v1'] # タグのページを取得 list =

    index.rev_links.map {|name| # 逆リンクでmap rwiki[name].prop(:story) # propを集める } # さっき説明した選択と並び替え処理 rwiki['sorted-test-v1'].src = rd # テストスイートの # ページを作成
  11. RWikiのObjectを外から使う 青いところがRWikiのObjectへの参照、赤いところがRMI 42 dRubyがちゃんと実用になっててすごい! RWiki ツール index = rwiki['test-v1'] #

    タグのページを取得 list = index.rev_links.map {|name| # 逆リンクでmap rwiki[name].prop(:story) # propを集める } # さっき説明した選択と並び替え処理 rwiki['sorted-test-v1'].src = rd # テストスイートの # ページを作成
  12. ςετ࣮ࢪͷه࿥ʢ೥෼ʣ /(ͷ఺͸Α͘ݟ͑ΔΑ͏ʹڧௐ͍ͯ͠·͢  テスト実施の記録(20年分) 57 営業日 チケット番号 September 2023 NGの点はよく見えるように強調しています

    ⿟0,ςετέʔεͱͦͷपลΛ୳ࡧͯ͠໰୊͕ݟ͔ͭΒͳ͔ͬͨ΋ͷ ⿟/(ςετέʔε͕௨Βͳ͍͚ͩͰͳ͘ɺ࢓༷௨Γ͚ͩͲ࢖͍ͮΒ͍ɺ࢓༷͕৽ ͍͠࢓༷ʹΑ্ͬͯॻ͖͞Εͯ͠·ͬͨɺख৮ΓʢͪΒ͖ͭɺΘ͔ͣͳ஗Ԇʣʹ ҧ࿨ײ͕͋ΔͳͲɺؾʹೖΒͳ͍΋ͷશ͕ͯ/(ɻڱٛͷόά͸গͳ͍
  13. ςετ࣮ࢪͷه࿥ʢ೥෼ʣ ʢΞϧΰϦζϜͱ͸ผʹɺऑ͍෦෼͸νέοτ΋௥Ճ͞ΕΔͷͰࣗવͱςετέʔε΋ް͘ͳΔʣ  テスト実施の記録(20年分) 57 営業日 チケット番号 September 2023 NGの点はよく見えるように強調しています

    ⿟৽͍͠ɾमਖ਼ͨ͠͹͔ΓͷνέοτͷςετέʔεΛ࠷༏ઌ ⿟͜ͷΑ͏ͳνέοτ͸৽ͨͳ໰୊͕ൃݟ͞Εࠩ͠໭͞ΕΔ͜ͱ͕ଟ͍ ⿟։ൃதʹٞ࿦Λਚͯ͘͠΋ɺຊ෺Λ৮Δ͜ͱͰ΋ͬͱΑ͍࢓༷ʹؾ͍ͮͯ͠ ·͏