第2回に続き、第3回目のテーマも「Jenkinsによるテストポイントの自動挿入」です。今回から一気に技術的な内容が増えて行く予定です。が、最初に断っておきますが、今回もJenkinsは出て来ません。何故かと言うと、Jenkinsで動的テストのCI環境を構築する前に、みなさんに是非知っておいていただきたいDTシリーズ製品の機能があるからです。動的テストの自動化を考える上で必須になる機能です。弊社では、みなさんにこの機能を知っていただいた上で、動的テストの自動化を設計していただきたいと考えております。

CUIによる操作

DTシリーズ製品はGUIによる操作が基本となりますが、DTシリーズ製品はCUIも有しており、コマンドラインやバッチファイルからの制御が可能となっています。特に、CI環境では一連の処理をバッチファイルなどのスクリプトを書いて実行しますので、CI環境からアプリケーションを制御するケースでは、アプリケーションのCUIの柔軟性も非常に重要になってきます。CUIによる操作が制限されるとその分スクリプトが複雑になり、その結果、CI環境の保守やメンテナンスに多くの工数を取られるといったことも起こり得ます。

CUI

一般的にCharacter User Interfaceの略と称されますが、Character-based User Interface、Console User Interfaceの略と言われることもあります。一方で、コマンドラインからの制御ということで、CLI(Command Line Interface)と言われるケースもありますが、.NETのCommon Language Infrastructureとも混同されるケースもあるため本稿ではCUIで統一します。

次は、DT10で使用可能なコマンドの一部です。DTシリーズでは、CUI上の操作をできるだけ簡略化しつつ、オプションなどの細かな設定は設定ファイルに保存しておき、それをCUIから指定する方式を取っております。

DTCmd -newproj コマンド

プロジェクトを新規作成します。パラメータにて、プロジェクトファイル名、ルートフォルダ名、接続方式、設定値ファイル名が指定可能です。尚、設定値ファイルとは、プロジェクト作成時のオプションのデフォルト設定を保存したファイルを意味します。

DTCmd -newins コマンド

指定のソースファイルにテストポイントを新規挿入します。パラメータにはテストポイントの対象となるフォルダやファイルの指定が可能です。また、別ファイルに定義されたファイルリストの指定も可能です。DTCmd -newinsコマンドの詳細については別の章で説明します。

DTCmd -trace コマンド

データ収集の開始/停止を制御します。”-trace”に続けて”start”を指定することで、データの収集が開始します。さらに、”start”に続けて文字列を入力したときその文字列が収集されたデータの項目名として付与されます。

DTCmd -analyze コマンド

データを解析し各種レポートを開きます。”-analyze”に続けて”all”を指定することでカバレッジから時間計測まで全ての解析を行います。また、データが複数存在しているときの合算解析のためのパラメータ指定も可能です。

DTCmd -export コマンド

表示中の各種レポートを指定のファイルへエクスポートします。CSV形式でのデータがエクスポートされますので、外部アプリケーションでデータの加工が可能となります。

CUIを使用したテストポイント挿入

CUIでのテストポイント挿入時には、次のように対象プロジェクトのプロジェクトファイルと挿入の対象となるソースファイル名の指定が必須となります。

DTCmd -newins ProjectFile SourceFile

ソースファイル内の関数を指定することも可能です。例えば、”Project.rprj”という名前のプロジェクトファイルを指定し、ソースファイル”File001.cpp”内の関数”FuncA”に限定してテストポイントを挿入するときは、次のように指定します。

DTCmd -newins C:\Project\Project.rprj File001.cpp FuncA

-TPKindオプションを指定することで、挿入するテストポイントの種別の指定も可能です。例えば、ソースファイル内の全ての関数のFuncInとFuncOutのテストポイントだけにテストポイントを挿入するときは、次のように指定します。

DTCmd -newins C:\Project\Project.rprj File001.cpp -TPKind FuncIn+FuncOut

