Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

モデル検査入門 #wacate

3,149 views

Published on

WACATE2014冬の講演資料です

Published in: Software
  • Be the first to comment

モデル検査入門 #wacate

  1. 1. + モデル検査入門 〜自動設計検証技術の世界〜 WACATE実行委員朱峰錦司@kjstylepp
  2. 2. + 自己紹介  所属  某豊洲のSIer勤務  〜2014.3  テストプロセスおよびツールの研究開発  2014.4〜  アジャイルプロセスおよびツールの研究開発  WACATE実行委員会  テスト自動化研究会  Nippon Enterprise Agile Transformation  専門  テスト分析・設計方法論  スクラム 2 WACATE 2014 Winter 2014/12/06
  3. 3. + 【宣伝1】テスト自動化研究会 隔月でオフライン研究会を実施中  https://sites.google.com/site/testautomationresearch/ 活動内容  本読み/翻訳  ツール紹介  カンファレンス運営  スキル標準整備…etc 3 WACATE 2014 Winter 2014/12/06
  4. 4. + 【宣伝2】チョットデキルTシャツ ワタシハソフトウェアテストチョットデキル  https://suzuri.jp/miwa719/96277/t-shirt/s/white 4 ダイエットに失敗しても 問題なし! WACATE 2014 Winter 2014/12/06
  5. 5. + 【宣伝3】チョットデキルTシャツ2 ほんの1時間前に新作が  https://suzuri.jp/miwa719/130755/t-shirt/m/lightpink 5 女性にもオススメ WACATE 2014 Winter 2014/12/06
  6. 6. + 本講義の目的 モデル検査技術について以下を理解する  動的テストの違い  できること&できないこと  使い所  検査の粒度とツールの種類 オプション目標  ツールデモの再現 6 WACATE 2014 Winter 2014/12/06
  7. 7. + 目次 1. 設計に対する「テスト」 2. モデル 3. モデル検査 4. モデル検査の実施例 5. 活用ポイント 6. 様々なモデル検査ツール 7. まとめ 7 WACATE 2014 Winter 2014/12/06
  8. 8. + 1. 設計に対する「テスト」 WACATE 2014 Winter 2014/12/06 8
  9. 9. + 1.1. 開発プロセスにおけるテスト テスト(testing)の定義by JSTQB 9  全てのライフサイクルを通じて実施する静的、動的なプ ロセスにおいて、成果物が特定の要件を満足するかを判 定し、目的に合致することを実証し、欠陥を見つけるた め、ソフトウェアプロダクトや関連成果物に対し、計画、 準備、評価をすること。 WACATE 2014 Winter 2014/12/06
  10. 10. + 1.2. 狭義/広義のテスト 要件 定義 レビューレビューレビュー ソース コード 設計実装テスト 要件 定義書 狭義のテスト 設計書 静的解析  実装後の「テスト」工程を指すことが多い 広義のテスト ソース コード (修正)  実装以前工程の「レビュー」や「静的解析」も含む 10 テスト 結果 モデル検査もここ WACATE 2014 Winter 2014/12/06
  11. 11. + 1.3. レビューの種類 様々な種類が存在  インスペクション  テクニカルレビュー  ウォークスルー レビューにおける指摘  表現不備  設計不備…etc 11 詳しくは明日の レビューセッションで!! WACATE 2014 Winter 2014/12/06
  12. 12. + 1.4. レビューの自動化 表現不備の発見  文法  ゆらぎ Microsoft Wordによるチェック 設計(実装)不備発見  漏れ  誤り 12 Eclipseによるチェック WACATE 2014 Winter 2014/12/06
  13. 13. + 1.5. モデル検査 レビューの自動化技術の一種  レビュー対象は「モデル」 2章で解説  モデルが「仕様」を満たすかどうかを「検査」 13 3章で解説 WACATE 2014 Winter 2014/12/06
  14. 14. + 2. モデル WACATE 2014 Winter 2014/12/06 14
  15. 15. + 2.1. モデルとは 15 開発対象のシステム(=テスト対象)の振る舞い や性質を特定の観点で抽象化して表現したもの 状態遷移モデル アクティビティモデル WACATE 2014 Winter 2014/12/06
  16. 16. + 2.2. モデルの種類 様々な観点によるモデリング手法が存在  状態遷移モデル  論理モデル  組合せモデル  フローモデル  代数モデル  統計モデル…etc 16 WACATE 2014 Winter 2014/12/06
  17. 17. + 2.3. モデルを扱う際の注意点 17 ひとつのモデルで全て仕様を表現するのは不可能  無理に様々な情報を込めようとすると肥大化  可読性の低下  変更容易性の低下 観点を絞ったシンプルな抽象化が重要  データモデルの状態変化に着目  性能の変化に着目…etc WACATE 2014 Winter 2014/12/06
  18. 18. + 2.4. 状態遷移モデル(1/3) 18 システムの状態変化に着目してシステムの振る舞 いをモデリング  モデル検査は状態遷移を検査対象とすることが多い 構成要素  様々な書き方が存在  基本的な構成要素は以下の通り 事前状態 変数:x,y 事後状態 変数:x,y イベント[遷移条件] /アクション WACATE 2014 Winter 2014/12/06
  19. 19. + 2.4. 状態遷移モデル(2/3) 構成要素 19 構成要素説明 状態ある時点でのシステムの状態を表現。 初期状態特殊な状態。モデルで表現したい状態遷移の 開始時点を表現。 終了状態特殊な状態。モデルで表現したい状態遷移の 終了時点を表現。なくてもよい。 状態変数状態の細かなバリエーションを表現するため の変数。アクションによって変化する。 イベント状態遷移が発生するきっかけ。 遷移条件状態遷移の分岐条件。 アクション状態遷移の結果、システムに発生する状態遷 移以外の変化。なくてもよい。 WACATE 2014 Winter 2014/12/06
  20. 20. + 2.4. 状態遷移モデル(3/3) 会員システムの例 20 WACATE 2014 Winter 2014/12/06
  21. 21. + 3. モデル検査 WACATE 2014 Winter 2014/12/06 21
  22. 22. + 3.1. モデル検査とは 22 モデルが「仕様」を満たしているかどうかを検査 満たさない場合、具体的な満たさない振る舞いの パターン=反例を示す WACATE 2014 Winter 2014/12/06
  23. 23. + 3.2. モデル検査のイメージ 会員システムの例(再掲) 23 WACATE 2014 Winter 2014/12/06
  24. 24. + 3.2.1. 検査したい仕様 24 「会員はアカウントロックのままにはならない」  アカウントロック状態になったらそのうち別状態になる この仕様は満たされない  アカウントロック状態から抜け出すには明示的にロック 解除イベントが必要  ロック解除イベントが実施されない場合、アカウント ロック状態のまま WACATE 2014 Winter 2014/12/06
  25. 25. + 3.2.2. 検査の仕方 25 イベント(会員の行動)を発生する状態遷移モデ ルを作成 「ロック解除をする」か 「何もしない」をランダムに実行 WACATE 2014 Winter 2014/12/06
  26. 26. + 3.2.3. 2つの状態遷移モデルが連動 26 互いにイベントを 通知しあって状態遷移 WACATE 2014 Winter 2014/12/06
  27. 27. + 3.2.4. ロックが解除されるフロー 27 WACATE 2014 Winter 2014/12/06
  28. 28. + 3.2.5. ロックが解除されないフロー(反例) 28 11で10と同じアクションを実行 した結果状態変化なし →ロック解除しないループが存在 WACATE 2014 Winter 2014/12/06
  29. 29. + 3.2.6. モデル検査ツールがやること 29 3.2.4.や3.2.5.のような遷移パターンを自動で網 羅的に探索 網羅した結果、3.2.5のような反例があれば提示  反例がない場合は仕様を満たす WACATE 2014 Winter 2014/12/06
  30. 30. + 3.3. ところで「仕様」とは? なんでも検査できるわけではない 時相論理で表現可能なものを扱うことが多い  時間の概念を取り入れた論理表現  基本的には以下の3種類  常にxxxだ  常にラーメンが食べたい  いつかxxxになる  いつかラーメンが食べたくなる  xxxになるまでyyyだ  ラーメンを食べるまではラーメンが食べたい 30 WACATE 2014 Winter 2014/12/06
  31. 31. + 小演習:プチモデル検査をしてみよう 31 一度ラーメンを食べたくなったら永久にラーメン を食べたい 塩ラーメン が食べたい 醤油ラーメン が食べたい 何も食べた くない WACATE 2014 Winter 2014/12/06
  32. 32. + 小演習:プチモデル検査をしてみよう いつかラーメンを食べたくなる 32 何も食べた くない 醤油ラーメン が食べたい チャーハン が食べたい WACATE 2014 Winter 2014/12/06
  33. 33. + 小演習:プチモデル検査をしてみよう 塩ラーメンを食べたくなったら必ずいつか醤油 ラーメンを食べたくなる 33 何も食べた くない 醤油ラーメン が食べたい 塩ラーメン 食べたい WACATE 2014 Winter 2014/12/06
  34. 34. + 小演習:プチモデル検査をしてみよう 塩ラーメンを食べたくなったら必ずいつか醤油 ラーメンを食べたくなる 34 何も食べた くない 醤油ラーメン が食べたい 塩ラーメン 食べたい WACATE 2014 Winter 2014/12/06
  35. 35. + 3.4. 動的テストとの比較 互いにメリット/デメリットがある モデル検査動的テスト 網羅性網羅的部分的 厳密性厳密不確実 容易性難易 検査対象の規模小規模大規模 利用実績少多 35 モデル検査の優位な点が要求される局面が使い所 となる WACATE 2014 Winter 2014/12/06
  36. 36. + 3.5. モデル検査の種類 設計モデル検査 36  主に先述の例のような相互作用する状態遷移モデルに対 して検査を実施 実装モデル検査  主にマルチスレッドなソースコードの実行パターンに対 して検査を実施 WACATE 2014 Winter 2014/12/06
  37. 37. + 4. モデル検査の実践例 WACATE 2014 Winter 2014/12/06 37
  38. 38. + 4.1. 設計モデル検査の例 Spin  もっとも古典的で有名なモデル検査ツールのひとつ  日本語で得られるモデル検査ツールの情報の大半はSpin  状態遷移モデルをPromelaという C Likeな独自言語で記述  文法が少し似ているだけ  パラダイムは全く別 38 WACATE 2014 Winter 2014/12/06
  39. 39. + 4.1.1. 例題 競合を起こす簡単な並行システム 39 mtype = {LOCKED, UNLOCKED}; mtype mutex = UNLOCKED; int cnt = 0; inline lock() { ロックを管理する共有変数 mutex == UNLOCKED -> mutex = LOCKED } inline unlock() { ロック判定と状態遷移の間の mutex = UNLOCKED タ} イミングで競合が起こる active[3] proctype LockUnlock() { again: lock(); cnt ++; assert(cnt == 1); cnt --; unlock(); goto again } ロックされてなければロックする ロックしている場合はブロック インクリメントを確認 WACATE 2014 Winter 2014/12/06
  40. 40. + 4.1.2. モデル検査の実施 プロセス間競合を起こすパターンを検出 40 0: proc - (:root:) creates proc 0 (LockUnlock) 0: proc - (:root:) creates proc 1 (LockUnlock) 0: proc - (:root:) creates proc 2 (LockUnlock) 1: proc 2 (LockUnlock:1) sample.pml:6 (state 1)[((mutex==UNLOCKED))] 2: proc 0 (LockUnlock:1) sample.pml:6 (state 1)[((mutex==UNLOCKED))] 3: proc 2 (LockUnlock:1) sample.pml:6 (state 2)[mutex = LOCKED] 4: proc 0 (LockUnlock:1) sample.pml:6 (state 2)[mutex = LOCKED] 5: proc 2 (LockUnlock:1) sample.pml:17 (state 4) [cnt = (cnt+1)] 6: proc 0 (LockUnlock:1) sample.pml:17 (state 4) [cnt = (cnt+1)] spin: sample.pml:18, Error: assertion violated spin: text of failed assertion: assert((cnt==1)) #processes: 3 7: proc 2 (LockUnlock:1) sample.pml:18 (state 5) 7: proc 1 (LockUnlock:1) sample.pml:5 (state 3) 7: proc 0 (LockUnlock:1) sample.pml:18 (state 5) 3 processes created mutexの状態変化の前に連続して UNLOCKED判定が行われるとダ メ! WACATE 2014 Winter 2014/12/06
  41. 41. + 4.2. 実装モデル検査の例 Java Path Finder 41  NASAが宇宙探索機ソフトウェアの検証のために開発し たJavaプログラムの検査ツール  statement実行ごとに状態を記録/仕様の充足を確認  OKなら次に起こり得る状態の一覧を作成したうえで、深さ優先探 索で次の実行パターンを検査  NGならそこに至る実行過程を反例として示す WACATE 2014 Winter 2014/12/06
  42. 42. + 4.2.1. 例題 スレッド競合を起こす簡単なプログラム 42 public class Sample implements Runnable { static int sharedData = 0; public void run() { int tmp = sharedData; sharedData += 1; assert(tmp + 1 == sharedData); } public static void main(String args[]) { このタイミングで他のスレッドで インクリメントされると例外発生! int size = Integer.parseInt(args[0]); Sample instance = new Sample(); for(int i = 0; i < size; i++) { 共有変数をインクリメント Thread thread = new Thread(instance); thread.start(); } } } 共有変数 インクリメントを確認 WACATE 2014 Winter 2014/12/06
  43. 43. + 4.2.2. モデル検査の実施 スレッド競合を起こすパターンを検出 43 ====================================================== error 1 gov.nasa.jpf.vm.NoUncaughtExceptionsProperty java.lang.AssertionError at Sample.run(Sample.java:7) ====================================================== snapshot #1 thread java.lang.Thread:{id:2,name:Thread-2,status:RUNNING,priority:5,isDaemon:false,lockCount:0,suspendCount:0} call stack: at Sample.run(Sample.java:7) thread java.lang.Thread:{id:3,name:Thread-3,status:RUNNING,priority:5,isDaemon:false,lockCount:0,suspendCount:0} call stack: at Sample.run(Sample.java:7) 2つのスレッドが同時に7行目 (assert)を実行するとダメ! ====================================================== results error #1: gov.nasa.jpf.vm.NoUncaughtExceptionsProperty "java.lang.AssertionError at Sample.run(Sample.jav...“ WACATE 2014 Winter 2014/12/06
  44. 44. + 5. 活用のポイント WACATE 2014 Winter 2014/12/06 44
  45. 45. + 5.1. 使い所 モデル検査の優位性  網羅性  厳密性 網羅性が求められる局面 45  複雑な非同期/並行システムにおいて、レアケースを特 定するような検査 厳密性が求められる局面  障害によって人命や巨額な資産を損なうようなシステム の検査 WACATE 2014 Winter 2014/12/06
  46. 46. + 5.2. 注意点 計算量の爆発 46  遷移パターンが発散するようなモデルを書くとすぐに状 態爆発をして検査が終わらなくなる  関心ごとを絞ったシンプルなモデリングを行う モデルおよび仕様の実装誤り  設計を忠実に再現した(検査可能な)モデルや仕様を書 くのがそもそも困難  Try & Errorを繰り返しながら洗練させていくしかない WACATE 2014 Winter 2014/12/06
  47. 47. + (参考)JavaPathFinderの計算量 3スレッド 31状態作って10個探索して終了 ====================================================== statistics elapsed time: 00:00:00 states: new=31,visited=10,backtracked=21,end=6 search: maxDepth=20,constraints=0 choice generators: thread=30 (signal=0,lock=3,sharedRef=12,threadApi=3,reschedule=12), data=0 heap: new=394,released=139,maxLive=367,gcCycles=28 instructions: 4022 max memory: 123MB 15スレッド 32,875状態作って213,010個探索してやっと終了 ====================================================== statistics elapsed time: 00:00:18 states: new=32875,visited=213010,backtracked=245781,end=18 search: maxDepth=104,constraints=0 choice generators: thread=32874 (signal=0,lock=15,sharedRef=60,threadApi=15,reschedule=32784), data=0 heap: new=478,released=983323,maxLive=415,gcCycles=245824 instructions: 4183958 max memory: 353MB 100スレッド  まぁムリムリ\(^o^)/ 47 WACATE 2014 Winter 2014/12/06
  48. 48. + 6. 様々なモデル検査ツール WACATE 2014 Winter 2014/12/06 48
  49. 49. + 6.1. Alloy この頃流行りのモデル検査ツール 集合と制約によってモデルを記述  文法が(比較的)直感的 反例の表示もグラフィカルでわかりやすい 49 WACATE 2014 Winter 2014/12/06
  50. 50. + 6.2. CBMC C/C++のモデル検査  gccおよびVisualStudioで動作 コードに対して以下を検査可能  配列溢れ  ポインタの安全性  例外の発生やユーザ定義のアサーション 50 WACATE 2014 Winter 2014/12/06
  51. 51. + 6.3. ESC/Java Javaのモデル検査 51 JMLによってアノテーションとして定義された仕 様を検査可能  JML:Java Modeling Language  Java向けの契約プログラミングツール  各メソッドの事前/事後条件や普遍条件を記述  実行時に条件違反を検知  ESC/JavaはJML違反をプログラムの実行時ではなく静 的解析によって検査 WACATE 2014 Winter 2014/12/06
  52. 52. + (参考)JMLの例 52 public class BankingExample { public static final int MAX_BALANCE = 1000; private /*@ spec_public @*/ int balance; //@ public invariant balance >= 0 && balance <= MAX_BALANCE; //@ assignable balance; //@ ensures balance == 0; public BankingExample() { this.balance = 0; } 普遍条件 事後条件 //@ requires 0 < amount && amount + balance < MAX_BALANCE; //@ assignable balance; //@ ensures balance == ¥old(balance) + amount; public void credit(final int amount) { this.balance += amount; } } 事前条件 WACATE 2014 Winter 2014/12/06
  53. 53. + 7. まとめ WACATE 2014 Winter 2014/12/06 53
  54. 54. + 7.1. モデル検査 レビューの自動化技術の一種  振る舞いの妥当性を検査 検査対象は主に状態遷移モデル  相互作用する状態遷移モデル  マルチスレッドプログラムの実行状態パターン 検査仕様は主に時相論理  常にxxxだ  いつかxxxになる  xxxになるまでyyyだ 54 WACATE 2014 Winter 2014/12/06
  55. 55. + 7.2. モデル検査の活用 動的テストとの違い モデル検査動的テスト 網羅性網羅的部分的 厳密性厳密不確実 容易性難易 検査対象の規模小規模大規模 利用実績少多 網羅性や厳密性が求められる局面で活用 55 活用の際は状態爆発に気をつけながら段階的にモ デルを洗練させていく WACATE 2014 Winter 2014/12/06
  56. 56. +Let’s Modeling! 2014/12/06 WACATE 2014 Winter

×