Slide 1

Slide 1 text

OJOKBUFTUJOHDPN ຊ೔ͷ͓͢͢Ίςετͷ࡞Γํ ~ ೜ऀࣜςετͷςετநग़ΞϧΰϦζϜ ~

Slide 2

Slide 2 text

"HFOEB ✦ ೜ऀࣜςετͷ͓͞Β͍ ✦ ຊ೔ͷ͓͢͢Ίςετͷ࡞Γํ ೜ऀࣜςετʹ͍ͭͯ͸ͪ͜ΒͷεϥΠυΛݟͯͶ👉IUUQTTQFBLFSEFDLDPNN@TFLJ[ 

Slide 3

Slide 3 text

ࣗݾ঺հ ࢲͨͪ͸9ઢ$5૷ஔʹ౥ࡌ͢Διϑτ΢ΣΞΛ91Ͱ։ൃ͍ͯ͠·͢  ؔকढ़ϓϩάϥϚ  ਂ୩ඒ࿨ςελʔ ͜ͷ9ઢ$5ը૾͸ࢲͨͪͷ։ൃͨ͠૷ஔͰࡱӨͨ͠ࢲͨͪͷத਎ʢਓؒυοΫͷ࠶ݕࠪͰࡱͬͯ΋ΒͬͨΑʂʣ 

Slide 4

Slide 4 text

3VCZ8PSME$POGFSFODFʹΑͤͯ ✦ ࢲͨͪͷνʔϜͷ׆ಈͷத৺ʹ͸ɺ3VCZ੡ͷνέοτγεςϜ͕͋Γ·͠ ͨɻ೜ऀࣜςετ΋͜ͷνέοτγεςϜͷ͏͑ʹ੒Γཱ͓ͬͯΓɺࢲͨͪͷ ೥ؒ͸3VCZͱͱ΋ʹ͋ͬͨͷͰ͢ɻ Ϗδωεͷ࿩Ͱ͢ʂʂ 

Slide 5

Slide 5 text

೜ऀࣜςετ͸5%%ͷࣗવͳ֦ு ✦ ςετۦಈ։ൃʢ5%%ʣΛड͚ೖΕςετͷϨϕϧͰߦ͏ϓϥΫςΟε ✤ Y6OJUΛ࢖ͬͨ5%%ͷΑ͏ʹɺड͚ೖΕςετ͔Β͸͡ΊΔ։ൃ ✤ ςετίʔυʹಋ͔ΕͯϓϩάϥϜΛ։ൃ͢ΔΑ͏ʹɺड͚ೖΕςετʹಋ͔ΕͯετʔϦʔΛ࣮ݱ͢Δ ✤ ετʔϦʔ͕૿͑ΔͨͼʹɺͦΕ·Ͱʹ࡞ͬͨ͢΂ͯͷετʔϦʔͷड͚ೖΕςετΛ΍Γ௚͢ ೜ऀ͕ຖ೔੒௕͢Δຑ΍஛ͷ্Λඈͼӽ͑Δमߦʹ༝དྷɻ໊લ͸ʮςετʯͰ͕͢ςετ͚ͩͰͳ͘ɺιϑτ΢ΣΞ։ൃશମͷ׆ಈͰ͢ɻ  ➢ テスト駆動開発(TDD)を受け入れテストのレベルで行うプラクティス ⚫ xUnitを使ったTDDのように、受け入れテストからはじめる開発 ⚫ テストコードに導かれてプログラムを開発するように、受け入れテストに導かれてストー リーを実現する ⚫ ストーリーが増えるたびに、それまでに作ったすべてのストーリーの受け入れテストをやり 直す 忍者式テスト 11 September 2023 名前は「テスト」ですがテストだけでなく、ソフトウェア開発全体の活動です

Slide 6

Slide 6 text

ʲਤղʳ೜ऀࣜςετ ࣮ࡍͷ։ൃͰ͸ΠςϨʔγϣϯͰෳ਺ͷετʔϦʔΛѻ͍ͬͯΔ  【図解】忍者式テスト 15 September 2023 実際の開発では1イテレーションで複数のストーリーを扱っている Day1 V1 Story1 Day2 V2 Day3 V3 Story2 Story3

Slide 7

Slide 7 text

͍ͨ΁Μͳ͜ͱʹͳΓ·͢ Ͱ΋΍ΔΜͩΑ  たいへんなことになります 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

Slide 8

Slide 8 text

