๐Ÿ”ฎ NuSMV โ€“ model-based ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์„ค๊ณ„ ์ž๋™ํ™” ๋„๊ตฌ

๊น€๊ณต์˜ยท2024๋…„ 6์›” 2์ผ

how-to

๋ชฉ๋ก ๋ณด๊ธฐ
5/12
post-thumbnail

์ด ํˆด์€ ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŒ… ์ด๋ก  ์ˆ˜์—…์—์„œ ์ฒ˜์Œ ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , model-based testing์„ ์ž๋™ํ™”ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. ๊ณผ์ œ๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์› ๋Š”๋ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์šฉ์ ์ผ ๊ฒƒ ๊ฐ™์•„ ์ •๋ฆฌํ•ด๋‘”๋‹ค.

๐Ÿค” NuSMV?

NuSMV๋Š” Binary Decision Diagram(BDD)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ตœ์ดˆ์˜ ๋ชจ๋ธ ๊ฒ€์‚ฌ ๋„๊ตฌ์ธ SMV๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„, ํ™•์žฅํ•œ ๊ฒƒ์ด๋‹ค. ๋ชจ๋ธ ํ™•์ธ์„ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ CTL๊ณผ LTL ํ‘œํ˜„์‹์„ ์ง€์›ํ•œ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด Model-based testing tool์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

LTL?

LTL์€ Linear time Temporal Logic์˜ ์•ฝ์ž๋กœ, ์‹œ์ œ ๋…ผ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. True/False์— ์‹œ๊ฐ„์„ ๋„์ž…ํ•œ ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

CTL?

CTL์€ Computational Tree Logic์˜ ์•ฝ์ž๋กœ, ์‹œ์ œ ๋…ผ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค. CTL์—์„œ๋Š” ์‹œ๊ฐ„์˜ ํ๋ฆ„์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. LTL์—์„œ A์™€ E๊ฐ€ ์ถ”๊ฐ€๋œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง„๋‹ค.

Temporal logic statements

LTL

G (p->q) // G : ์‹œ๊ฐ„์˜ ํ๋ฆ„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ์ฐธ์ด๋‹ค
F (p&&q) // F : ์–ธ์  ๊ฐ€๋Š” ๊ทธ๋ ‡๋‹ค
p U q 	 // U : p๊ฐ€ true์ด๋‹ค until q๊ฐ€ true๊ฐ€ ๋  ๋•Œ๊นŒ์ง€
X p 	 // X : next step์—์„œ๋Š” ๊ทธ๋ ‡๋‹ค

CTL

AG (p->q) // A : ๋ชจ๋“  possible execution
AF (p&&q)
A (p U q)
AX p
---
EG (p->q) // E : exist, ์กด์žฌํ•œ๋‹ค
EF (p&&q)
E (p U q)
EX p

Examples : CTL

EF p์˜ ๊ฒฝ์šฐ (1), (2), (3) ๋ชจ๋‘ true์ด๋‹ค. ์–ธ์  ๊ฐ€ p๊ฐ€ ๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋ฐ˜๋ฉด AF p๋Š” (1)์—์„œ false, (2), (3)์—์„œ๋Š” true์ด๋‹ค. (1)์—์„œ๋Š” ์‹คํ–‰ ๊ฒฝ๋กœ ์ค‘ P๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (2)์™€ (3)์—์„œ๋Š” initial state๊ฐ€ P์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์‹คํ–‰ ๊ฒฝ๋กœ์ด๋“  ๋ฌด์กฐ๊ฑด P๋ฅผ ๊ฑฐ์นœ๋‹ค.

Fixed-point computation for EF

