ソフトウェアの品質を学びまくる2.0

旧ブログからゆっくり移行中です。http://blog.livedoor.jp/prjmng/

コードカバレッジについて、また考える - その2

 その1の続きです。その2では、「LCSAJ」と「経路網羅」について書きます。

www.kzsuzuki.com

コードの中で、ジャンプする

LCSAJ

 LCSAJは「Linear Code Sequence And Jump」の略。読み方がわからない。
 LCSAJのJはジャンプ。FORステートメントにおいて最後の行に達して最初の行に戻るジャンプや、IFステートメントで条件を満たさなかったことによって一連の行をすっ飛ばすジャンプなどを指しています。
 ジャンプするまで続く直線的なコードのカタマリを、「linear sequence」(LS)と呼んでいます。シラバスの中では「線形連鎖」という訳が与えられていますが、うーんピンと来ない。端的に言うと、飛ばずにつながっている一連のコード断片、ということです。

 LCSAJは、以下の3つの組み合わせで表現されます。

  1. LSの始まり(コード自体の始まりか、あるLSからのジャンプ先)
  2. LSの終わり(あるLSへのジャンプ元か、コード自体の終わり)
  3. ジャンプ先

 Wikipediaにある、BS7925-2のコードを見てみます。

 10行目から見ていきます。

 最初にぶつかる分岐は、17行目のwhileです。ここでループ内に突入しない場合は、28行目までジャンプするわけです。よってここでのLCSAJは、(10, 17, 28)と表現することができます。
 一方ループに突入すると、次の分岐は21行目のif文。ここで判定が偽であれば25行目にジャンプし、真であればwhileループの最初にジャンプするので、それぞれ(10, 21, 25)、(10, 26 , 17)となります。
 10行目から始まるLCSAJは、以上の3つがあるということです。

 次に、それぞれのジャンプ先からスタートするLCSAJを考えることになります。
 たとえば(10, 26, 17)は17行目で終わるので、17行目から始めるLCSAJを探します。その1つは、whileループに突入し、21行目のif文が偽になって25行目にジャンプする、(17, 21, 25)。
 LCSAJでのカバレッジとは、このように洗い出したLCSAJを、テストケースでいくつ網羅したかで計算します。ifやwhileでの判定結果のパターンをすべて拾っているので、LCSAJカバレッジが100%なら、判定網羅も100%になります。

経路網羅

 LCSAJで、コード内でのジャンプ、特に前方に舞い戻っていくジャンプを考慮していることはわかりました。でも、ループって、戻りのジャンプが1回とは限らないわけで。
 上のコードで、たとえばwhileのループが最大2回だったとしても、

  1. 一度もループに入らない
  2. 一度だけループに入る。ifの判定パターンは21個。
  3. 二度ループに入る。ifの判定パターンは22

の7経路があります。7は22+1-1であり、経路の数が、ループの回数に対して指数関数的に増えていくことがわかりますね。この経路をいくつ網羅しているかが、経路網羅です。
 LCSAJのカバレッジでは、上の(1)(2)を行えばカバレッジが100%になりますが、経路網羅だと50%もないという悲しい現実に直面します。この果てしなさは、以下の記事に端的に書かれています。

monoist.atmarkit.co.jp

航空関連システム(アビオニクスシステム)では

 RTCA DO178は、民間航空機に関するソフトウェアの認証規格です。  この中で、致命度レベルが最高のA(大惨事)とされるソフトウェアに求められるコードカバレッジは、(1)命令網羅 (2)判定網羅 (4)条件判定網羅の3つ。2つのテストケースでカバレッジ100%になる(3)条件網羅なんて相手にされてませんね。

 ただ先の論文によると、

RTCAは、これらのテスト網羅度は、故障が人命に係わる航空機ソフトウェアのテスト時に使用するテスト網羅度として不十分、と判断した・・・(中略) 故障が人命に係わるレベルAのソフトウェアに対し、MC/DC100%を満たすテストをすることを求めている。近年、信頼性向上を求める動きが高まり、車載ソフトウェアなどの航空機ソフトウェア以外の組込みソフトウェアでも、MC/DCが注目されている。

とあります。これは知っておいていいでしょうね。

 ちなみにwikipediaによるとAvionicsとは

航空(Aviation, アビエーション、エイヴィエーション)と電子機器(electronics, エレクトロニクス)から合成された用語

だそうです。さらに、avisはラテン語で、birdの意味。aviationという言葉はそこから来ているのだそうですよ。

 以上、Advancedシラバスで言及されているコードカバレッジについてでした。

参考文献