೜ऀࣜςετͷςετ͸໰୊Λ୳͢ςετ ιϑτ΢ΣΞͷςετͱ͸ͳʹ͔ ✦ ؾʹೖΒͳ͍͜ͱΛ୳ͯ͠ɺ΋ͬͱྑ͘͢ΔͨΊʹςετ͢Δ ✤ ͏·͍ͬͨ͘ςετɺͱ͍͏ͷ͸৽͍͠໰୊Λݟ͚ͭΒΕͨςετ ✤ ࣦഊͨ͠ςετɺͱ͍͏ͷ͸ͳʹ΋໰୊͕ݟ͔ͭΒͳ͔ͬͨςετ ໰୊Λݟ͚ͭΔͨΊʹखಈͰςετ͠·͢ʂʂʢࣗಈςετͰ͸஌Βͳ͍໰୊Λݟ͚ͭΔͷ͸೉͍͠ʣ  ΤϥʔΛൃݟ͢Δ໨తͰϓϩάϥϜΛ࣮ߦ͢Δաఔ͕ ςετͰ͋Δɽ ιϑτ΢ΣΞͷ৴པੑQ

Slide 9

Slide 9 text

͍ͨ΁Μͳ͜ͱʹͳΓ·͢ Ͱ΋΍ΔΜͩΑ  たいへんなことになります 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

Slide 10

Slide 10 text

ن໛ͱ޲͖߹͏ ✦ ௚ۙͷมߋ͸ૣ͔֬͘Ί͍ͨʗ͢΂ͯͷςετέʔεΛ͔֬Ί͍ͨ ✦ Ұ೔Ͱ͸ͳ͘ɺ͋ΔظؒͰςετέʔεΛ͢΂ͯճ͢࡞ઓʹ੾Γସ͑ͨ ✦ ·Μ΂Μͳ͘ɺ͔ͭɺޮՌͷߴ͍ςετέʔεΛநग़͢ΔΞϧΰϦζϜͷ։ൃ ✤ ৽͍͠ετʔϦʔɺमਖ਼ͨ͠͹͔ΓͷνέοτͷςετέʔεΛ࠷༏ઌ ✤ લճͷςετ݁Ռ͕ύεͨ͠ςετέʔεͷग़ݱස౓Λঃʑʹམͱ͢ ✤ ։ൃͷঢ়گʹԠͯ͡ػೳ͝ͱʹग़ݱස౓Λௐ੔ ✤ ͋ΔظؒͰݟΔͱɺ͢΂ͯͷςετέʔε͕࣮ߦͰ͖Δ ✦ ΞϧΰϦζϜʹΑΓநग़ͨ͠ࠓ೔ͷςετεΠʔτˠʮຊ೔ͷ͓͢͢Ίςετʯ ✤ Ұ೔ʹͰ͖ͦ͏ͳྔͷςετέʔε͔͠දࣔ͠ͳ͍ʢྔʹѹ౗͞Εͳ͍Α͏ʹ͢Δʣ 👏΍ͬͱຊฤ͕͸͡·Γ·͢Αʂ 

Slide 11

Slide 11 text

本日のおすすめテストの作り方 11 アイデア 実装 チケットシステムへの組み込み 今 日 は こ れ !

Slide 12

Slide 12 text

アイデアの背景 21世紀の初めの話だよ! 12 ストリーミング以前の音楽の聴き方 全ての音楽ライブラリを持ち歩く! 毎日ライブラリが増えるとたいへんなことになる 新しい曲がなかなか聴けない(シャッフル再生) ライブラリが端末の容量を超えてしまう スマートプレイリストの工夫で解決してた 💿 💿 💿

Slide 13

Slide 13 text

これは! めっちゃ似てる! 13 テストスイートの生成に使えるのでは? ある期間で全曲再生するスマートプレイリスト ある期間で全部テストするテストスイート

Slide 14

Slide 14 text

毎日一回再生したい 基本編 14

Slide 15

Slide 15 text

毎日一回再生するプレイリスト スマートプレイリストは検索条件に従って動的にプレイリストが変化する 15 最後に再生した日が1日以内でない曲

Slide 16

Slide 16 text

毎日一回再生するプレイリスト 1日に同じ曲を何度も聴かない! 16 再生  するとリストから消えて、次の日に復活する ೔ 🕙 🕚 🕐 🕑 🕒 🕓 🕔 ೔ 🕙 🕚 🕐 🕑 🕒 🕓 🕔 ೔ 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈

Slide 17

Slide 17 text

毎日一回再生テストしたい 17 音楽の「再生」を「テスト」に置き換えてみます!

Slide 18

Slide 18 text

毎日一回テストするテストスイート 18 最後にテストした日が1日以内でないテストを集めれば 良い 「1日」を「ある期間」に拡張してみよう

Slide 19

Slide 19 text

ある期間で全部再生したい 19

Slide 20

Slide 20 text

ある期間で全部再生するプレイリスト 20 最後に再生した日がn日以内でない曲 再生したらしばらくお休み

Slide 21

Slide 21 text

ある期間で全部再生するプレイリスト 一度聴いた曲はしばらく再生されなくていい感じ! 21 ೔                 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 㽈 再生したらしばらくお休み

Slide 22

Slide 22 text

ある期間で全部テストしたい その日のおすすめが終わらなくても次の日には優先して現れるので気にしない 22 一度テストしたらある期間お休みするテストスイート 期間はチームがこなせるテストの量で調整する ギリギリよりちょっと多いくらいにする その日にテストできなかったら次の日に繰り越し

Slide 23

Slide 23 text

さらに細かくチューニングしたい 23 新規/修正直後のチケットを最優先 テストする頻度を調整する テーマごとのテストスイート(運用の工夫)

Slide 24

Slide 24 text

新規/修正直後のチケットを最優先 iTunesにはテスト結果がNGはないので、テストスイート生成用の特別な処理のこと 24 以下は休ませる期間に関係なくテストスイートに入れる 新規 = テストの履歴がない 修正直後 = 最後のテスト結果がNGのもの

Slide 25

Slide 25 text

テストする頻度を調整する レートによって休ませる期間を増減します 25 テストごとに★レートを設定する ★★☆☆☆ 自然に毎日さわる機能 (例)起動終了とか ★☆☆☆☆ 準備が大変→頻繁にはやりたくない (例)ディスクフルの用意とか ★★★★★ なんとなくあやしいから毎日試したい そういう機能あるでしょ?

Slide 26

Slide 26 text

テーマごとのテストスイート 26 機能、バージョン、機種など、テーマごとにテストス イートがあるとうれしい 関連するテストが続くので集中でき、問題を探索しやす い 開発状況に応じて注目点の時間配分を加減できる テーマを「テスト分類」と呼びタグで管理してる

Slide 27

Slide 27 text

実装 休ませるテストの判定をするメソッドと、それを呼ぶ並べ替えのふたつ 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)

Slide 28

Slide 28 text

休ませるテストの判定 trueだと休みだよ 28 最後のテストが設定された期間より新しいものは休み 最後の結果がNGのものは休ませない 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

Slide 29

Slide 29 text

休ませるテストの判定 trueだと休みだよ 29 最後のテストが設定された期間より新しいものは休み 最後の結果がNGのものは休ませない 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

Slide 30

Slide 30 text

並べ替え 30 休ませるテストを取り除く 最後のテストの実施が古い順に並べてN件選ぶ list.delete_if { |item| idle_period?(item) }.sort_by { |item| [item.last_result ? 1 : 0, item.last_date, item.name] }.first(25)

Slide 31

Slide 31 text

並べ替え 31 休ませるテストを取り除く 最後のテストの実施が古い順に並べてN件選ぶ list.delete_if { |item| idle_period?(item) }.sort_by { |item| [item.last_result ? 1 : 0, item.last_date, item.name] }.first(25)

Slide 32

Slide 32 text

並べ替え 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)

Slide 33

Slide 33 text

完成! テストケースごとの結果の履歴は各自準備してください!レートや分類のタグ付けはオプションだよ 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)

Slide 34

Slide 34 text

RWiki チケットシステムへの組み込み 34 自 慢

Slide 35

Slide 35 text

RWiki 20世紀製 35 ERB, dRubyのサンプルとして書いたWiki インメモリOODB 書式はRD(Ruby Document format)

Slide 36

Slide 36 text

チケットの例 36 1ページが1チケットに相当する テスト分類、レートも書いてある

Slide 37

Slide 37 text

リンクを利用したタグ付け 37 チケットからテスト分類へリンクする 逆リンクの集合を使ってテストスイートを作る 機能A チケット 機能B バージョン2 バージョン3

Slide 38

Slide 38 text

テストと履歴 38 チケットにはテストが書いてある テストした日と結果も記録

Slide 39

Slide 39 text

