More Related Content
Similar to モデル検査入門 #wacate
Similar to モデル検査入門 #wacate(20)
More from Kinji Akemine(9)
モデル検査入門 #wacate
- 2. + 自己紹介
所属
某豊洲のSIer勤務
〜2014.3
テストプロセスおよびツールの研究開発
2014.4〜
アジャイルプロセスおよびツールの研究開発
WACATE実行委員会
テスト自動化研究会
Nippon Enterprise Agile Transformation
専門
テスト分析・設計方法論
スクラム
2
WACATE 2014 Winter 2014/12/06
- 3. + 【宣伝1】テスト自動化研究会
隔月でオフライン研究会を実施中
https://sites.google.com/site/testautomationresearch/
活動内容
本読み/翻訳
ツール紹介
カンファレンス運営
スキル標準整備…etc
3
WACATE 2014 Winter 2014/12/06
- 7. + 目次
1. 設計に対する「テスト」
2. モデル
3. モデル検査
4. モデル検査の実施例
5. 活用ポイント
6. 様々なモデル検査ツール
7. まとめ
7
WACATE 2014 Winter 2014/12/06
- 9. + 1.1. 開発プロセスにおけるテスト
テスト(testing)の定義by JSTQB
9
全てのライフサイクルを通じて実施する静的、動的なプ
ロセスにおいて、成果物が特定の要件を満足するかを判
定し、目的に合致することを実証し、欠陥を見つけるた
め、ソフトウェアプロダクトや関連成果物に対し、計画、
準備、評価をすること。
WACATE 2014 Winter 2014/12/06
- 10. +
1.2. 狭義/広義のテスト
要件
定義
レビューレビューレビュー
ソース
コード
設計実装テスト
要件
定義書
狭義のテスト
設計書
静的解析
実装後の「テスト」工程を指すことが多い
広義のテスト
ソース
コード
(修正)
実装以前工程の「レビュー」や「静的解析」も含む
10
テスト
結果
モデル検査もここ
WACATE 2014 Winter 2014/12/06
- 11. + 1.3. レビューの種類
様々な種類が存在
インスペクション
テクニカルレビュー
ウォークスルー
レビューにおける指摘
表現不備
設計不備…etc
11
詳しくは明日の
レビューセッションで!!
WACATE 2014 Winter 2014/12/06
- 12. + 1.4. レビューの自動化
表現不備の発見
文法
ゆらぎ
Microsoft Wordによるチェック
設計(実装)不備発見
漏れ
誤り
12
Eclipseによるチェック
WACATE 2014 Winter 2014/12/06
- 13. + 1.5. モデル検査
レビューの自動化技術の一種
レビュー対象は「モデル」
2章で解説
モデルが「仕様」を満たすかどうかを「検査」
13
3章で解説
WACATE 2014 Winter 2014/12/06
- 14. +
2. モデル
WACATE 2014 Winter 2014/12/06
14
- 15. + 2.1. モデルとは
15
開発対象のシステム(=テスト対象)の振る舞い
や性質を特定の観点で抽象化して表現したもの
状態遷移モデル
アクティビティモデル
WACATE 2014 Winter 2014/12/06
- 16. + 2.2. モデルの種類
様々な観点によるモデリング手法が存在
状態遷移モデル
論理モデル
組合せモデル
フローモデル
代数モデル
統計モデル…etc
16
WACATE 2014 Winter 2014/12/06
- 17. + 2.3. モデルを扱う際の注意点
17
ひとつのモデルで全て仕様を表現するのは不可能
無理に様々な情報を込めようとすると肥大化
可読性の低下
変更容易性の低下
観点を絞ったシンプルな抽象化が重要
データモデルの状態変化に着目
性能の変化に着目…etc
WACATE 2014 Winter 2014/12/06
- 18. + 2.4. 状態遷移モデル(1/3)
18
システムの状態変化に着目してシステムの振る舞
いをモデリング
モデル検査は状態遷移を検査対象とすることが多い
構成要素
様々な書き方が存在
基本的な構成要素は以下の通り
事前状態
変数:x,y
事後状態
変数:x,y
イベント[遷移条件]
/アクション
WACATE 2014 Winter 2014/12/06
- 19. + 2.4. 状態遷移モデル(2/3)
構成要素
19
構成要素説明
状態ある時点でのシステムの状態を表現。
初期状態特殊な状態。モデルで表現したい状態遷移の
開始時点を表現。
終了状態特殊な状態。モデルで表現したい状態遷移の
終了時点を表現。なくてもよい。
状態変数状態の細かなバリエーションを表現するため
の変数。アクションによって変化する。
イベント状態遷移が発生するきっかけ。
遷移条件状態遷移の分岐条件。
アクション状態遷移の結果、システムに発生する状態遷
移以外の変化。なくてもよい。
WACATE 2014 Winter 2014/12/06
- 22. + 3.1. モデル検査とは
22
モデルが「仕様」を満たしているかどうかを検査
満たさない場合、具体的な満たさない振る舞いの
パターン=反例を示す
WACATE 2014 Winter 2014/12/06
- 24. + 3.2.1. 検査したい仕様
24
「会員はアカウントロックのままにはならない」
アカウントロック状態になったらそのうち別状態になる
この仕様は満たされない
アカウントロック状態から抜け出すには明示的にロック
解除イベントが必要
ロック解除イベントが実施されない場合、アカウント
ロック状態のまま
WACATE 2014 Winter 2014/12/06
- 25. + 3.2.2. 検査の仕方
25
イベント(会員の行動)を発生する状態遷移モデ
ルを作成
「ロック解除をする」か
「何もしない」をランダムに実行
WACATE 2014 Winter 2014/12/06
- 29. + 3.2.6. モデル検査ツールがやること
29
3.2.4.や3.2.5.のような遷移パターンを自動で網
羅的に探索
網羅した結果、3.2.5のような反例があれば提示
反例がない場合は仕様を満たす
WACATE 2014 Winter 2014/12/06
- 30. + 3.3. ところで「仕様」とは?
なんでも検査できるわけではない
時相論理で表現可能なものを扱うことが多い
時間の概念を取り入れた論理表現
基本的には以下の3種類
常にxxxだ
常にラーメンが食べたい
いつかxxxになる
いつかラーメンが食べたくなる
xxxになるまでyyyだ
ラーメンを食べるまではラーメンが食べたい
30
WACATE 2014 Winter 2014/12/06
- 31. + 小演習:プチモデル検査をしてみよう
31
一度ラーメンを食べたくなったら永久にラーメン
を食べたい
塩ラーメン
が食べたい
醤油ラーメン
が食べたい
何も食べた
くない
WACATE 2014 Winter 2014/12/06
- 35. +
3.4. 動的テストとの比較
互いにメリット/デメリットがある
モデル検査動的テスト
網羅性網羅的部分的
厳密性厳密不確実
容易性難易
検査対象の規模小規模大規模
利用実績少多
35
モデル検査の優位な点が要求される局面が使い所
となる
WACATE 2014 Winter 2014/12/06
- 36. + 3.5. モデル検査の種類
設計モデル検査
36
主に先述の例のような相互作用する状態遷移モデルに対
して検査を実施
実装モデル検査
主にマルチスレッドなソースコードの実行パターンに対
して検査を実施
WACATE 2014 Winter 2014/12/06
- 38. + 4.1. 設計モデル検査の例
Spin
もっとも古典的で有名なモデル検査ツールのひとつ
日本語で得られるモデル検査ツールの情報の大半はSpin
状態遷移モデルをPromelaという
C Likeな独自言語で記述
文法が少し似ているだけ
パラダイムは全く別
38
WACATE 2014 Winter 2014/12/06
- 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. + 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. + 4.2. 実装モデル検査の例
Java Path Finder
41
NASAが宇宙探索機ソフトウェアの検証のために開発し
たJavaプログラムの検査ツール
statement実行ごとに状態を記録/仕様の充足を確認
OKなら次に起こり得る状態の一覧を作成したうえで、深さ優先探
索で次の実行パターンを検査
NGならそこに至る実行過程を反例として示す
WACATE 2014 Winter 2014/12/06
- 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. + 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
- 45. + 5.1. 使い所
モデル検査の優位性
網羅性
厳密性
網羅性が求められる局面
45
複雑な非同期/並行システムにおいて、レアケースを特
定するような検査
厳密性が求められる局面
障害によって人命や巨額な資産を損なうようなシステム
の検査
WACATE 2014 Winter 2014/12/06
- 46. + 5.2. 注意点
計算量の爆発
46
遷移パターンが発散するようなモデルを書くとすぐに状
態爆発をして検査が終わらなくなる
関心ごとを絞ったシンプルなモデリングを行う
モデルおよび仕様の実装誤り
設計を忠実に再現した(検査可能な)モデルや仕様を書
くのがそもそも困難
Try & Errorを繰り返しながら洗練させていくしかない
WACATE 2014 Winter 2014/12/06
- 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
- 49. + 6.1. Alloy
この頃流行りのモデル検査ツール
集合と制約によってモデルを記述
文法が(比較的)直感的
反例の表示もグラフィカルでわかりやすい
49
WACATE 2014 Winter 2014/12/06
- 50. + 6.2. CBMC
C/C++のモデル検査
gccおよびVisualStudioで動作
コードに対して以下を検査可能
配列溢れ
ポインタの安全性
例外の発生やユーザ定義のアサーション
50
WACATE 2014 Winter 2014/12/06
- 51. + 6.3. ESC/Java
Javaのモデル検査
51
JMLによってアノテーションとして定義された仕
様を検査可能
JML:Java Modeling Language
Java向けの契約プログラミングツール
各メソッドの事前/事後条件や普遍条件を記述
実行時に条件違反を検知
ESC/JavaはJML違反をプログラムの実行時ではなく静
的解析によって検査
WACATE 2014 Winter 2014/12/06
- 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. +
7. まとめ
WACATE 2014 Winter 2014/12/06
53
- 54. + 7.1. モデル検査
レビューの自動化技術の一種
振る舞いの妥当性を検査
検査対象は主に状態遷移モデル
相互作用する状態遷移モデル
マルチスレッドプログラムの実行状態パターン
検査仕様は主に時相論理
常にxxxだ
いつかxxxになる
xxxになるまでyyyだ
54
WACATE 2014 Winter 2014/12/06
- 55. + 7.2. モデル検査の活用
動的テストとの違い
モデル検査動的テスト
網羅性網羅的部分的
厳密性厳密不確実
容易性難易
検査対象の規模小規模大規模
利用実績少多
網羅性や厳密性が求められる局面で活用
55
活用の際は状態爆発に気をつけながら段階的にモ
デルを洗練させていく
WACATE 2014 Winter 2014/12/06