コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ホワイトボックステストにおける制御フローテストに関してざっくりまとめる

制御フローテストとは

制御フローテストはホワイトボックステストの一種で、文字通り「制御のフロー」をテストするもの。プログラムにおいて、ソースコードの処理そのものを網羅するテストのことを指すことが多い。網羅に関しての基準がいくつかあるため、基準の名前を交えながら説明していく。

制御フローテストにおける網羅の種別

以下のRubyの2つのメソッドのデモコードでどの範囲を網羅するものなのかを説明します。

def single_test(value_a)
  if value_a > 10
    print "over 10"
  end

  print "end"
end
def twin_test(value_a, value_b)
  if (value_a > 5 && value_b > 20)
    print "double match"
  else
    print "not double match"
  end
end

命令網羅 (Statement Coverage)

命令網羅は文字通り、すべての行が実行され網羅できているかを確かめるテスト。

single_test の場合は 10以上の値をセットして実行すればOKなので single_test(11) などを実行すれば満たせる twin_test の場合はifの分岐を両方通るようにすればいいので、 twin_test(0,0)twin_test(100,100) を実行すれば満たせる。

判定網羅(Decision Coverage)

判定網羅は判定文の条件をすべて網羅していることを確認するテスト。

twin_test を例に上げると、if (value_a > 5 && value_b > 20) がtrueとfalseのときのテストをすることが必要なので、 twin_test(0,1)twin_test(10,30) のように判定の真偽を両方実行できればOK

条件網羅 (Condition Coverage)

条件網羅は判定文の条件が網羅できているかのテストです。

twin_test の場合、 value_a > 5value_b > 20 という2つの条件があるため、この2つの条件文の真偽を両方確かめることができていればOK

複合条件網羅 (Multiple Condition Coverage)

複合条件網羅は「複合条件」における条件設定を網羅していることを確認するテスト。条件内の値に着目するのではなく条件の状態に着目して網羅する。

twin_test の場合、value_a > 5value_b > 20 この2つの条件、つまり複合の条件を網羅する。たとえばvalue_a > 5 が条件1、value_b > 20が条件2としたときに以下の4つの状態をテストすれば網羅できる

  • 条件1が真 、 条件2が真
  • 条件1が真 、 条件2が偽
  • 条件1が偽 、 条件2が真
  • 条件1が偽 、 条件2が偽

なので以下のような値のテストをすれば複合網羅条件はクリアとなる

条件 value_a value_b
真&真 10 30
真&偽 7 11
偽&真 3 24
偽&偽 2 10

MC/DC網羅(Modified Condition/Decision Coverage)

MC/DC網羅は条件分岐のパターンを網羅していることを確認するテスト。なお、MC/DCは Modified Condition/Decision Coverage の略。複合条件網羅では各条件の真偽を確認したが、こちらは更に引いて複合条件の条件文そのもので発生するパターンのみにする。

twin_test の場合、

if (value_a > 5 && value_b > 20)
  print "double match"
else
  print "not double match"
end

とあるように value_a > 5 && value_b > 20 を満たすときと満たさない時で分岐するのでそこに着目してテストケースを考えます。たとえばvalue_a > 5 が条件1、value_b > 20が条件2としたときにMC/DCで考えるべきは以下の3つのケースになります。

  1. 条件1も条件2のときに満たす処理があるので「条件1が真 、条件2が真」のケース
  2. 条件1は満たすが、条件2を満たさないときにelse以降の処理にいく必要があるので「条件1が真、条件2が偽」のケース
  3. 条件1が満たせていないとelseにいくのでその流れを確かめるケース。具体的には条件1が偽であればいいので、「条件1が偽、条件2が真」あるいは「条件1が偽、条件2が偽」のケースのいずれか。

そのため一覧化すると以下のようになる

条件 value_a value_b
真&真 6 30
真&偽 7 11
条件1が偽 3 24

このように条件1が偽であれば、条件2の状態別のチェックは省略するというようなコンセプトのものがMD/DC網羅になる。

関連リンク