【文献】
徳本 晋 他,C/C++シンボリック実行ツールKLEEの適用とCPPUNIT連携ツールの開発,情報処理学会 組込みシステムシンポジウム 2011,日本,情報処理学会,2011年10月12日,第23-1頁−第23-8頁
(58)【調査した分野】(Int.Cl.,DB名)
前記変換部は、前記PLCプログラムにおけるコメントに含まれる第1文字列を、前記汎用言語プログラムを実行する前提条件を示す記述に変換し、前記PLCプログラムにおけるコメントに含まれる第2文字列を前記汎用言語プログラムの実行後に満たされるべき条件を示す記述に変換し、
前記試験実行部は、前記汎用言語プログラムへの入力が前記入力の条件を満たし、かつ、前記汎用言語プログラムの出力が前記出力の条件を満たさない場合をエラーとして検出する、
請求項1または請求項2に記載のソフトウェア試験装置。
前記試験実行部は、前記PLCプログラムにおけるパスのうち指定されたステップ数以下のパスの各々について、当該パスを実行した場合の変数値を前記汎用言語プログラムを用いて算出し、いずれかのパスにおける変数値が前記PLCプログラムで示された条件を満たさない場合をエラーとして検出する、
請求項1から5のいずれか一項に記載のソフトウェア試験装置。
前記変換部は、前記PLCプログラムにおけるサブルーチンコールを前記汎用言語プログラムにおける記述に変換する場合、前記PLCプログラムで呼び出されるサブルーチンに示されている入口条件を、前記サブルーチンコール時の条件としてサブルーチン呼出側の汎用言語プログラムに含め、前記PLCプログラムで呼び出されるサブルーチンに示されている出口条件を、前記サブルーチンコールからの復帰時の条件としてサブルーチン呼出側の汎用言語プログラムに含め、
前記試験実行部は、前記サブルーチンコール時の条件及び前記サブルーチンコールからの復帰時の条件を用いて前記サブルーチン呼出側の汎用言語プログラムを単体試験する、
請求項1から9のいずれか一項に記載のソフトウェア試験装置。
【発明を実施するための形態】
【0021】
以下、本発明の実施形態を説明するが、以下の実施形態は請求の範囲にかかる発明を限定するものではない。また、実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1は、本発明の実施形態に係るソフトウェア試験装置の機能構成を示す概略ブロック図である。
図1に示すように、ソフトウェア試験装置100は、通信部110と、表示部120と、操作入力部130と、記憶部170と、制御部180とを備える。制御部180は、変換部181と、試験実行部182とを備える。
【0022】
ソフトウェア試験装置100は、PLCで実行されるプログラムに対してバグの検出等の試験(テスト)を行う。以下では、PLCで実行されるプログラムをPLCプログラムと称する。また、PLCプログラムのソースコードの記述言語をPLC言語と称する。PLC言語として、例えばラダー(Ladder;LD)言語、シーケンシャルファンクションチャート(Sequential Function Chart;SFC)、ファンクションブロックダイアグラム(Function Block Diagram;FBD)、及び、ストラクチャードテキスト(Structured Text;ST)を挙げることができる。ラダー言語は、ラダーロジック又は単にラダーとも称される。ファンクションブロックダイアグラムは、ファンクションブロックとも称される。
但し、ソフトウェア試験装置100が試験対象とするプログラミング言語はこれらに限らず、PLCで実行されるプログラムの記述言語であればよい。
【0023】
PLCプログラムの場合、以下の点で、複雑なプログラムの試験を十分に実行することができない。
(1) 網羅的な試験を実施することができない。
一般的なプログラムの開発では、プログラムを含むシステムの試験は、単体試験、組み合わせ試験、ハードウェア結合試験、システム試験というように、小さな単位から順に行われる。
【0024】
単体試験では、例えばサブルーチン毎などプログラムの部品毎に試験が行われる。組み合わせ試験では、メインルーチンからサブルーチンを呼び出すなど、プログラムの部品を複数組み合わせて試験が行われる。ハードウェア結合試験では、実機ハードウェアにプログラムを搭載して試験が行われる。ここでいう実機ハードウェアは、システムで実際に用いられるハードウェアである。システム試験では、システム全体の動作試験が行われる。
これに対してPLC言語の場合、一般的には単体試験及び組み合わせ試験を行う環境が整っていない。このため、PLCプログラムの試験では、はじめから実際のPLCを用いたシステム試験が行われることが多い。この場合、単体試験等については、システム試験の中でシステムの一部の機能を制限して仮想的に行われる程度である。
【0025】
一般的なプログラムの開発における単体試験では、ソースコード全体に対するカバレッジが可能な限り100%に近づくようテストケースを設定するホワイトボックス試験が行われることが多い。ここでいうテストケースは、プログラムへの入力の組み合わせである。プログラムのパスをなるべく全て漏れなく通るように入力の組み合わせを選択することで、カバレッジを高めることができる。
【0026】
試験対象のプログラムが複雑でテストケースが膨大となった場合、自動単体テスト、テストケースの自動生成、証明技術によるバグの検証等の技術が用いられる。自動単体テストでは、自動的に設定された多数のテストケースを試験環境が自動実行する。ここでいう試験環境は、デバッグソフトウェアを実行するコンピュータなど、試験を行うためのシステムである。テストケースの自動生成では、試験環境が、記号実行法などを用いて高カバレッジを達成するためのテストケースを自動生成し、生成したテストケースを用いた試験を自動実行する。証明技術によるバグの検証では、試験環境がプログラムを論理的に解析し、バグの検出、またはバグの有無の判定を行う。
【0027】
これに対しPLCプログラムの場合、上記のように一般的には単体試験が行われず、従って、単体試験におけるホワイトボックス試験も行われない。特に、PLCプログラムの場合、上記のように単体試験等を行う環境が整っていないため、自動単体テスト、テストケースの自動生成、証明技術によるバグの検証等の技術を適用することが困難である。
単体試験におけるホワイトボックス試験が行われないことで、プログラム中に試験が行われていないパスが残り、このパスにバグが残存することが考えられる。この点で、PLCプログラムの場合、複雑なプログラムの試験を十分に実行することができない。
【0028】
(2) PLCプログラムを試験する手法が限定される。
C言語など汎用言語のプログラムをパソコン(Personal Computer;PC)など一般的なコンピュータで試験する場合、例えばステップ実行、変数値のモニタリング、変数値を上書きしてのプログラムの実行などいろいろな手法を用いることができる。ここでいう汎用言語は、特定の用途に特化されていない言語である。また、ここでいう一般的なコンピュータは、特定の用途に特化されていないコンピュータである。
【0029】
上述した汎用言語のプログラムを一般的なコンピュータでデバッグする場合とは異なり、一般的にはPLCではプログラム試験のための機能及びコマンドが十分に用意されておらず、PLCプログラムを試験する際に使用可能な手法は限定される。また、汎用言語の場合とは異なり、PLCプログラムを一般的なコンピュータで試験するためのソフトウェアも一般的には知られていない。この点でも、PLCプログラムを試験する際に使用可能な手法は限定される。
このように、PLCプログラムを試験する際に使用可能な手法が限定される点で、複雑なプログラムの試験を十分に実行することができない。
【0030】
このように、PLCプログラムの場合、複雑なプログラムの試験を十分に実行することができないという問題点に対し、ソフトウェア試験装置100は、(PLC言語で記述されている)PLCプログラムのソースコードを一般的なコンピュータ上で汎用言語のソースコードに変換して試験を行う。すなわち、ソフトウェア試験装置100はソースコードレベルでPLCプログラムを汎用言語プログラムに変換し、得られた汎用言語プログラムに対して試験を行う。これにより、ソフトウェア試験装置100では、既存のいろいろなソフトウェアを用いてプログラムの試験を行うことができる。
【0031】
例えば、ソフトウェア試験装置100がパソコン上でSTプログラムのソースコードをC言語のソースコードに変換することで、C言語のソースコードをパソコン上で試験するための既存ソフトウェアを用いることができ、この点で、複雑なプログラムの試験を十分に実行できる。
さらにソフトウェア試験装置100は、後述するようにデバッグの精度を高めるための機能を提供する。
【0032】
以下では、ソフトウェア試験装置100がパソコンを用いて構成され、かつ、ソフトウェア試験装置100がST(ストラクチャードテキスト)のソースコードをC言語のソースコードに変換する場合を例に説明する。但し、ソフトウェア試験装置100は、構成する一般的なコンピュータはパソコンに限らず、汎用言語のプログラムの試験のための既存ソフトウェアを適用可能なコンピュータであればよい。また、ソフトウェア試験装置100が対象とするPLC言語はSTに限らず、いろいろなPLC言語とすることができる。ソフトウェア試験装置100がPLCプログラムを変換する言語はC言語に限らず、この言語のソースコードの試験を行うための既存ソフトウェアを利用可能な言語であればよい。
【0033】
通信部110は、他の機器と通信を行う。例えば、通信部110が、PLCプログラムのエディタとして用いられているコンピュータから試験対象であるSTのソースコードを受信するようにしてもよい。
表示部120は、液晶パネル又はLED(Light Emitting Diode)パネル等の表示画面を備えて各種画像を表示する。
操作入力部130は、例えばキーボード及びマウス等の入力デバイスを備えてユーザ操作を受ける。
【0034】
記憶部170は、各種データを記憶する。例えば、記憶部170は、試験対象であるSTのソースコード、このソースコードに対して変換部181が構文解析を行うための文法定義、構文解析にて得られた構文木、変換部181がSTのソースコードを変換したC言語のソースコード等を記憶する。
記憶部170は、ソフトウェア試験装置100が備える記憶デバイスを用いて構成される。
【0035】
制御部180は、ソフトウェア試験装置100の各部を制御して各種処理を実行する。制御部180は、ソフトウェア試験装置100が備えるCPU(Central Processing Unit、中央処理装置)が記憶部170からプログラムを読み出して実行することで構成される。
変換部181は、STのソースコードをC言語のソースコードに変換する。
試験実行部182は、変換部181の変換によって得られたC言語のソースコードに対する試験を行う。C言語のソースコードとSTのソースコードとは構文木が共通しており、C言語のソースコードの各部はSTのソースコードの各部と対応付けられる。従って、C言語のソースコード上でバグの位置を特定できればSTのソースコード上でのバグの位置を特定することができる。
【0036】
図2は、ソフトウェア試験システム1がPLCプログラムの試験を行う処理手順の例を示す図である。
図2の例で、変換部181は、パーサジェネレータ191、パーサ192、及び、C言語生成器193として機能する。
パーサジェネレータ191は、記憶部170が記憶している文法定義を参照してパーサ192を生成する。記憶部170が記憶している文法定義はBNF(Backus Naur Form)で記載されていてもよいが、特定の表現形式のものに限定されない。
【0037】
STのソースコードが変換部181に入力されると、パーサ192がこのソースコードの構文解析を行って構文木を生成する。STのソースコードが変換部181に入力される毎にパーサジェネレータ191がパーサ192を生成する必要はなく、同一のパーサ192が繰り返し構文解析を行えばよい。
パーサ192が構文木を生成すると、C言語生成器193が、この構文木を用いてC言語のソースコードを生成する。
試験実行部182は、C言語生成器193が生成したC言語のソースコードに対して試験を行い、試験結果をレポートとして出力する。
【0038】
図3は、ソフトウェア試験装置100によるプログラム変換の第1例を示す図である。
図3の例で、STのソースコードC11は、変換部181による変換前のソースコードであり、C言語のソースコードC12は、変換部181による変換後のソースコードである。変換部181は、STのIF文、CASE文、FORループを、それぞれC言語のIF文、CASE文(SWITCH文)、FORループに変換するといったように、STのソースコードと同等の動作を示すC言語のソースコードを生成している。
【0039】
以上のように、変換部181は、ソースコードレベルでPLCプログラムを汎用言語プログラムに変換する。そして、試験実行部182は、変換にて得られた汎用言語プログラムに対する試験を行う。
変換部181が、PLCプログラムを汎用言語プログラムに変換することで、汎用言語プログラム用の既存のテストツールを用いて効率的に試験を行うことができる。例えば、変換部181が、パソコン上でSTのソースコードをC言語のソースコードに変換することで、C言語用の既存のテストツールを用いて効率的に試験を行うことができる。
【0040】
ここで、変換部181が、STのソースコードにおけるコメントに含まれる記述の一部をC言語のソースコードで実行対象となる記述に変換するようにしてもよい。
図4は、ソフトウェア試験装置100によるプログラム変換の第2例を示す図である。
図4の例で、STのソースコードC21は、変換部181による変換前のソースコードであり、C言語のソースコードC22は、変換部181による変換後のソースコードである。
【0041】
変換部181は、STのソースコードのうち平方根の計算を示す行L112を、C言語のソースコードで同等の処理を行う行L122に変換している。加えて、変換部181は、STのソースコードC21のコメントを、C言語のソースコードC22で実行対象の記述に変換している。
STのソースコードC21で、行L111及びL113の括弧及びアスタリスクで挟まれた記述(「(* ・・・ *)」はコメントとして扱われる。従って、STのソースコードC21では、行L111、L113はいずれも実行対象外である。これに対し、変換部181は、行L111を行L121から始まるIF文に変換し、行L113を行L123から始まるIF文に変換している。
【0042】
行L111の「#ASSUME」及び条件式の記述は、ソフトウェア試験装置100では事前条件を示す。ここでいう事前条件は、例えばサブルーチンが呼び出された際のサブルーチンコールにおける引数値の条件及びグローバル変数値の条件など、プログラムを実行する前提条件である。
図4の場合、行L112の関数Sqrtは、実数の平方根を演算する関数である。従って、この関数の引数xの値は0以上であることが前提条件となる。従って、行L111では、事前条件としてx≧0が示されている。
【0043】
また、行L113の「#ASSERT」及び条件式の記述は、ソフトウェア試験装置100では事後条件を示す。ここでいう事後条件は、例えばサブルーチンコールの戻り値が満たすべき条件など、プログラムの実行後に満たされるべき条件である。
図4の例の場合、関数Sqrtが正常に実行された場合、演算結果を示す変数yの値は0以上となるはずである。従って、行L113では、事後条件としてy≧0が示されている。
【0044】
ソフトウェア試験装置100は、プログラムの試験の際、事前条件が成立し、かつ、事後条件が成立しない場合にバグがあると判定する。事前条件が成立しない場合、事後条件が成立する場合のいずれも、バグがあるとは判定しない。
かかる試験を行うために、変換部181は、STのソースコードのコメント内に「#ASSUME」の記述がある場合、この記述を(コメントではなく)実行対象として事前条件を示す記述に変換する。
【0045】
図4の例の場合、変換部181は、行L111を、行L121から始まるIF−ELSE文に変換している。そして、変換部181は、このIF−ELSE文のTHENに、ソースコードC21の実体的部分である行L112に対応する行L122を設けている。ここでいうIF−ELSE文のTHENは、IF条件成立の場合に実行される部分である
また、変換部181は、ELSEの場合をRETURNにしている。RETURNは、このプログラムを終了することを示し、メインプログラムから呼び出されている場合は呼び出し元へ復帰することを示す。なお、ソースコードC22で「//」からその行末までは、コメントとして扱われ、実行対象にはならない。
【0046】
試験実行時に試験実行部182は、行L121で事前条件x≧0が成立するか否かを判定する。事前条件が成立する場合は、行L122以下を実行する。一方、事前条件が成立しない場合は、行L126のelseへ進み、行L127のRETURN文にてエラー無しでソースコードC22のプログラムを終了する。
【0047】
また、変換部181は、STのソースコードのコメント内に「#ASSERT」の記述がある場合、この記述を(コメントではなく)実行対象として事後条件を示す記述に変換する。
図4の例の場合、変換部181は、行L113を、行L123から始まるIF−ELSE文に変換している。行L123から始まるIF−ELSE文は、事前条件のIF−ELSE文である行L121から始まるIF−ELSE文のTHENで、行L122の実行後に実行される。すなわち、行L123から始まるIF−ELSE文は、ソースコードC22の実体的部分である行L122の実行後に実行される。
【0048】
また、変換部181は、行L123から始まるIF−ELSE文のTHENをヌル(null)にしている。したがって試験実行時に事後条件が成立した場合、試験実行部182は、そのままこのIF−ELSE文を終了することになる。
また、変換部181は、行L123から始まるIF−ELSE文のELSEの場合をabort(0)にしている。ここでのabort(0)は、エラー発生によるプログラム実行中断を示す。
【0049】
試験実行時に試験実行部182は、行L122を実行した場合、続けて行L123から始まるIF−ELSE文を実行する。試験実行部182は、行L123で事後条件y≧0が成立するか否かを判定する。事後条件が成立する場合、上記のように試験実行部182はそのままこのIF−ESLE文を終了する。一方、事後条件が成立しない場合、試験実行部182は行L124のelseへ進み、行L125のabort(0)でエラーを出力してプログラムの実行を中断する。
【0050】
汎用言語の記号実行ツールがassumeおよびassertに対応している場合は、変換部181が、#ASSUME、#ASSERTの記述をそれぞれassumeコマンド、assertコマンドに変換するようにしてもよい。
図5は、ソフトウェア試験装置100によるプログラム変換の第3例を示す図である。
図5のSTのソースコードC31の行L111、L112、L113は、
図4のSTのソースコードC21の行L111、L112、L113と同様である。
変換部181は、STのソースコードC31の行L111、L112、L113をそれぞれC言語のソースコードC32の行L131、L132、L133に変換する。行L131のassume文は、事前条件による分岐を示す。具体的には、事前条件x≧0が成立している場合のみ、行L132以下を実行する。
行L132は、
図4の行L122と同様、平方根の演算を示す。
行L133のassert文は、事後条件が成立しているか否かの判定を示す。具体的には、試験実行部182は、事後条件y≧0が成立していない場合をエラーとして検出する。
【0051】
以上のように、変換部181は、PLCプログラムにおけるコメントに含まれる記述のうち所定の条件を満たす記述を、汎用言語プログラムで実行対象となる記述に変換する。この汎用言語は試験に用いられる。従って、変換部181は、PLCプログラムにおけるコメントに含まれる記述のうち所定の条件を満たす記述を、汎用言語プログラムで試験時に実行される記述に変換する。
図4の例では、「#ASSUME」及び条件式が含まれていること、「#ASSERT」及び条件式が含まれていることのそれぞれが、所定の条件の例に該当する。
これによりユーザは、PLCプログラムを作成する際に、所定の条件を満たす試験用の記述をコメントに含めておくことができる。ソフトウェア試験装置100は、PLCプログラムを汎用言語プログラムに変換しての試験で、試験用の記述を反映させて試験を行うことができる。一方、PLCがPLCプログラムを実行する実運用時には、試験用の記載をコメントとして扱い、この試験用の記載の影響を受けずに動作することができる。
【0052】
また、変換部181は、PLCプログラムにおけるコメントに含まれる第1文字列を、汎用言語プログラムを実行する前提条件の記述に変換し、前記PLCプログラムにおけるコメントに含まれる第2文字列を前記汎用言語プログラム実行後に満たされるべき条件を示す記述に変換する。
図4の例では、「#ASSUME」及び条件式の記述が第1文字列の例に該当し、行L121から始まるIF−ELSE文が、汎用言語プログラムを実行する前提条件の記述の例に該当する。また、
図4の例では、「#ASSERT」及び条件式の記述が第2文字列の例に該当し、行L123から始まるIF−ELSE文が、汎用言語プログラム実行後に満たされるべき条件の記述の例に該当する。
そして、試験実行部182は、汎用言語プログラムへの入力が前記入力の条件を満たし、かつ、前記汎用言語プログラムの出力が前記出力の条件を満たさない場合をエラーとして検出する。
これにより、試験実行部182は、試験対象のプログラムに応じてテストケースを生成または選択する必要がない。この点で、試験実行部182は、いろいろなテストケースで試験を行うことができ、網羅率を向上させることができる。
試験実行部182が、記号実行法を用いて試験を行うようにしてもよい。変換部181がSTのソースコードからC言語のソースコードへ変換したことで、パソコン上で記号実行法を用いるための既存ツールを使用することができる。記号実行法を用いることで試験の精度を向上させることができる。
【0053】
表示部120がPLCプログラムを表示し、汎用言語プログラムにおける実行箇所をPLCプログラムの表示上に示すようにしてもよい。例えば、表示部120が
図4のSTのソースコードC21を表示する。一方、試験実行部182は、C言語のソースコードC22を用いて試験を行う。STのソースコードとC言語のソースコードとは
図2を参照して説明したように共通の構文木で対応付けられており、C言語のソースコードでの実行箇所をSTのソースコードでの箇所に対応付けて表示することができる。
表示部120がSTのソースコードで実行箇所を示すことで、STに慣れているユーザが、実行箇所を容易に把握することができる。
【0054】
あるいは、STのコメントに有界モデル検査での探索ステップ数を記載するようにしてもよい。そして、試験実行部182が、PLCプログラムにおけるパスのうち指定されたステップ数以下のパスの各々について、当該パスを実行した場合の変数値をC言語のソースコードを用いて算出するようにしてもよい。試験実行部182は、いずれかのパスにおける変数値がPLCプログラムで示された条件を満たさない場合をエラーとして検出する。
このように、試験実行部182が有界モデル検査を行うことで、プログラムの不具合を自動的に検出できることが期待される。
【0055】
また、試験実行部182が、グローバル変数の値と、そのグローバル変数の値の想定範囲とを比較し、グローバル変数の値が想定範囲外となる場合をエラーとして検出するようにしてもよい。
図6は、グローバル変数リストの例を示す図である。
図5の例で、グローバル変数リストは表形式のデータとして構成されており、グローバル変数の変数名、型、下限値及び上限値が格納されている。このグローバル変数リストは、グローバル変数の値の想定範囲を示す範囲情報の例に該当する。
【0056】
例えば、操作入力部130が、グローバル変数の想定範囲を示すユーザ操作を受ける。変換部181は、ユーザ操作が示すグローバル変数の範囲に基づいてグローバル変数リストを生成する。あるいは、通信部110が他の機器と通信を行ってグローバル変数リスを取得するようにしてもよい。
STのソースコードをC言語のソースコードに変換する際、変換部181は、グローバル変数リストを参照して、C言語のソースコードに事前条件の記述及び事後条件の記述を設ける。
【0057】
図7は、ソフトウェア試験装置100によるプログラム変換の第4例を示す図である。
図7の例で、STのソースコードC41では、行L141の平方根の演算のみで事前条件、事後条件については記載されていない。一方、C言語のソースコードC42では、行L141に対応する行L153の他、グローバル変数の事前条件を示す行L151及びL152と、グローバル変数の事後条件を示す行L154及びL155とが設けられている。
変換部181は、
図6のグローバル変数を参照して、行L151及びL152の事前条件の記述と、行L154及びL155の事後条件の記述とを設ける。
【0058】
以上のように、操作入力部130は、PLCプログラムに含まれるグローバル変数の値の想定範囲を示す範囲情報を取得する。操作入力部130は、範囲情報取得部の例に該当する。試験実行部182は、グローバル変数の値が想定範囲外となる場合をエラーとして検出する。
このように、C言語のソースコードにグローバル変数リストに基づく事前条件が設けられていることで、試験実行部182は、試験対象のプログラムに応じてテストケースを生成または選択する必要がない。この点で、試験実行部182は、いろいろなテストケースで試験を行うことができ、カバレッジを向上させることができる。
また、C言語のソースコードに事後条件が設けられていることで、試験実行部182は、より確実にプログラムの不具合の有無を判定することができる。
【0059】
変換部181が、サブルーチンコールなどプログラム呼出の箇所に事前条件及び事後条件を設けるようにしてもよい。
図8は、ソフトウェア試験装置100によるプログラム変換の第5例を示す図である。
図8の例で、変換部181は、STのソースコードC51、C52及びC53を、C言語のソースコードC54、C55及びC56に変換している。
STのソースコードC51、C52及びC53の各々の開始時、終了時にそれぞれ事前条件、事後条件の設定がある。一方、ソースコードC51のサブルーチンコールの箇所には事前条件、事後条件は示されていない。
【0060】
これに対し、変換部181は、ソースコードC51をソースコードC54に変換する際、サブルーチンコールに相当する箇所に事後条件及び事前条件を設ける。
具体的には、変換部181は、ソースコードC55のサブルーチンコールの直前の箇所に、サブルーチンコール先の事前条件Assume2を事後条件Assert2に変換して設けている。また、変換部181は、ソースコードC55のサブルーチンコールからの復帰時の箇所に、サブルーチンコール先の事後条件Assert3を事前条件Assume3に変換して設けている。
【0061】
同様に、変換部181は、ソースコードC56のサブルーチンコールの直前の箇所に、サブルーチンコール先の事前条件Assume4を事後条件Assert4に変換して設けている。また、変換部181は、ソースコードC56のサブルーチンコールからの復帰時の箇所に、サブルーチンコール先の事後条件Assert5を事前条件Assume5に変換して設けている。
さらに、変換部181は、サブルーチンコールをダミーコードに置き換えている。
【0062】
以上のように、変換部181は、PLCプログラムにおけるサブルーチンコールを汎用言語プログラムにおける記述に変換する場合、PLCプログラムで呼び出されるサブルーチンに示されている入口条件を、サブルーチンコール時の条件としてサブルーチン呼出側の汎用言語プログラムに含める。また、変換部181は、PLCプログラムで呼び出されるサブルーチンに示されている出口条件を、サブルーチンコールからの復帰時の条件としてサブルーチン呼出側の汎用言語プログラムに含める。試験実行部182は、サブルーチンコール時の条件及びサブルーチンコールからの復帰時の条件を用いてサブルーチン呼出側の汎用言語プログラムを単体試験する。
このように、試験実行部182は、ソースコードC54、C55、C56の各々の単体試験を行うことで、プログラムのパスが比較的短くなり、カバレッジが向上することが期待される。
【0063】
また、試験実行部182が試験を行った際に、カバレッジが低い箇所をモジュール化して単体試験を行うようにしてもよい。ここでいうモジュール化は、プログラムの部分を1つのプログラムとして構成することである。
図9は、試験実行部182が行うモジュール化の例を示す図である。
図9のソースコードC61、C62、C63は、いずれもC言語のソースコードである。
試験実行部182は、まず、C言語のソースコードC61の試験を行う。試験でソースコードC61のうち部分P11のカバレッジが低かった場合、試験実行部182は、この部分P11をモジュール化する。ソースコードC63は、部分P11をモジュール化して得られたソースコードである。また、試験実行部182は、ソースコードC62については部分P11をダミーコードで置き換えている。
【0064】
さらに試験実行部182は、ソースコードC63に事前条件Assume2及び事後条件Assert3を設けている。例えば試験実行部182は、記号実行法を用いてソースコードC63の事前条件および事後条件を抽出する。あるいは、試験実行部182がユーザへの問い合わせにて事前条件及び事後条件の情報を取得するようにしてもよい。
また、試験実行部182は、ソースコードC63に設けた事前条件Assume2を事後条件Assert2に変換し、ソースコードC62のうちモジュール化部分をダミーコードで置き換えた箇所の直前に設ける。また、試験実行部182は、ソースコードC63に設けた事後条件Assert3を事前条件Assume3に変換し、ソースコードC62のうちモジュール化部分をダミーコードで置き換えた箇所の直後に設ける。
【0065】
以上のように、試験実行部182は、試験を実行した際に、試験で通らなかったパスを切り出し、切り出したパスに対する試験を行う。
これにより、試験実行部182は、ソースコードC62、C63それぞれを単体で試験することができ、カバレッジの向上が期待される。
【0066】
なお、ソフトウェア試験装置100が生成したC言語のソースコードを用いて、PLC及び制御対象を含むシステム全体の試験をシミュレーションで行うようにしてもよい。
図10は、ソフトウェア試験システムの機能構成例を示す概略ブロック図である。
図10に示すように、ソフトウェア試験システム1は、ソフトウェア試験装置100と、制御システムシミュレーション装置200とを備える。制御システムシミュレーション装置200は、第二通信部210と、第二表示部220と、第二操作入力部230と、第二記憶部270と、第二制御部280とを備える。第二制御部280は、PLC模擬部281と、制御対象模擬部282とを備える。
【0067】
ソフトウェア試験システム1は、プログラムの試験を単体試験からシステム試験まで行うシステムである。ソフトウェア試験システム1の各部のうちソフトウェア試験装置100は、
図1に示すソフトウェア試験装置100と同一であり、ここでは説明を省略する。
制御システムシミュレーション装置200は、PLC及び制御対象を含むシステム全体の試験をシミュレーションで行う。制御システムシミュレーション装置200は、例えばパソコンなど汎用のコンピュータを用いて構成される。
【0068】
第二通信部210は、他の機器と通信を行う。特に第二通信部210はソフトウェア試験装置100と通信を行って、ソフトウェア試験装置100がSTのソースコードから変換したC言語のソースコードを受信する。
第二表示部220は、液晶パネル又はLEDパネル等の表示画面を備えて各種画像を表示する。
第二操作入力部230は、例えばキーボード及びマウス等の入力デバイスを備えてユーザ操作を受ける。
【0069】
第二記憶部270は、各種データを記憶する。例えば、第二記憶部270は、PLC及び制御対象を模擬するためのモデルや、第二通信部210がソフトウェア試験装置100から受信したC言語のソースコードを記憶する。
第二記憶部270は、制御システムシミュレーション装置200が備える記憶デバイスを用いて構成される。
第二制御部280は、制御システムシミュレーション装置200の各部を制御して各種処理を実行する。第二制御部280は、制御システムシミュレーション装置200が備えるCPUが第二記憶部270からプログラムを読み出して実行することで構成される。
【0070】
PLC模擬部281は、PLCの動作を模擬する。具体的には、PLC模擬部281は、第二記憶部270が記憶しているPLCのモデルを用いて、ソフトウェア試験装置100が変換したC言語のソースコードを実行しての制御対象に対する制御を模擬する。
制御対象模擬部282は、制御対象の動作を模擬する。具体的には、制御対象模擬部282は、第二記憶部270が記憶している制御対象のモデルを用いて制御対象の動作を模擬する。
【0071】
このように、ソフトウェア試験装置100がSTのソースコードからC言語のソースコードの変換を行ったことで、C言語のソースコードを用いてパソコン上で、このソースコードを実行しての制御を模擬することができ、シミュレーションにてシステム試験を行うことができる。
【0072】
なお、制御部180の全部または一部の機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することで各部の処理を行ってもよい。なお、ここでいう「コンピュータシステム」とは、OSや周辺機器等のハードウェアを含むものとする。
また、「コンピュータシステム」は、WWWシステムを利用している場合であれば、ホームページ提供環境(あるいは表示環境)も含むものとする。
また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ROM、CD−ROM等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含むものとする。また上記プログラムは、前述した機能の一部を実現するためのものであっても良く、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであっても良い。
【0073】
以上、本発明の実施形態を図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計変更等も含まれる。