以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、実施の形態を説明するための全図において同一部には原則として同一符号を付し、その繰り返しの説明は省略する。
(実施の形態)
図1〜図9を用いて、本発明の実施の形態のソフトウェア性能測定システム等について説明する。実施の形態のソフトウェア性能測定プログラムは、実施の形態のソフトウェア性能測定システムの計算機に処理を実行させるプログラムである。
[ソフトウェア性能測定システム(1)]
図1は、実施の形態のソフトウェア性能測定システムを含んで構成されるソフトウェア開発システムの構成を示す。このソフトウェア開発システムは、自動テストシステム1と、ソフトウェア性能測定システム2と、の少なくとも2つのシステムを含んでいる。2つのシステムは、例えばLAN等の通信手段を通じて接続されている。
自動テストシステム1は、第1PC10等によって構成されている。自動テストシステム1は、公知技術によって構成可能であり、例えば、既存の自動テストツール等によって構成されるテスト実行環境11が適用可能である。テスト実行環境11は、従来の回帰テストやシナリオテスト等で使用されている。第1PC10は、自動テストを行う機能を持つ計算機であり、テスト装置である。テスト作業を行うユーザは、第1PC10を操作する。
なお、第1PC10及び第2PC20は、一般的なPCと同様の構成であり、図示しないが、CPU、ROM、RAM、ストレージ、入力機器、出力機器、通信インタフェース装置、バス等の要素を備え、それらの要素が接続されている。また、第1PC10や第2PC20は、単一装置に限らず、クライアントサーバシステム等で構成されてもよい。また、自動テストシステム1の第1PC10と、ソフトウェア性能測定システム2の第2PC20とが、1つのシステム及び単一装置として併合された形態としてもよい。また、テストや性能測定の作業を行うユーザは、同一ユーザとしてもよいし、それぞれ複数人が同様に存在して分担作業を行う方式でもよい。
自動テストシステム1の第1PC10において、テスト実行環境11、入出力部12、プログラム30、テストシナリオ情報31、テスト結果情報32等を有する。テスト実行環境11は、第1PC10のCPUがソフトウェアプログラム処理を実行することにより実現される。入出力部12は、入力機器や出力機器が接続される入出力インタフェースを含む部分である。入出力部12は、図示しない表示装置の表示画面に画像情報を表示する処理、例えば、自動テストに係わるグラフィカル・ユーザ・インタフェース(GUI)やコマンドライン・ユーザ・インタフェース(CUI)の画面を表示する処理、等を行う。また、入出力部12は、GUI等の画面に対し、図示しないキーボードやマウス等の入力機器を通じて、ユーザからの入力操作を受け付ける処理、等を行う。
プログラム30は、開発中のソフトウェアを構成するプログラムであり、テスト対象であると共に、性能測定対象である。プログラム30は、入出力部12を通じて第1PC10内に入力され、図示しないメモリに格納される。
テストシナリオ情報31は、テスト規定情報であり、自動テストで用いるテストシナリオが記述されている。テストシナリオ情報31は、入出力部12を通じて、第1PC10内のメモリに格納される。また、ユーザは、入出力部12を通じて、テストシナリオ情報31の内容の確認や設定が可能である。実施の形態では、自動テストでテストシナリオ方式を用いる。テストシナリオ情報31は、その方式に対応するテストの内容を規定する情報である。
第1PC10では、入出力部12を通じたユーザの操作に基づいて、テスト実行環境11上の自動テストの実行が制御される。テスト実行環境11は、自動テストの際、入力されるプログラム30及びテストシナリオ情報31に基づいて、自動テストを実行し、その結果を、テスト結果情報32として出力する。第1PC10は、テスト実行環境11上で、プログラム30を実行し、そのプログラム30に対し、テストシナリオ情報31に基づいたテストを実行する。
テスト結果情報32には、自動テスト結果情報が記載されている。ユーザは、入出力部12を通じて、テスト結果情報32の内容を確認できる。
更に、実施の形態では、テスト結果情報32及びテストシナリオ情報31が、通信を通じて、ソフトウェア性能測定システム2の第2PC20に入力され、第2PC20内の図示しないメモリ等に格納される。
自動テストシステム1でプログラム30の自動テストを行ってテスト結果情報32を出力するまでが、第1の仕組み及び工程である。第2の仕組み及び工程は、ソフトウェア性能測定システム2で、自動テスト結果を用いてプログラム30の性能測定を行って、その結果を出力するまでである。性能測定の結果を表す情報として、テスト要素実行時間情報35(性能測定情報36)が算出される。
ソフトウェア性能測定システム2は、第2PC20等によって構成されている。ソフトウェア性能測定システム2の第2PC20は、性能測定等の機能を実現するための特有のプログラムを有する。そのプログラムである実施の形態のソフトウェア性能測定プログラムは、第2PC20内の図示しない記憶装置に格納されている。第2PC20は、CPUによってそのプログラムをメモリに読み出してそのプログラムに従った処理を実行することにより、その性能測定等の機能を実現する。その機能を構成する複数の部位として、テストシナリオ解析部21、テスト要素実行時間取得部22、性能変動検出部23を有する。
第2PC20は、性能測定を行う機能を持つ計算機であり、性能測定装置である。性能測定作業を行うユーザは、第2PC20を操作する。第2PC20は、テストシナリオ解析部21、テスト要素実行時間取得部22、性能変動検出部23、入出力部29、テスト要素分類表33、テスト要素解析結果情報34、テスト要素実行時間情報35、DB40、性能測定情報36、性能変動検出情報37、ソース情報38、等を有する。
テスト要素分類表33は、入出力部29を通じて、第2PC20内に入力される。ユーザは、入出力部29を通じて、テスト要素分類表33の内容の確認や設定が可能である。
テストシナリオ解析部21は、テストシナリオ情報31及びテスト要素分類表33から、テスト及びテストシナリオの内容を解析し、その解析結果を、テスト要素解析結果情報34として記載するようにして出力する。テスト要素解析結果情報34は、第2PC20内に保持される。
テスト要素実行時間取得部22は、言い換えると性能測定処理部である。テスト要素実行時間取得部22は、テスト要素解析結果情報34及びテスト結果情報32を用いて、テストを構成しているテスト要素毎の実行時間を算出し、その算出結果を、テスト要素実行時間情報35として記載するようにして出力する。テスト時点毎にテスト結果情報32が入力される。テスト要素実行時間取得部22は、テスト要素毎に実行時間を目的変数として設定した回帰分析の方程式を作成し、その方程式を解くことで、テスト要素毎の実行時間を算出する処理を行う。
テスト要素実行時間情報35は、テスト時点毎の性能測定情報36として得られる。DB40内には、複数のテスト要素実行時間情報35である複数の性能測定情報36が、時系列で整理された状態で格納される。なお、DB40は、第2PC20内のストレージ等で構成されてもよいし、第2PC20外のDBサーバ等で構成されてもよい。ユーザは、入出力部29を通じて、性能測定情報36の内容の確認や外部出力が可能である。
更に、ソフトウェア性能測定システム2では、複数回のテストのテスト結果情報32及びそれらに対応付けられる性能測定情報36に基づいて、プログラム30に関する性能変動を検出する機能を備える。その機能は、性能変動検出部23を用いて実現される。
自動テストシステム1の第1PC10は、制御や設定に基づいて、所定のタイミングでテストを実行する。特に、所定の各タイミングで複数回のテストが自動テストとして実行される。これにより、時系列での複数回の分のテスト結果情報32が得られる。ソフトウェア性能測定システム2は、その複数回の各回のテスト結果情報32を取得して、各回の性能測定及び性能変動検出に用いる。なお、DB40には、性能測定情報36だけでなく、複数回のテスト結果情報32や、図1に示す他の必要な情報が格納されてもよい。
性能変動検出部23は、複数回のテスト分のテスト要素実行時間情報35(対応する性能測定情報36)を用いて、プログラム30の性能変動を検出し、その検出結果を、性能変動検出情報37として出力する。ユーザは、入出力部29を通じて、性能変動検出情報37の内容の確認や外部出力が可能である。特に、性能変動検出部23は、最新のテスト結果の性能測定情報36と、過去のテスト結果の性能測定情報36とを比較して、性能変動を検出する。なお、性能変動検出情報37は、性能測定情報36内の一部として記述されてもよい。
また、性能変動検出部23は、後述するが、ソース情報38を用いて、性能変動に係わるソースコード変更差分情報を出力する機能も備える。ソース情報38は、自動テストシステム1のリポジトリDB90の情報に基づいた情報である。ソース情報38は、入出力部29を通じて、第2PC20内に入力される。なお、この機能を省略した形態も可能である。
[ソフトウェア性能測定システム(2)]
ソフトウェア性能測定システム2の機能等の概要は以下である。ソフトウェア性能測定システム2は、ソフトウェア開発中に行う自動テストの結果を利用して、プログラム30の性能として実行時間を測定する機能を有する。ソフトウェア性能測定システム2は、テスト結果から、回帰分析の手法を用いて、テスト要素毎の実行時間を測定する。また、ソフトウェア性能測定システム2は、性能測定の結果に基づいて、性能変動を検出する。
テスト方式としては、シナリオテスト方式が用いられる。この自動テストでは、予め作成されたテストシナリオ(テストシナリオ情報31に含む)に基づいて、テスト実行エンジン(図1のテスト実行環境11)がテストを実行する。テストシナリオ情報31には、どのようなテストの処理を行うかが、テストを構成するテスト要素の組合せで記述されている。そのテストの結果として、テストの合否、及びテストを実施した際に要したテスト実行時間を含む、テスト結果情報32が出力される。上記のような前提で、自動テストシステム1は、対象のプログラム30に対し、テストシナリオに基づいたテストを実行し、そのテスト結果であるテスト実行時間等の情報がテスト結果情報32に記録される。
ソフトウェア性能測定システム2のテストシナリオ解析部21は、テストシナリオ情報31のテストシナリオから、テストの手順に対応するテスト要素を抽出する。テストシナリオ解析部21は、各手順のテスト要素に、回帰分析の目的変数を割り当てる。例えば、テストシナリオで記述されているテストのうち、第1テストを有する。その第1テストにおいて、複数の手順である複数のテスト要素として、ユーザ入力操作(第1手順)、内容チェック処理(第2手順)、サーバへの問合せ処理(第3手順)、及び結果出力処理(第4手順)、といった複数の手順のテスト要素に分解される。これらの複数の手順のテスト要素のそれぞれに対し、変数a,b,c,dといったように変数が割り当てられる。各変数の値は、テスト要素毎のテスト実行時間を表す。このように割り当てられた変数の和、例えば(a+b+c+d)値は、プログラム30の性能を表す実行時間になる。
ソフトウェア性能測定システム2は、このような処理を、実行したテストの数だけ同様に行う。この際、複数のテストシナリオの複数のテスト間で、殆ど同じ処理内容とみなせる手順のテスト要素については、同じ目的変数を割り当てるようにする。例えば、上記「ユーザ入力操作」(第1手順)に対応する「ユーザ入力処理」が、各テストシナリオのテストに同様に存在する。その場合、ソフトウェア性能測定システム2は、それらのテスト要素の処理に、同じ目的変数を割り当てる。上記のように変数を割り当てるのは、同等の処理には殆ど同じ実行時間がかかるであろうという仮定に基づいている。
例えば、2つ目の第2テストを有する。第2テストの手順は、第1テストの手順と比べて、上記「サーバへの問合せ処理」(第3手順)だけ内容が異なるとする。その場合、同等の処理とみなせる第1手順、第2手順、及び第4手順については、変数a,b,dのように第1テストと同じ目的変数が割り当てられる。両者で異なる第3手順のみ、異なる目的変数が割り当てられる。
ソフトウェア性能測定システム2は、これらの処理を、複数のテストシナリオのテストについて同様に行う。すると、後述するが、テストシナリオの数に対応した方程式が得られる。よって、ソフトウェア性能測定システム2は、その方程式を、重回帰分析における最小二乗法等によって解くことで、各目的変数の値を得る。こうして得られた値は、テストの各手順のテスト要素の処理の実行時間に相当する。ソフトウェア性能測定システム2は、この実行時間値の取得、即ち性能測定を、定期的なタイミングで行う。このタイミングは、開発の区切り等のタイミングとしてもよいし、ユーザが設定可能である。これにより、時系列の時点毎に、プログラム30の性能測定値として実行時間値が得られる。これにより、ユーザは、ソフトウェア開発中、特に自動テスト中に、プログラム30の性能を測定することができる。
上記性能測定の結果、処理の実行時間には大きな変動が無いはずなのに測定結果の実行時間が長くなることが観察される場合がある。例えば、過去(例えば前回)の測定値と最新の測定値との相違が、ある程度以上に大きいことが観察される場合がある。その場合、ソフトウェア性能測定システム2は、性能変動として、プログラム30の実装(コーディング)またはシステム等に問題が発生した可能性があることを、迅速に検出できる。ソフトウェア性能測定システム2は、例えばプログラム30のコード変更の影響によってその性能変動が生じたものと推測できる。これにより、ユーザは、ソフトウェア開発中、特に自動テスト中に、その性能変動を迅速に知ることができる。よって、ユーザは、早期に調査やコード修正等の対応ができる。従って、開発全体の工数の増加を抑制できる。
上記重回帰分析による実行時間値の導出には一般に誤差が含まれているが、ソフトウェア性能測定システム2では、多数のテスト結果情報を用いるので、導出される値、即ち性能測定値である実行時間値に関して、実用的な精度を確保できる。ソフトウェア性能測定システム2では、前提となるテストとしては、纏めて複数の種類のテストシナリオのテスト、一般には100種類以上の多数のテストが実行されることが殆どである。そのため、ソフトウェア性能測定システム2は、回帰分析を用いた性能測定に関して、実用的な精度を確保できる。
[テストシナリオ]
図2は、テストシナリオ情報31の構成例を示す。テストシナリオ情報31は、複数のテスト(言い換えるとテスト規定情報)を含む。テストは、テストシナリオで記述されている。テストシナリオ情報31は、複数のテストシナリオ及び対応する複数のテストから階層的に構成されている。ある1つのテストは、下位階層の複数のテストから構成されてもよい。
図2の例では、テストシナリオ情報31は、複数のテストとして、テストA,テストB,……等を含む。テストAは、テストAを実行するためのテストシナリオAで記述されている。テストBは、テストBを実行するためのテストシナリオBで記述されている。
テストシナリオのテストは、複数の手順の処理に対応付けられる複数のテスト要素で構成されている。例えば、テストシナリオAは、テスト要素A1〜A6を含む。テストシナリオBは、テスト要素B1〜B6を含む。なお、“A”,“A1”等は、説明上の識別情報を示す。テストシナリオを構成する複数の行における1行分の処理を、テスト要素と呼ぶ。テストシナリオのテストは、テスト要素の集合として定義されている。
テスト実行環境11において、あるタイミングで、それぞれのテストシナリオのテスト(対応するプログラム処理)を実行することで、それらの全体として1つの自動テストが行われる。この自動テストの結果が、テスト結果情報32として出力される。テスト結果情報32は、テストが行われたタイミング等を識別する情報も含む。
図2のテストシナリオ情報31のテストシナリオ及びテストの構成例を説明する。本例では、テストの内容として、ユーザ画面からの入力によってサーバにデータを要求し、その結果が正しいか及び表示が正しいかを確認する。テストシナリオは、日本語のような自然言語の文で記述されており、記述されているテスト要素の順に処理が実行される。
テストシナリオAに記述されている内容は以下である。テストシナリオAは、テスト要素A1〜A6で構成されている。まず、テスト要素A1では、「「入力欄1」に文字列「001」を「入力」。」と記述されている。この手順は、ユーザがユーザ画面の「入力欄1」に文字列「001」を入力する旨を表している。次に、テスト要素A2では、「「入力欄1」の内容で「商品名検索」を実行。」と記述されている。この手順は、上記テスト要素A1の「入力」が完了したタイミングで、「入力欄1」の入力内容である文字列「001」を用いて、サーバに対し、「商品名検索」の処理を行うように要求する旨を表している。
次に、テスト要素A3は、「「得られた値」が「パソコン」であることを確認。」と記述されている。この手順は、上記テスト要素A2の要求に対してサーバから応答として得られた文字列が「パソコン」であることを確認する旨を表している。更に、テスト要素A3内では、上記確認の結果、両者(「得られた値」,「パソコン」)の値が異なる場合には、「テスト失敗(エラーコード=1)」を出力して終了する旨が記述されている。即ち、この処理の結果、得られた値が「パソコン」ではない場合、エラーコード=1が出力され、テストAが終了される。エラーではない場合、即ち得られた値が「パソコン」である場合には、次の手順に続く。
次に、テスト要素A4は、「「出力欄1」に「得られた値」を「出力」。」と記述されている。この手順は、上記テスト要素A3の「得られた値」である「パソコン」を、ユーザ画面の「出力欄1」に表示する旨を表している。次に、テスト要素A5は、「「出力欄1」の表示が「画像1」と同じかを確認。」と記述されている。この手順は、上記テスト要素A4の「出力欄1」の表示内容が正しいかを、別途保存されている「画像1」と比較して確認する旨を表している。更に、テスト要素A5内では、上記確認の結果、両者(「出力欄1」の表示内容、「画像1」)が異なっている場合には、「テスト失敗(エラーコード=2)」を出力してテストAを終了する旨が記述されている。即ち、この処理の結果、両者が不一致の場合には、エラーコード=2が出力され、テストAが終了される。両者が一致の場合には、次の手順に続く。
テスト要素A6は、「テスト成功で終了(エラーコード=0)」と記述されている。この手順は、テスト結果を成功として、テストシナリオAのテストAを終了する旨を表している。
テストBのテストシナリオBについても同様である。テスト要素B1は、「「入力欄2」に文字列「002」を「入力」。」と記述されている。テスト要素B2は、「「入力欄2」の内容で「納品期限日検索」を実行。」と記述されている。テスト要素B3は、「「得られた値」が「2001/01/01」以降であることを確認。」等と記述されている。テスト要素B4は、「「出力欄2」に「得られた値」を「出力」。」と記述されている。テスト要素B5は、「「出力欄2」の表示が「画像2」と同じかを確認。」等と記述されている。テスト要素B6は、「テスト成功で終了(エラーコード=0)」と記述されている。
上記例のように、テストシナリオA(テストA)とテストシナリオB(テストB)とでは、概略同じような内容のテスト要素が含まれている。例えば、テスト要素A1の「入力」の処理と、テスト要素B1の「入力」の処理とは、概略同じような内容である。テスト要素A4の「出力」の処理とテスト要素B4の「出力」の処理についても同様である。同様に、あるプログラム30のテストにおける複数のテストシナリオのテスト間では、概略同じような内容のテスト要素が共通に含まれていることが多い。
[テスト結果情報]
図3は、テスト結果情報32の構成例を示す。図2、図3を用いて、テストシナリオ情報31とテスト結果情報32との関係を説明する。図3のテスト結果情報32の表は、項目(列)として、テスト、テスト合否、テスト実行時間を含む。[テスト]項目は、テストシナリオに対応付けられたテストの識別情報を示す。図3の例では、図2のテストの実行結果が記載されている。[テスト]項目には、前述のテストA、テストB等がある。[テスト合否]項目は、[テスト]項目のテスト結果として、合格(成功、例えば値が0)または不合格(例えば値が1)を示す。例えばテストAの結果が合格、テストBの結果が不合格である。[テスト実行時間]項目は、[テスト]項目のテストの処理の実行に要した時間が記載される。この[テスト実行時間]は、自動テストシステム1の既存のテスト実行環境11(自動テストツール)の機能によって得られる時間であって、ソフトウェア性能測定システム2の目的として性能測定しようとしているプログラム30の実行時間とは異なる。例えば、テストAの実行時間が0.03秒、テストBの実行時間が0.05秒となっている。
上記のように、テスト結果情報32には、ある日時(回)の1つの自動テストを構成している複数の各々のテストシナリオのテストの結果情報が登録されている。次の日時(回)の自動テストの際にも同様に結果情報が登録される。なお、テスト結果情報32は、日時(回)毎に別の表として作成されてもよいし、1つの表の中に、複数の日時(回)毎に情報が記載されてもよい。
[テスト要素分類表]
図4は、テスト要素分類表33の構成例を示す。テスト要素分類表33は、テスト要素のグループへの分類を表す情報が設定されている。図4の(A)は、設定例を示す。テスト要素分類表33は、テストシナリオ情報31に記載されている複数のテスト要素のうち、どのテスト要素を同じものとみなして分類するかについての設定情報が記載されている。例えば、前述のテスト要素A1とテスト要素B1とを同じ内容のテスト要素とみなす場合には、それらのテスト要素A1とテスト要素B1は、同じグループに分類されるように設定される。ユーザは、テスト要素分類表33に、テスト要素に関するグループの分類をユーザ設定可能である。
テストシナリオのテストにおけるテスト要素の処理が実行される際には、必ずその分のテスト実行時間が発生する。これらのテスト実行時間は、テスト要素のそれぞれにおいて基本的には別の値になる。しかしながら、複数のテスト要素間では、テスト実行時間が明らかに同一になるものがある。また、複数のテスト要素間では、テスト実行時間の差異が非常に小さくなるものがある。それらのテスト要素及びテスト実行時間については、性能測定の目的上、同一とみなしても問題無い。よって、テスト要素分類表33には、それらの同一とみなせるテスト要素が、同一のグループに分類されるように設定される。
例えば、前述のテスト要素A1の「入力欄1」への値の「入力」の処理やテスト要素B1の「入力欄2」への値の「入力」の処理は、自動テストである場合、一瞬で実行できる。そのため、テスト要素A1やテスト要素B1のテスト実行時間の値が小さくなることが明らかである。同様に、テスト要素A4の「出力」の処理やテスト要素B4の「出力」の処理も、一瞬で実行できる。このように、テスト実行時間が殆ど同等と考えられるテスト要素、あるいは事前の計測等によってテスト実行時間が同じと判明しているテスト要素がある。ユーザは、それらのテスト要素については、同じグループに分類しておく。
具体的には、図4の(A)のテスト要素分類表33の例では、複数のグループとして、グループA、グループB等を有する。本例では、グループが自然言語で記述されている。グループAは、「「入力欄*」への「入力」。」という行401や、「「出力欄*」への「出力」。」という行402が記述されている。グループBは、「画像の総ピクセル数の差が±10%未満の画像比較。」という行403が記述されている。各行は、テスト要素(手順)に対応している。グループAは、例えば、行401の「「入力欄*」への「入力」。」という内容や行402の「「出力欄*」への「出力」。」という内容に該当する全てのテスト要素については、同じグループAに属することを表している。なお、記述中の記号「*」(アスタリスク)は、全てを表している。例えば前述の「入力欄1」や「入力欄2」、他の「入力欄Z」等は、「入力欄*」に含まれる対象になる。テスト要素分類表33の記述には、一般的な正規表現を用いてもよい。
テスト要素の分類は、図4の(A)の方式に限らず可能である。図4の(B)には、他の設定例を示す。このテスト要素分類表33は、項目として、テスト要素、グループを有する。[テスト要素]項目は、テスト要素の識別情報が記載されている。[グループ]項目には、グループの識別情報が記載されている。即ち、このテスト要素分類表33は、それぞれのテスト要素毎に、分類するグループとの関連付けが設定されている。例えば、テスト要素A1、テスト要素A4、テスト要素B1等には、同じグループAが設定されている。
[テストシナリオ解析部]
図5は、テストシナリオ解析部21の処理フローを示す。この処理は、テスト要素分類表33に基づいて、テストシナリオ情報31に記載のテスト要素を解析し、解析結果をテスト要素解析結果情報34として出力する処理である。この処理では、グループに分類されるテスト要素毎に、回帰分析の目的変数が割り当てられ、回帰分析の方程式が生成される。この回帰分析の方程式は、特に、複数の変数を持つ重回帰分析の方程式である。
図5の処理は、ステップS11〜S15を有する。以下、ステップの順に説明する。S11で、まず、テストシナリオ解析部21は、テストシナリオ情報31から、順に1つのテストシナリオのテストの情報を読み込み、そのテストシナリオのテストから順に1行のテスト要素毎に読み込む。そして、テストシナリオ解析部21は、読み込んだテスト要素に、個別に初期目的変数を割り当てる処理を行う。初期目的変数は、グループ分類を考慮せずに1つずつ順に異なる変数が割り当てられればよい。テストシナリオ解析部21は、後述の図6のテスト要素解析結果情報34の[初期目的変数]項目に、割り当てた初期目的変数を記載する。S12で、テストシナリオ解析部21は、S11の処理を、対象のテストシナリオの全てのテスト要素の行について行ったかを確認する。テストシナリオ解析部21は、その確認をしながら、全てのテスト要素に割り当てるまで、S11,S12の処理を同様に繰り返す。
次に、S13で、テストシナリオ解析部21は、テスト要素分類表33から順に1つずつグループを参照し、そのグループ及びそれに対応付けられるテスト要素に注目する。テストシナリオ解析部21は、S12の結果で初期目的変数が割り当てられているテスト要素に対して、注目するグループに属しているテスト要素があるかを判断する。そして、テストシナリオ解析部21は、同じグループに属している全てのテスト要素について、同じ共通の目的変数である最終目的変数を割り当てるように設定する処理を行う。テストシナリオ解析部21は、後述の図6のテスト要素解析結果情報34の[最終目的変数]項目に、割り当てた最終目的変数を記載する。S14で、テストシナリオ解析部21は、S13の処理を、テスト要素分類表33の全てのグループについて行ったかを確認する。テストシナリオ解析部21は、その確認をしながら、全てのグループについて行うまで、S13,S14の処理を同様に繰り返す。
S15で、テストシナリオ解析部21は、S11〜S14の処理を、テストシナリオ情報31の全てのテストシナリオのテストについて行ったかを確認し、全てについて行ったら、本処理フローを終了する。
上記解析処理によって、最終的に、図6のようなテスト要素解析結果情報34の最終目的変数(y1〜y5等)が得られる。
上記解析処理では、テスト要素分類表33を用いて、同等とみなせるテスト要素の処理をグループに纏めて、グループ毎に目的変数を設定している。この方式には、以下のような理由もある。ソフトウェア性能測定システム2では、回帰分析の方程式を用いて、性能を表す実行時間を算出するために、テスト要素毎に目的変数を設定する。ここで、例えば、グループAの「「入力欄*」への「入力」」等に該当するテスト要素の処理は、テスト実行時間が比較的短く、かつ、ある自動テストの中で大量に表れる処理である。このような複数のテスト要素の処理は、それらの全てに個別に異なる目的変数(初期目的変数が相当する)を割り当てた場合、目的変数の個数が多くなり、方程式が解けない、または、分析精度が低くなる。分析精度が低くなるのを避けるために、それらの同等とみなせる複数のテスト要素に対しては、同じ目的変数を割り当てる。前述のように、「入力」や「出力」等の処理は、簡単であることが多く、同等とみなしても問題無い。実施の形態では、そのような仮定に基づいて、上記のように共通の最終目的変数に纏める処理を行っている。これにより、目的変数の個数が比較的少なくなり、重回帰分析の方程式を最小二乗法によって解くことができ、分析精度が高くなる。
また、実施の形態では、テストシナリオ解析部21によって、テスト要素分類表33に基づいてテスト要素解析結果情報34を生成する処理を行っている。ユーザは、テスト要素分類表33を設定し、解析を指示すれば、後は、テスト要素解析結果情報34が生成される。変形例としては、これに限らず可能であり、テストシナリオ解析部21を用いずに、ユーザが手動で直接的に、テスト要素分類表33に基づいてテスト要素解析結果情報34(回帰分析のための方程式)を設定してもよい。即ち、その場合、テストシナリオ解析部21の実装は不要であり、ユーザは、第2PC20で、入出力部29を通じて、GUI画面に対し、テスト要素解析結果情報34の回帰分析のための方程式の設定作業を行えばよい。
[テスト要素解析結果情報]
図6は、テスト要素解析結果情報34の構成例を示す。図6のテスト要素解析結果情報34の表は、項目(列)として、テスト、テスト要素、初期目的変数、最終目的変数を有する。[テスト]項目は、テストシナリオのテストの識別情報が格納されている。[テスト要素]項目は、テストシナリオのテストを構成する1つ以上のテスト要素の識別情報や文(行)を示し、テストシナリオ情報31に基づいた情報である。[初期目的変数]項目は、テスト要素毎に割り当てられた前述の初期目的変数が格納されている。初期目的変数の例を“a1”等で示す。例えば、テストAにおけるテスト要素A1には初期目的変数a1が割り当てられている。テスト要素A2には変数a2、テスト要素A3には変数a3、テスト要素A4には変数a4、テスト要素A5には変数a5、といったように割り当てられている。同様に、テストBにおけるテスト要素B1には初期目的変数b1、といったように割り当てられている。[最終目的変数]項目は、テスト要素の初期目的変数に対して割り当てられた前述の最終目的変数が格納されている。最終目的変数の例を“y1”等で示す。例えば、テストAにおけるテスト要素A1の初期目的変数a1には最終目的変数y1が割り当てられている。テスト要素A2の初期目的変数a2には最終目的変数y2が割り当てられている。テスト要素A3の初期目的変数a3には最終目的変数y3が割り当てられている。テスト要素A4の初期目的変数a4には、テスト要素A1の初期目的変数a1と同じく、最終目的変数y1が割り当てられている。テスト要素A5の初期目的変数a5には、テスト要素A2の初期目的変数a2と同じく、最終目的変数y2が割り当てられている。即ち、テストAのテスト要素A1〜A5の初期目的変数a1〜a5に対しては、最終目的変数{y1,y2,y3,y1,y2}を有する。同様に、テストBのテスト要素B1〜B5の初期目的変数b1〜b5に対しては、最終目的変数{y1,y4,y5,y1,y2}を有する。
[回帰分析の方程式]
図7は、テスト要素解析結果情報34に基づいて立てられた回帰分析の方程式を示す。この方程式は、図6のテスト要素解析結果情報34の表(特に最終目的変数)を、数式として表現したものである。テスト要素実行時間取得部22は、テスト結果情報32と、テスト要素解析結果情報34とから、このような方程式を作成する。
図7の(A)は、図6のテスト要素解析結果情報34の例を数式化した方程式を示す。この方程式は、説明変数行列71、目的変数ベクトル72、及び、テスト実行時間ベクトル73からなる。この方程式は、説明変数行列71と目的変数ベクトル72とを乗算した結果がテスト実行時間ベクトル73と同じであることを表す。
図7の(B)は、図7の(A)の方程式を一般化した方程式であり、回帰分析の行列式を示す。行列式をAY=Bで表す。行列Aは、説明変数行列71に対応する。1列であるベクトルY{c,y1,y2,……,ym}は、目的変数ベクトル72に対応する。1列であるベクトルB{t1,t2,……,tn}は、テスト実行時間ベクトル73に対応する。
図7の(A)で、説明変数行列71における行は、係数が並んでおり、目的変数ベクトル72のそれぞれの目的変数が、どのテスト要素に関係付けられているかを表している。目的変数ベクトル72は、自動テストの全てのテストのテスト要素に対して割り当てられた目的変数を羅列したものであり、図6の[最終目的変数]と対応する。テスト実行時間ベクトル73は、説明変数行列71に目的変数ベクトル72を乗じた式であり、それぞれの値は、前述のテスト実行時間(図3の[テスト実行時間])に等しい。
目的変数ベクトル72中の変数“c”は、定数であり、全てのテストにおいて均等に要するテスト要素として、テストシナリオ情報31に記述されていない処理を纏めたものである。例えば、ログを出力するためにかかる時間等がこの定数に相当する。
例えば、説明変数行列71における1行目{1,2,2,1,0,0,…}は、テストAに対応している。テストAのテスト要素A1〜A5に対し、最終目的変数{y1,y2,y3,y1,y2}が割り当てられている。例えば、変数y1は、2つのテスト要素A1,A4に共通に割り当てられているので、説明変数行列71の1行目の2番目の係数が“2”となっている。例えば、説明変数行列71の1行目と目的変数ベクトル72との乗算結果は、テスト実行時間ベクトル73の1番目の値として、c+2y1+2y2+y3と表される。この値は、テスト結果で得られた[テスト実行時間]の値と等しい。図3のテストAの[テスト実行時間]の値をt1とおくと、t1=c+2y1+2y2+y3である。
図7の(B)の方程式(AY=B)において、添え字“m”は、自動テストの全てのテストに対して割り当てられた目的変数の個数である。添え字“n”は、自動テストを構成するテストの総数である。“tn”は、n番目のテストの[テスト実行時間]を示す。例えば、行列Aの1行目については、c+a11y1+a12y2+……+a1mym=t1と表される。
AY=Bにおいて、誤差を考慮しない場合、Y=(AT・A)−1・AT・B、という行列式で表せることが知られている。なお、ここで、XTは、行列Xの転置行列を示し、X−1は、行列Xの逆行列を示す。上記方程式を用いて、ベクトルYから目的変数を求めることができる。
テスト要素実行時間取得部22は、上記のような重回帰分析の方程式を、最小二乗法を用いて解くことで、最終目的変数{y1,……,ym}の値、即ちテスト要素毎の実行時間値、を取得する。テスト要素実行時間取得部22は、得られたテスト要素毎の実行時間値を、テストシナリオのテスト毎に加算することで、テスト毎の実行時間値を得ることができる。例えば、テストAの実行時間値は、y1+y2+y3+y1+y2=2y1+2y2+y3として得られる。
[テスト要素実行時間情報]
図8は、テスト要素実行時間情報35の構成例を示す。図8の上側は、テスト要素毎の結果を纏めた表を示す。図8の下側は、テスト毎の結果を纏めた表を示す。図8の上側のテスト要素実行時間情報35の表は、項目(列)として、最終目的変数、テスト要素例、実行時間(性能実行時間)、誤差、出力相違、を有する。[最終目的変数]項目は、前述のベクトルYに対応する最終目的変数(“y1”等)及び定数(“c”)を示す。[テスト要素例]項目は、その最終目的変数に関係付けられるテスト要素の例の文を示す。これは、前述のテストシナリオ情報31またはテスト要素解析結果情報34に基づいて、1つの最終目的変数に集約されている共通のテスト要素のうちの1つのテスト要素の文が記載される。本例では、「テスト要素例」に、1つのテスト要素のみが記載されているが、これに限らず可能であり、共通の複数のテスト要素の文が記載されてもよい。いずれにしろ、[テスト要素例]項目は、ユーザがこの表を見た時に内容の把握が容易になるように設けられているので、不要であれば省略可能である。
[実行時間]項目は、上記重回帰分析によって得られた、テスト要素毎の実行時間値、即ち、性能測定値である実行時間値が格納されている。例えば変数y1のテスト要素に関する実行時間値が5ミリ秒(msec)、変数y2のテスト要素に関する実行時間値が100ミリ秒である。[誤差]項目は、重回帰分析で得られた[実行時間]値に関する誤差の値を示し、%等で表される。
[出力相違]項目は、後述の性能変動検出機能に係わる結果情報であり、時系列で、複数回の自動テストが行われた場合に、そのテスト要素に関する[実行時間]に関して、ある程度以上に大きい相違や変動があるか否かを表す値、あるいは、その相違や変動の大きさを表す値、等が格納されている。
図8の下側の表では、同様に、テストシナリオのテスト毎の実行時間値等が格納されている。例えば、テストAの実行時間がTAミリ秒、テストBの実行時間がTBミリ秒であったことを示す。
上記のようなテスト要素実行時間情報35が、自動テストの回数や日時等の情報と共に、性能測定情報36として、DB40に格納される。上記のように、実施の形態によれば、開発中ソフトウェアの性能として実行時間が測定できる。更に、実施の形態では、下記のように、開発中ソフトウェアの性能に関する変動検出機能を備えている。
[性能変動検出部]
図9は、性能変動検出部23の性能変動検出処理のフローを示す。この処理は、複数回の自動テストの結果に基づいて、実行時間の変動によって、プログラム30の性能変動を検出する処理である。前述のように、プログラム30に関する自動テストが、例えば定期的に複数回のタイミングで実施され、それぞれのタイミングに合わせて、性能測定処理が行われる。自動テストの回数分、テスト結果情報32やテスト要素実行時間情報35が同様に得られる。テスト要素実行時間取得部22は、各回のテスト要素実行時間情報35に対応する性能測定情報36を、DB40に時系列で保存しておく。
性能変動検出部23は、最新のテスト時点に対応するテスト要素実行時間情報35(性能測定情報36)と、DB40から参照できる過去のテスト時点に対応するテスト要素実行時間情報35(性能測定情報36)とを相互に比較する。性能変動検出部23は、両者における対応する[実行時間]の値を比較する。性能変動検出部23は、各時点の実行時間値における相違や変動を観測し、性能変動を検出する。性能変動検出部23は、性能変動を検出した場合、その内容や警告を表す性能変動検出情報37を出力する。
図9は、ステップS21〜S26を有する。以下、ステップの順に説明する。S21で、性能変動検出部23は、最新の自動テストの時点のテスト要素実行時間情報35または性能測定情報36を参照し、順に1行を読み込み、テスト要素毎の実行時間値及びその誤差値を参照する。S22で、性能変動検出部23は、DB40から、過去の自動テストの時点のテスト要素実行時間情報35または性能測定情報36を参照し、順に1行を読み込み、テスト要素毎の実行時間値及びその誤差値を参照する。実施の形態では、比較対象とする過去の時点としては、1つ前の回の自動テストの時点とする。これに限らず、比較対象とする過去の時点としては、任意の過去の時点としてもよく、各種の変形例が可能である。
S23で、性能変動検出部23は、S21の最新の時点の実行時間値と、S22の過去の時点の対応する実行時間値とを、回帰分析の誤差(±%)を考慮しつつ、比較する。この誤差は、前述の図8の[誤差]項目の値である。S23の比較処理は、両者の値を単純比較する方式を用いてもよいが、実施の形態では以下の方式を用いる。
性能変動検出部23は、最新の実行時間値と、過去の実行時間値との差分値を算出し、その差分値を、所定の閾値と比較することで、両者の相違の大きさを判断する。また、性能変動検出部23は、回帰分析の誤差(±%)の値を反映した上限値及び下限値を用いる。性能変動検出部23は、最新の時点の実行時間値に、正の誤差(+%)を加算で反映した上限値と、負の誤差(−%)を加算で反映した下限値とを計算する。同様に、性能変動検出部23は、過去の時点の実行時間値に、正負の誤差を反映した上限値及び下限値を計算する。そして、性能変動検出部23は、最新の実行時間値の上限値及び下限値と、過去の最新の実行時間値の上限値及び下限値とで比較する。
S24で、性能変動検出部23は、S23の比較の結果、最新の実行時間値と過去の実行時間値との間で、ある程度以上に大きい相違があるかどうかを判断する。例えば、性能変動検出部23は、最新時点の実行時間値と前回時点の実行時間値との差分値が、閾値以上である場合に、相違が大きいと判断し、性能変動として検出してもよい。その閾値は、例えば、比率(例えば50%)を用いて設定されてもよい。あるいは、性能変動検出部23は、最新時点の実行時間値の下限値が前回時点の実行時間値の上限値よりも大きい場合や、最新時点の実行時間値の上限値が前回時点の実行時間値の下限値よりも小さい場合に、相違が大きいと判断してもよい。S24の結果で、相違が大きい場合(Y)にはS25へ進み、相違が小さい場合(N)にはS26へ進む。
S25で、性能変動検出部23は、相違が大きい、即ち性能変動が大きい旨を表す警告を、ユーザに対して出力する。警告の出力は、例えば画面表示とするが、音声出力でもよいし、メール通知等でもよい。性能変動検出部23は、入出力部29を通じて、GUI画面に、警告情報を含む性能変動検出情報37を、即座に表示する。
警告出力に関して、変形例としては、以下でもよい。ソフトウェア性能測定システム2で、ユーザ設定に基づいて、テストに伴う所定のタイミングで性能測定処理を自動実行し、その性能測定結果のログ(性能測定情報36または性能変動情報37に相当する)を出力する。性能変動がある場合には、そのログ中に、警告情報が記述される。ユーザは、所望の時点でそのログを確認することで、性能変動及びその警告を認識できる。
例えば、S23の比較の際に比率の閾値(例えば50%)を用いる場合、最新時点の実行時間値が、前回時点の実行時間値に対して50%以上の相違があった場合には、性能変動の警告が出力される。
S26で、性能変動検出部23は、上記S21〜S25の処理を、比較対象となるテスト要素実行時間情報35(性能測定情報36)の全てのテスト要素について行ったかを確認しながら、全てについて行うまで、同様に繰り返し実行する。上記処理例は、テスト要素毎の実行時間値に関する比較としたが、テスト毎の実行時間値に関する比較を同様に行って性能変動を検出してもよい。
なお、変形例としては、最新時点の実行時間値と、過去の複数回の実行時間値の統計値(平均値等)とを比較してもよい。
[ソースコード表示機能]
更に、実施の形態のソフトウェア性能測定システム2では、上記性能変動検出と共に、性能変動に関連付けられるソフトウェアのソースコードの変更差分情報を同時に出力する機能を有する。上記性能変動検出機能に基づいて、実行時間の相違や変動に関する、テストシナリオのテストのテスト要素における寄与の大きい箇所が、予め、あるいはテスト後の性能測定の結果、特定される。性能変動検出部23は、その実行時間の相違が大きい箇所のテスト要素が特定できた場合、そのテスト要素の処理に関与しているソースコードにおける変更差分情報を特定し、ユーザに対して出力する。
性能変動検出部23は、上記ソースコードの変更差分情報を表示する機能を、リポジトリDB90に基づいたソース情報38を用いて実現する。既存のソフトウェア開発システムでは、ソフトウェア(プログラム30)のソースコードの変更に伴う変更差分情報が、時系列でリポジトリDB90に格納、管理されている。即ち、既存のリポジトリDB90の情報を参照すれば、ソースコード変更差分情報がわかる。ソース情報38は、自動テストシステム1のリポジトリDB90の情報の参照に基づいて設定されている情報である。ソース情報38には、テスト要素とソースコードとの対応関係が情報として記載されている。性能変動検出部23は、性能変動を検出した場合には、ソース情報38を参照し、相違が大きかったテスト要素の箇所に関係付けられるソースコードの変更差分情報を特定して抽出する。性能変動検出部23は、性能変動検出情報37に、警告等と共に、その抽出したソースコード変更差分情報を記載し、ユーザに対して出力する。例えば、GUI画面に、そのソースコード変更差分情報が表示される。
これにより、ユーザは、性能測定の結果、例えば性能低下の警告があった場合に、その性能低下に関与したと考えられるソースコード変更差分情報を、即座にGUI画面で見て確認できる。これにより、開発中ソフトウェアに関する問題解析やコード改善等を迅速に進めることを支援できる。
[効果等]
上記のように、実施の形態のソフトウェア性能測定システムによれば、対象のプログラム30のサイズが大きい場合でも、工数増大を抑えつつ、そのプログラム30の性能測定を実現できる。言い換えると、実施の形態によれば、性能測定のために、プログラム30のソースコードにログ出力等のための追加コードを埋め込む等の追加工数を必要とせずに、性能測定を実現できる。実施の形態によれば、専用の高価な性能測定装置を設ける追加コスト等を必要とせずに、性能測定を実現できる。実施の形態によれば、開発中のシステムへの悪影響を皆無として、プログラム30の性能測定を実現できる。
実施の形態によれば、ソフトウェア開発中、特に自動テスト中に、早期に性能変動を検出することができ、これにより、全体の工数を抑え、開発効率を向上できる。実施の形態によれば、ソフトウェア開発の一般的なプロセスであるテストの結果に基づいて、性能として実行時間を測定できる。実施の形態によれば、テスト工程と性能測定工程とを殆ど同じ期間に合わせて実行できる。実施の形態によれば、テストと性能測定とを独立に行うシステムに比べて、効率的に実現できる。
実施の形態によれば、テスト結果情報32のようなログ(テスト要素のテスト実行時間またはそれが算出可能な情報が含まれているログ)、及びテストシナリオ情報31(テスト要素等が規定されている情報)を含むデータや情報があれば、テスト要素毎の実行時間を測定して、プログラム30の性能を測定できる。実施の形態によれば、そのログ等のデータや情報があれば、自動テスト中であっても、自動テスト実施後にある程度時間が経過した後であっても、プログラム30の性能を測定できる。
また、一般にプログラム実行中には、不確定な要因によってプログラム性能が変動する場合がある。例えば、インタプリタ系の実行環境では、空きメモリを収集する処理であるガベージコレクション等が不定期に実行されている。これにより、プログラム実行環境の性能が低下し、実行時間が延びることがしばしばある。従来の性能測定方式では、プログラム性能測定中にこのような性能低下が生じ得るので、その性能低下の影響を少なくするためには、複数回の性能測定が必要であった。あるいは、従来の方式では、性能測定の際、システムのログを並行して取得し、そのシステムのログと、性能測定のためのログとを突き合せて原因を明確にし、例えばガベージコレクション等の動作の影響があったデータかどうかを判断する必要があった。このように、従来の方式では、作業工数が大きかった。
一方、実施の形態によれば、開発中に複数回、一般には数百回以上の回数で実行される自動テストの結果を利用して、性能測定ができる。そのため、少ない作業工数において、上記のような不確定な要因による性能低下の影響を抑えることができる。不確定な要因があったとしても、回帰分析で推定される実行時間値の分析精度には大きな影響は与えない。即ち、実施の形態によれば、十分に高い精度でプログラム30の性能測定が実現できる。
実施の形態は、特に、テストシナリオに基づいたテストを実施してテスト実行時間を出力する機能を持つ自動テストツール及びその自動テストシステム等に対して、好適に適用可能である。
以上、本発明を実施の形態に基づいて具体的に説明したが、本発明は前述の実施の形態に限定されず、その要旨を逸脱しない範囲で種々変更可能である。