์œ„์˜ ๊ทธ๋ฆผ์—์„œ EF p = { A, B, C }์ด๋‹ค. ๊ทธ ๊ณผ์ •์„ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Calculate process : compute ฯ„^n[y] such that
ฯ„^n[y] = ฯ„^(n+1)[y], where ฯ„[y] = p โˆจ EX y

  1. ฯ„[false] = p โˆจ EX false = p -> { B } : ํ•œ ๋ฒˆ์— ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ P๊ฐ€ true๊ฐ€ ๋˜๋Š” ์ง€์ 
  2. ฯ„^2[false] = p โˆจ EX p -> { B, A } : ๋‘ ๋ฒˆ๋งŒ์— ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ P๊ฐ€ true๊ฐ€ ๋˜๋Š” ์ง€์ 
  3. ฯ„^3[false] = p โˆจ EX (p V EX p) -> { B, A, C } : ์„ธ ๋ฒˆ๋งŒ์— ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ P๊ฐ€ true๊ฐ€ ๋˜๋Š” ์ง€์ 

Fixed-point computation for EG

์œ„์˜ ๊ทธ๋ฆผ์—์„œ EG p = { A }์ด๋‹ค. ๊ทธ ๊ณผ์ •์„ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Calculate process : compute ฯ„^n[y] such that
ฯ„^n[y] = ฯ„^(n+1)[y], where ฯ„[y] = p โˆง EX y

  1. ฯ„[true] = p โˆง EX true = p -> { A, B, C } : 0๋ฒˆ next๊นŒ์ง€ P = true์ธ ์ง€์ 
  2. ฯ„^2[true] = p โˆง EX p -> { A, B } : 1๋ฒˆ next๊นŒ์ง€ P = true์ธ ์ง€์ 
  3. ฯ„^3[true] = p โˆง EX (p โˆง EX p) -> { A } : 2๋ฒˆ next๊นŒ์ง€ P = true์ธ ์ง€์ 

