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.

18

Share

Download to read offline

モデル検査入門 #wacate

Download to read offline

WACATE2014冬の講演資料です

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

モデル検査入門 #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
  • ShinsukeMiwa

    Jun. 22, 2021
  • wada-shin-ichi

    May. 9, 2019
  • ssuser8ca026

    Mar. 30, 2019
  • hirakukomuro

    Jan. 8, 2019
  • taroyamakawa18

    Aug. 14, 2017
  • KenjiMotomura

    Aug. 29, 2016
  • kauji0522

    Jul. 5, 2015
  • takahirokatakawa

    Jan. 6, 2015
  • fukuihi

    Dec. 26, 2014
  • toshinaowatanabe9

    Dec. 10, 2014
  • shizubanban

    Dec. 8, 2014
  • Bugler

    Dec. 7, 2014
  • tosikawa

    Dec. 7, 2014
  • takashiyamasaki378

    Dec. 6, 2014
  • eikoishizuka3

    Dec. 6, 2014
  • KazuhiroTakehana1

    Dec. 5, 2014
  • kobayashikazuki

    Dec. 5, 2014
  • goyoki

    Dec. 5, 2014

WACATE2014冬の講演資料です

Views

Total views

12,103

On Slideshare

0

From embeds

0

Number of embeds

8,216

Actions

Downloads

37

Shares

0

Comments

0

Likes

18

×