おまけ(履歴のすごいやつ) 2003年のチケットのテストが不要になっていることに2019年に気づいた例👉 39 2003年のチケットが見直されたりする たまにテストがNGになる 仕様が陳腐化するケースが多い 新しい仕様が過去の仕様を上書きする 実装の変化によりテストする意味がなくなる テスト通り動くけど意味のなさを検出!

Slide 40

Slide 40 text

Pageから属性を取得する仕組み YAMLが登場する前、せまい界隈でRDdataというアイデアがあったような 40 RDtoolでRDを変換する過程でDOM木が生成される。 DOM木をパターンマッチして属性リストを作る

Slide 41

Slide 41 text

テストスイート生成ツールの抜粋 ツールはRWikiと別のプロセスだよ 41 index = rwiki['test-v1'] # タグのページを取得 list = index.rev_links.map {|name| # 逆リンクでmap rwiki[name].prop(:story) # propを集める } # さっき説明した選択と並び替え処理 rwiki['sorted-test-v1'].src = rd # テストスイートの # ページを作成

Slide 42

Slide 42 text

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 # テストスイートの # ページを作成

Slide 43

Slide 43 text

さて検証の時間です miwa719による解説です 43 自慢はここまで 本日のおすすめテストはうまくいってる? 20年分のテストの記録で確かめてみましょう

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

ςετ࣮ࢪͷه࿥ʢ೥෼ʣ  テスト実施の記録(20年分) 57 営業日 チケット番号 September 2023 NGの点はよく見えるように強調しています ⿟ॳظͷࠒ͸ຖ೔͢΂ͯͷνέοτΛςετ͍ͯͨ͠ͷͰۭന͕ͳ͍ 👆 ͜ͷลΓ͔Βʮຊ೔ͷ͓͢͢ΊςετʯΛӡ༻

Slide 46

Slide 46 text

ςετ࣮ࢪͷه࿥ʢ೥෼ʣ  テスト実施の記録(20年分) 57 営業日 チケット番号 September 2023 NGの点はよく見えるように強調しています ⿟೥લͷνέοτ΋ఆظతʹςετ͞Ε͍ͯΔ

Slide 47

Slide 47 text

ςετ࣮ࢪͷه࿥ʢ೥෼ʣ ʢΞϧΰϦζϜͱ͸ผʹɺऑ͍෦෼͸νέοτ΋௥Ճ͞ΕΔͷͰࣗવͱςετέʔε΋ް͘ͳΔʣ  テスト実施の記録(20年分) 57 営業日 チケット番号 September 2023 NGの点はよく見えるように強調しています ⿟৽͍͠ɾमਖ਼ͨ͠͹͔ΓͷνέοτͷςετέʔεΛ࠷༏ઌ ⿟͜ͷΑ͏ͳνέοτ͸৽ͨͳ໰୊͕ൃݟ͞Εࠩ͠໭͞ΕΔ͜ͱ͕ଟ͍ ⿟։ൃதʹٞ࿦Λਚͯ͘͠΋ɺຊ෺Λ৮Δ͜ͱͰ΋ͬͱΑ͍࢓༷ʹؾ͍ͮͯ͠ ·͏

Slide 48

Slide 48 text

ςετ࣮ࢪͷه࿥ʢ೥෼ʣ  テスト実施の記録(20年分) 57 営業日 チケット番号 September 2023 NGの点はよく見えるように強調しています ⿟͜ͷۭന஍ଳ͸࣍ੈ୅ͷ੡඼ʹγϑτͨ࣌͠ظ ⿟ࣄۀܭըʹैͬͯςετͷ஫ྗ఺Λௐ੔ͨ͠ ⿟ͦͷޙɺঃʑʹ·Μ΂Μͳ͘ςετ͢ΔΑ͏ʹճ෮

Slide 49

Slide 49 text

͏·͘Ͱ͖ͯΔͷʁ ✦ ͏·͘Ͱ͖ͯͨʂ👏 

Slide 50

Slide 50 text

೜ऀࣜςετΛࢧ͑Δʮຊ೔ͷ͓͢͢Ίςετͷ࡞ΓํʯΛࣗຫ͠·ͨ͠🥷ɹίʔϧυεϦʔϓલͷ࠷ޙͷߨԋͰͨ͠ ຊ೔ͷ͓͢͢Ίςετͷ࡞Γํ ʔEpisode MATSUEʔ Ninja testing ZO/Z5 Anniversary