๐Ÿ–ฒ๏ธ Install - Mac

  1. NuSMV download link(https://nusmv.fbk.eu/downloads.html)์— ์ ‘์†ํ•œ๋‹ค.

  2. Version 2.6.0 Without ZCHAFF ํ…Œ์ด๋ธ”์—์„œ NuSMV-2.6.0-macosx64.tar.gz๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

  3. ์›ํ•˜๋Š” ํด๋”๋กœ ์˜ฎ๊ธด ํ›„ ์••์ถ•์„ ํ•ด์ œํ•ด NuSMV-2.6.0-Darwin ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.

  4. ํ•ด๋‹น ํด๋”์— ์ ‘๊ทผํ•ด NuSMV/bin/NuSMV ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.

  5. ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  NuSMV๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. NuSMV๊ฐ€ ์žˆ๋Š” ํด๋”์—์„œ NuSMV ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

  • ์ด๋•Œ NuSMV๋ฅผ ์—ด ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ์„ค์ •์—์„œ NuSMV๋ฅผ ํ—ˆ์šฉํ•ด์ค€๋‹ค.
  • Security & Privacy(๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ) > General(์ผ๋ฐ˜) > Allow Anyway๋ฅผ ์„ ํƒํ•ด ํ—ˆ์šฉํ•œ๋‹ค.
  1. ํ„ฐ๋ฏธ๋„์—์„œ NuSMV ํŒŒ์ผ์„ /usr/local/bin ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด ์‹คํ–‰ํ•œ๋‹ค. sudo mv {NuSMV path}/NuSMV-2.6.0-Darwin/bin/NuSMV /usr/local/bin ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. /usr/local/bin ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด NuSMV๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉด ์ž˜ ์„ค์น˜๋œ ๊ฒƒ์ด๋‹ค.

๐Ÿš€ How to use

Test generation through model checking

NuSMV๋Š” model checking ๊ฒฐ๊ณผ๊ฐ€ false์ผ ๊ฒฝ์šฐ counter example์„ ์ถ”์ถœํ•ด์ค€๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•ด ์ผ๋ถ€๋Ÿฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ(ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค)๋ฅผ counter example๋กœ ๊ฐ€์ง€๋Š” ๊ตฌ๋ฌธ์„ ์ž…๋ ฅํ•ด test case๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • State coverage : G (!state = S)
  • Transition coverage : G (state = N1 -> !X state = T1)
  • others(condition coverage, MC/DC coverage, etc.)

Model example - vending machine

์•„๋ž˜๋Š” ์ดˆ์ฝœ๋ฆฟ์„ ํŒ๋งคํ•˜๋Š” ์žํŒ๊ธฐ๋ฅผ model๋กœ ์ž‘์„ฑํ•œ vendingmachine.smv ํŒŒ์ผ์ด๋‹ค.

MODULE main
  VAR
   state: {Initial, Ready, Inserting, Enabled, Emitting, Returning, Final};
   amount: 0..1500;
   coin : {100, 500}; 
   event: {NONE, On, Off, Insert, Choose, Complete};
   time : 0..11;
  DEFINE
   COST:= 500;

  ASSIGN
    init(amount):= 0;
    init(time):=0;
    init(state):= Initial;
    init(event):= NONE;

    next(state):= case
        state = Initial & event = On   : Ready;
        state = Ready & event = Insert : Inserting;
        state = Ready & event = Off    : Final;
        state = Inserting & amount < 500 & time < 10 : Inserting;
        state = Inserting & amount >= 500 : Enabled;
        state = Inserting & amount < 500 & time >= 10 : Returning;
        state = Enabled & event = Choose & time < 10  : Emitting;
        state = Enabled & time >=10    : Returning;
        state = Emitting & event = Complete & amount >0 : Returning;
        state = Emitting &  amount = 0 : Ready;
        state = Returning &  amount =0  : Ready;
        TRUE                                  : state;
    esac;

    next(amount):= case
        amount + coin > 1500 : amount;
        state = Initial & event = On   : 0;
        state = Enabled & event = Choose & time < 10 & amount -COST >=0  : amount - COST;
        state = Ready & event = Insert : amount+coin ;
        state = Inserting & event =Insert &  time < 10 : amount+coin;
        state = Returning & event = Complete  : 0;
        TRUE                                  : amount;
    esac; 
    
    next(time):= case
        time +1 > 10   : time;
        state = Initial & event = On   : 0;
        state = Ready & event = Insert : 0;
        state = Inserting & event = Insert & time < 10 : 0;
        state = Inserting & time < 10 : time +1;
        state = Inserting & amount >= 500 : 0;
        state = Enabled & event = Choose & time < 10  : 0;
        state = Enabled &  time < 10  : time+1;
        state = Returning & event = Complete  : 0;
        TRUE                                  : time;
    esac; 


LTLSPEC G(state != Inserting)
LTLSPEC G(amount < 500)
LTLSPEC G(state != Enabled)
LTLSPEC G(state != Emitting)
LTLSPEC G(state != Returning)

LTLSPEC G(state = Inserting ->  X (state = Enabled))

LTLSPEC G(amount > 500 -> F (state = Enabled))
LTLSPEC G(state = Enabled -> F (state = Ready))
LTLSPEC G(state = Ready -> amount = 0)

Execute

$ NuSMV -int // interactive mode - ๋ช…๋ น์–ด ์ฐฝ ์—ด๊ธฐ
NuSMV> read_model -i {filename} // load model
NuSMV> go // execute
NuSMV> show_property // LTLSPEC ๋“ฑ์˜ property list
NuSMV> check_ltlspec -n {spec number} // ์„ ํƒํ•œ spec์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ

NuSMV> quit
NuSMV> reset

์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

model checking tool์„ ํ™œ์šฉํ•˜๋ฉด model-based testing์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ณต์žกํ•œ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ํž˜๋“ค๊ฒ ์ง€๋งŒ, ํ™•์‹คํ•œ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์‹ค๋ฌด์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.


Reference : LTL and CTL

profile
๋‚˜๋Š”์•ผ ๋งํ•˜๋Š” ๊ฐœ๋ฐœ(๊ฐ)์ž

0๊ฐœ์˜ ๋Œ“๊ธ€