関数毎のパフォーマンスの計測のために、あるフォルダ以下のソースファイル全ての関数に対して、FuncInとFuncOutのテストポイントを挿入することも可能です。さらに、-recursiveオプションを指定することでフォルダの再帰的な検索も可能です。例えば、FolderAAA以下にある全てのフォルダの全てのソースファイル内の関数に対しFuncIn, FuncOutのテストポイントを挿入するときのパラメータ指定は次のようになります。

DTCmd -newins -recursive C:\Project\Project.rprj FolderAAA -TPKind FuncIn+FuncOut

複数のソースファイルに対してテストポイント挿入は、バッチファイルやスクリプトにテストポイント挿入コマンドを連続的に記述することで実現できますが、このような方式はバッチ処理のための記述だけであり、メンテナンス性がよいとは言えません。DTシリーズでは、メンテナンス性をよくするためにテストポイント挿入の対象となるソースファイルのリストを外部ファイルで指定することができます。さらに、リストにはソースファイル毎にテストポイントの挿入アルゴリズムを指定することもできます。「カバレッジ計測用」「パフォーマンス計測用」といったように、用途に応じてリストファイルの使い分けも可能です。次は、テストポイント挿入時にファイルリストを指定したときの例です。

DTCmd -newins C:\Project\Project.rprj Filelist.txt

Filelist.txtが、テストポイントの挿入の対象となるソースファイルのリストが書かれたファイルとなります。Filelist.txtには、次のように記述します。

C:\Project\Source\File001.cpp FuncA
C:\Project\Source\File002.cpp FuncB 100
C:\Project\Source\File003.cpp
C:\Project\Source\File004.cpp /FuncIn+FuncOut

以上のように、DTシリーズにはコマンドラインからの様々なテストポイント挿入方式があります。

テストポイント挿入の応用例

テストポイント挿入コマンドには、CI環境での運用を見据えたオプションもあります。例えば、継続的にカバレッジの計測を行うときは、以前のデータを保持しつつ変更があったファイルにだけテストポイントを挿入したいといったようなケースが存在します。このようなケースでは、”-updated”オプションを指定します。

DTCmd -newins -updated C:\Project\Project.rprj Filelist.txt

上記の例では、Filelist.txtに書かれているファイルで変更があったファイルにのみテストポイントが挿入されます。”-updated”オプションは、継続的にカバレッジ計測を行って行くような環境下で効果を発揮するオプションとも言えます。
コマンドラインによるテストポイント挿入とIDE(統合開発環境)を組み合わせることもできます。IDEにはビルド実行時の前処理として実行するコマンドを指定することができますので、ここにテストポイント挿入のための実行コマンドを指定します。次は、IDE上でテストポイント挿入のコマンドを登録したときの例です。

上記はTI社のCCS(Code Composer Studio)上でビルド時の前処理にテストポイント自動挿入のためのコマンドを指定した例です。オプションに”-updated”が指定されていますので、ソースコードに変更があったファイルのみテストポイントが挿入されることになります。

最後に

いかがでしたでしょうか?
コマンドライン尽くしの回でしたので、恐らくDTシリーズ製品に馴染みのない方は「何のことだか、さっぱり・・・」だったかと思います。DTシリーズ製品をお使いの方でも少々取っつきにくい領域とも思われます。ですが、DTシリーズ製品をお使いの方で、まだコマンドラインによる操作を試されていない方は、この機会に一度試していただきたいと思います。いつもGUIで繰り返し行っている操作がバッチ処理で一気にできる感覚を味わって欲しいと思います。

時間に追われていたりすると「とりあえずやってみる」という気持ちになかなかなりにくいですが、時間のない中でも「これはお勧めです」と言われるとなぜか受け入れてしまう人は意外と多いようです。よく通販サイトで「この商品を買った人はこの商品にも興味を持っています」とかレコメンドされた商品のリストが出て来ますが、考える時間のない忙しい人向けの戦略ということになるのでしょうか。

という訳で、DTシリーズのコマンドライン機能はお勧めです。
次回からいよいよJenkinsが登場します。ご期待ください。

CI環境における動的テストの適応

 - Jenkinsを使った動的テスト自動化の施策例 -