MCDCカバレッジを​満たすテストケースが​、テストとして不十分​な場合があるように思​える

18 Ansichten (letzte 30 Tage)
佳樹
佳樹 am 16 Feb. 2023
Kommentiert: 佳樹 am 24 Feb. 2023
現在matlab simulinkにて、単体テストを行っております。
テストにおいて、網羅率を調査するためにMC/DCカバレッジを満たしているかをチェックしているのですが、MC/DCチェック方法を行うだけでは取りこぼしてしまうポイントがあるように思えてなりません。
具体的には、〇〇&&✕✕という条件において、MC/DC解析では、TT, Fx, TFの3パターンを行えば問題ないとなっておりますが、個人的にはTT, FT, TFの3パターンが必要であるように感じております。
例えば、以下のようなモデルを作成してみました。
入力値が、1から2に立ち上がった時に、A1ステートに移動するというモデルとなります。
また、Signal Builderは以下のようになっております。
この時、最初は入力が0であるので、in_unit_delay == 1が成り立たず、[(in_unit_delay == 1) && (in == 2)] がFxとなります。
次に、入力が1となってからしばらくの間、in_unit_delay == 1は成り立ちますがin == 2は成り立たないので、[(in_unit_delay == 1) && (in == 2)] はTFとなります。
最後に、1から2へと立ち上がる時、(in_unit_delay == 1), (in == 2)のどちらも成り立つので、[(in_unit_delay == 1) && (in == 2)]はTTとなります。
結果、この条件式は、AステートにいるときにTT, Fx, TFすべてのパターンの入力がなされるので、MC/DCカバレッジは満たされていると判断されます。
一方で、以下のようなモデルを考えます。
これは、先ほどのモデルの条件式の順番を入れ替えただけのモデルとなります。
このモデルで先ほどと同じテストを行った場合、入力が0(もしくは1)の場合、in == 2が成り立たないので、[(in == 2) && (in_unit_delay == 1)]はFxとなります。
また、1から2へと立ち上がる時、(in == 2), (in_unit_delay == 1)のどちらも成り立つので、[(in == 2) && (in_unit_delay == 1)]はTTとなります。
しかし、[(in == 2) && (in_unit_delay == 1)]がTFとなる場面は、A1ステートに移った後にしかないので、条件TFは満たされていないものと判断されてしまいます。
このような場合を回避するため、私はテストはTT, Fx, TFではなくTT, FT, TFのパターンを行うべきだと考えているのですが、なぜMC/DCカバレッジでは前者のパターンで問題ないとされているのでしょうか?

Akzeptierte Antwort

Atsushi Ueno
Atsushi Ueno am 16 Feb. 2023
こういう事ですよね
  • 3条件のANDなら (TTT, FTT, TFT, TTF)、4条件のANDなら (TTTT, FTTT, TFTT, TTFT, TTTF)、5条件...
  • 3条件のANDなら (TTT, Fxx, TFx, TTF)、4条件のANDなら (TTTT, Fxxx, TFxx, TTFx, TTTF)、5条件...
>なぜMC/DCカバレッジでは前者のパターン (TT, Fx, TF) で問題ないとされているのでしょうか?
  • C言語では「短絡評価」(&&の条件は左から順に評価される) が規定されているからです
  • MC/DCカバレッジは「複数の入力条件がそれぞれ独立して出力に影響を与えるか」が判れば良いのです
>〇〇&&✕✕という条件において、MC/DC解析では、TT, Fx, TFの3パターンを行えば問題ないとなっておりますが、個人的にはTT, FT, TFの3パターンが必要であるように感じております。
  • 下記の意味では同意です
  • 全条件を揃えてから1条件ずつ順に (TT⇒FT⇒TT⇒TF) とするのが分かり易く間違い難いから
  • 「短絡評価」が規定されていない環境なのに、同じ方法 (TT, Fx, TF) でテストして失敗する可能性があるから
  • (※信頼性のあるツールで自動化されたテストなら絶対に間違えないのでこれらの点は心配無用です)
>[(in == 2) && (in_unit_delay == 1)]がTFとなる場面は、A1ステートに移った後にしかない
そんな事はありません。Signal Builderの信号の動きを0⇒2⇒1等とすれば、Aステートのまま [(in == 2) && (in_unit_delay == 1)] を TF とする事が出来ます。実際には in の値域が 0 ~ 2 で、1 ずつインクリメントする動きしか起こり得ないのかも知れませんが、単体テストにおいて信号の値域や動きを制約する必要は無く、当該ロジックはどちらの順序でAND条件判断してもMC/DCカバレッジを満たします。
あと、なにも状態遷移ロジックを一度に一筆書きでテストする必要はありません。質問のモデルにおける状態遷移はAステート⇒A1ステートの一方通行なので尚更です。テストを複数回に分け、各テストケースが通った道を合わせた結果がカバレッジを満たせばOKです。
  5 Kommentare
佳樹
佳樹 am 24 Feb. 2023
返信が遅くなってしまい、申し訳ございません。
>巷の形式手法ツールより使い易いのですが私も使いこなせません。形式手法は敷居が高いです。使いこなせば完璧で最強の方法です。
「形式手法」という方法があるのですね、初めて拝見いたしました。
リンクを添付していただいた資料を拝見しましたが、内容が難しく、少なくともすぐには理解が出来なさそうな内容でした。
仮に私が理解できたとしても、この手法を大規模開発の現場において浸透させるのは、なかなか難しいように感じました。
>はい。取り挙げた論文「Monte-Carlo法に基づいたテスト自動生成ツール」でも「7.関連ツール」において比較対象として T-VEC Tester for SimulinkReactis を取り挙げています。
ReactisとT-VEC Tester for Simulinkがそれにあたるものだったのですね、資料の読み込み不足でした。
私の開発現場において、Reactisが使用可能でしたので試してみたのですが、謎のエラーによって使用することができませんでした、、、
Reactisのバージョンが2018のものと古いものだったということもあるかもしれませんが、Reactisについての資料がほとんどない、Reactisの発行元となるReactive Systems社が日本にない等、使用していくうえで不便であるように感じ、このツールを今後使用するのはなかなか難しいように感じました。
また、T-VEC Tester for Simulinkに関しては、現在使用することができない環境にあるため試せておりませんが、こちらのソフトウェアに関しても資料に乏しく、Reactisと同様使用するのが難しいような気がしました。
>YES/NOです。モンテカルロ法によるテストケースの自動生成ツールに丸投げ出来るのはカバレッジ計測(の為のテストケース生成)です。これまでに挙げた様な問題を解消する必要がありますが、ビルド時にカバレッジ計測を自動化する事は可能です。一方、モンテカルロ法では演算結果の期待値を自動生成する事は出来ません。
承知いたしました。
テストにおいては、MC/DCカバレッジを見るテストと、境界値分析を行うテストは分けた方がよさそうですね、参考になりました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!