RT コンポーネント開発へのテスト駆動開発手法の導入 1A1-H15

䢳䣃䢳䢯䣊䢳䢷
RT コンポーネント開発へのテスト駆動開発手法の導入
Adopting Test-Driven Development to RT-Component Development
○小田桐
康暁((株)セック)
中本
啓之((株)セック)
西之原 寛((株)セック)
Yasuaki ODAGIRI, SEC CO.,LTD.
Hiroyuki NAKAMOTO, SEC CO.,LTD.
Kan NISHINOHARA, SEC CO.,LTD.
Test-driven development (TDD) is one of software development practices. With this practice, tests are written
prior to code implementation. One of advantages of TDD is to get automated regression test. By using automated
regression test, it is possible to modify software functions safely and check software behavior easily in multi OS. We
try to adopt TDD to RT -Component (RTC) development and develop the library “RT-Seam” that helps to test RTC
easily.
Key Words: RT Component, OpenRTM-aist, Test driven development
1.
はじめに
RT ミドルウェアは,ロボットシステムを構築するためのソ
フトウェアプラットフォームである.RT ミドルウェアでは,
ロボットの構成要素を RT コンポーネント(RTC)と呼ばれる
ソフトウェアモジュールとして開発し,それらを組み合わせ
ることでロボットシステムを構築する[1].
独立行政法人新エネルギー・産業技術総合開発機構(NEDO)
の委託事業である次世代知能化技術開発プロジェクト[2](以
降,知能化プロジェクト)は,RT ミドルウェアの実装の 1 つ
である OpenRTM-aist[1][3]を使って,ロバストなロボットの構
築に必要な RTC を開発している.著者らは知能化プロジェク
トに参加して,自律移動ロボットのための RTC を開発してい
る.
知能化プロジェクトで RTC を開発する中で,著者らは RTC
の開発における課題として,頻繁な変更によるプログラムの
複雑化と,複数の OS での動作検証の負担,という 2 つの点に
着目した.著者らは RTC の開発にソフトウェア開発手法の 1
つであるテスト駆動開発を導入することでこれらの課題を解
決できると考えた.
RTC の開発にソフトウェア開発の手法を導入する試みとし
ては,ロボットソフトウェアの高信頼化のためにロボットソ
フトウェアの開発をプロジェクトマネジメントと開発プロセ
スの観点から考察した事例[4]や,設計資産の再利用を目的と
してモデルベース設計をおこなった事例[5]がある.しかし,
RTC の開発にテスト駆動開発を導入した事例はない.
本稿では,RTC の開発にテスト駆動開発を導入する利点を
述べる.また,実際にテスト駆動開発で RTC を開発する際の
問題点を挙げ,その問題点を解決するために開発したライブ
ラリを紹介する.
2.
RTC 開発へのテスト駆動開発の導入
更すると考えられる.
プログラムを変更する場合,変更に関係しない部分を誤
って壊してしまわないように注意しなければならない.し
かし,機能追加や機能変更を繰り返したプログラムの場合,
プログラム内部のモジュール間に複雑な依存関係が生じて
いることが多く,あるモジュールへの変更が他のモジュー
ルに及ぼす影響を全て正確に把握することは容易ではない.
プログラムを変更しやすくするために,リファクタリン
グと呼ばれる手法を使うことが考えられる.リファクタリ
ングは,プログラムの動作を変えずにプログラムの構造を
改善することである.リファクタリングによってプログラ
ムの構造を単純にすれば,変更が他の部分に及ぼす影響を
把握しやすくなる.しかし,リファクタリングもプログラ
ムを変更するという点では機能追加や機能変更と同じであ
る.そのため,複雑なプログラムをリファクタリングする
場合には,誤ってプログラムの動作を変えてしまう危険性
がある.
研究において開発する RTC は,頻繁に変更を繰り返すた
めに,プログラムの構造が複雑になる可能性が高いと考え
られる.そのため,RTC に対して機能追加や機能変更,リ
ファクタリングをおこなう際に,変更に関係しない部分を
誤って壊してしまうという不具合が発生しやすいと考えら
れる.
複数の OS での動作検証の負担
2011 年現在,OpenRTM-aist は,動作 OS として Linux/Unix,
Windows,Mac OS X をサポートしている[3].そのため,RTC
の開発者は,開発に都合の良い OS を自由に選択できる.し
かし,多くの RTC は開発された OS 上でしか動作しない.
そのため,RTC の利用者は,利用に都合の良い OS を自由に
選択できない場合が多い.
著者らは利用者の利便性を考慮し,Windows と Linux の
両方で動作するように RTC を開発している.これによって,
RTC の利用者は都合の良い OS を自由に選択できる.ただし,
複数の OS 向けに RTC を開発する場合,動作検証にかかる
時間が倍増するという問題がある.
2)
2.1. RTC 開発における課題
著者らが着目した RTC の開発における 2 つの課題を以降に
述べる.
1) 頻繁な変更によるプログラムの複雑化
2011 年現在,RTC の開発者の多くは大学や研究機関に属
2.2. テスト駆動開発の導入
している.研究現場でのロボット開発では,試行錯誤を繰
テスト駆動開発では,プログラムを作成する前に,そのプ
り返してプログラムを作成することが多い[4] [6].そのため, ログラムの動作を自動で検証するテストプログラム(以降,
研究における RTC 開発では,RTC のプログラムを頻繁に変
テスト)を作成する.テスト駆動開発では,プログラムへの
䣐䣱䢰䢢䢳䢳䢯䢷䢢䣒䣴䣱䣥䣧䣧䣦䣫䣰䣩䣵䢢䣱䣨䢢䣶䣪䣧䢢䢴䢲䢳䢳䢢䣌䣕䣏䣇䢢䣅䣱䣰䣨䣧䣴䣧䣰䣥䣧䢢䣱䣰䢢䣔䣱䣤䣱䣶䣫䣥䣵䢢䣣䣰䣦䢢䣏䣧䣥䣪䣣䣶䣴䣱䣰䣫䣥䣵䢮䢢䣑䣭䣣䣻䣣䣯䣣䢮䢢䣌䣣䣲䣣䣰䢮䢢䣏䣣䣻䢢䢴䢸䢯䢴䢺䢮䢢䢴䢲䢳䢳
䢳䣃䢳䢯䣊䢳䢷䢪䢳䢫
機能追加,機能変更を以下の手順でおこなう[7][8][9].
1) 追加もしくは変更する機能に対するテストを作成する.
2) テストを実行し,失敗することを確認する.
3) テストが成功するようにプログラムを作成する.
4) テストを実行し,成功することを確認する.
5) 作成したプログラムをリファクタリングする.
6) 1)から 5)を繰り返し,段階的にプログラムを作成する.
著者らは上記の手順で開発する利点として,自動化された
回帰テスト一式が得られる[8],という点に着目した.回帰テ
ストとは,プログラムの動作が変わっていないことを確認す
るテストである.プログラムを変更する際,回帰テストを使
うことで,変更が予想外の部分に影響を与えていないか確認
できる.
テスト駆動開発で RTC を開発することで,RTC に対する回
帰テストが得られる.回帰テストがあれば,RTC に対して頻
繁に機能追加や機能変更,リファクタリングをおこなっても
不具合の発生を抑えられる.また,回帰テストが自動化され
ているため,短時間で動作検証ができる.そのため,複数の
OS 向けに RTC を開発する場合でも動作検証の負担を軽減で
きる.
2.3. RTC をテストする際の問題点
RTC のテストでは,RTC にデータを入力し,それに対して
RTC から出力されたデータが正しいかどうかを確認する.RTC
へのデータの入出力にはポートと呼ばれる機構を使う.ポー
トは,OMG(Object Management Group)の RTC 仕様に定義さ
れているものである[10].OpenRTM -aist は,OMG の RTC 仕様
で定義されているポートを拡張し,データポート[1]とサービ
スポート[1]を実装している.
ポートを使うためには,ポートの仕様に従って数十行程度
のプログラムを記述しなければならない.RTC にデータを入
出力するテストを作成する度に,ポートを使うための数十行
のプログラムを記述するのは負担が大きい.場合によっては,
テストの本質である入出力データの照合よりも,ポートを使
うためのプログラムを記述することに時間を取られる可能性
がある.
テスト駆動開発では,テストをしながら段階的にプログラ
ムを作成していく.テストの作成に時間がかかる場合,テス
ト駆動開発の開発効率は低くなってしまう.RTC にテスト駆
動開発を導入するためには,RTC のテストを短時間で作成で
きるようにする必要がある.
RTC
Core Logic
RT-Seam
OpenRTM-aist
Fig. 1 Relationship among core logic, RT-Seam, and OpenRTM -aist
3.1. RT-Seam の仕組み
通常,RTC の開発者は,RTC のクラスを作成し,その中に
コアロジックを記述する.コアロジックは他の RTC とデータ
をやり取りするためにポートのクラスである InPort クラスや
OutPort クラスを使う(図 2,図 3).
前述したように,RTC のテストの作成に時間がかかる原因
は,ポートを使うために多くのプログラムを記述しなければ
ならないことである.そこで,RT-Seam では,RTC の開発者
が直接ポートを使わないようにした.RT-Seam を使って RTC
を作成する場合,RT-Seam がポートを生成し,コアロジック
とポートとの間のデータのやりとりを仲介する(図 4).ポー
トを使う部分は RT-Seam 自身のテストで動作が検証されてい
るため,RTC の開発者がテストをする必要はない.RT-Seam
とコアロジックとの間では,ポートの機構を使わず,関数の
引数と戻り値でデータを受け渡す(図 5).そのため,コアロ
ジックへのデータの入出力を容易にテストできる.
RTC
InPort
OutPort
OutPort
InPort
RTC
Core Logic
:
Data flow
Fig. 2 Data exchange between two RTCs
OpenRTMaist
Core
Logic
InPort
OutPort
onExecute()
3.
read()
RTC のテスト のためのライブラリ”RT-Seam”
input_data
著者らは,RTC のテストを短時間で作成できるようにする
ため,RTC のテストをサポートするライブラリを開発した.
このライブラリ は,OpenRTM -aist が用意するクラス群と
RTC の開発者が作成するコアロジックとの間に位置するライ
ブラリである(図 1).このライブラリは,OpenRTM-aist とコ
アロジックとの繋ぎ目(seam)という意味で,RT-Seam と名
づけた.
write(output_data)
Fig. 3 Sequence diagram that shows interaction between core logic
and port
䣐䣱䢰䢢䢳䢳䢯䢷䢢䣒䣴䣱䣥䣧䣧䣦䣫䣰䣩䣵䢢䣱䣨䢢䣶䣪䣧䢢䢴䢲䢳䢳䢢䣌䣕䣏䣇䢢䣅䣱䣰䣨䣧䣴䣧䣰䣥䣧䢢䣱䣰䢢䣔䣱䣤䣱䣶䣫䣥䣵䢢䣣䣰䣦䢢䣏䣧䣥䣪䣣䣶䣴䣱䣰䣫䣥䣵䢮䢢䣑䣭䣣䣻䣣䣯䣣䢮䢢䣌䣣䣲䣣䣰䢮䢢䣏䣣䣻䢢䢴䢸䢯䢴䢺䢮䢢䢴䢲䢳䢳
䢳䣃䢳䢯䣊䢳䢷䢪䢴䢫
Table. 1 Lines of code comparison
RTC
OutPort RTC
InPort
Test of normal RTC
RT-Seam
OutPort
Lines of code
InPort
4.
Core Logic
:Data flow
RT-Seam
InPort
OutPort
おわりに
テスト駆動開発で RTC を開発する利点は,テスト駆動開発
によって得られる 自動化された回帰テストにより,安全に
RTC のプログラムを変更できることと,複数 OS 向けに RTC
を開発する場合でも動作検証の負担を軽減できることである.
実際にテスト駆動開発で RTC を開発する場合には,RTC の
テストを作成するのに時間がかかるという問題点があるが,
著者らが作成したライブラリである RT-Seam を使うことで,
RTC のテストを短時間で作成できることを示した.
Fig. 4 Data exchange between two RTCs using RT-Seam
OpenRTMaist
64
Test of RTC using
RT-Seam
12
Core
Logic
onExecute()
read()
謝
input_data
辞
本研究は,NEDO の委託事業である「次世代ロボット知能
化技術開発プロジェクト」において実施されたものである.
関係者各位に感謝の意を表す.
execute(input_data)
output_data
文
write(output_data)
献
安 藤 慶 昭 , 初 心 者 の た め の RT ミ ド ル ウ ェ ア 入 門
-OpenRTM-aist-1.0 とその使い方-, 日本ロボット学会誌, Vol. 28,
No. 5, pp.550-555, 2010
[2] 佐藤知正, 岡野克弥, RT ミドルウェアと知能モジュール構築プロ
ジェクト, 日本ロボット学会誌, Vol. 28, No. 5, pp.546-549, 2010
[3] OpenRTM-aist, http://www.openrtm.org/
[4] 中坊嘉宏, Biggs Geoffrey, ディペンダブルシステムのための高信
頼ソフトウェア開発, 第 11 回計測自動制御学会システムインテ
グレーション部門講演会 SI2010 予稿集, pp.1B1 -3, 2010
[5] 鷹栖尭大, 藤田恒彦, 座間勇輔, 石田宏司, 水川真, 安藤吉伸, 吉
見卓, 坂本武志, 知能モジュールの再利用を考慮した自律移動ロ
ボットのモデルベースデザイン, 第 28 回ロボット学会学術講演
会 RSJ2010 予稿集, pp.3P3-2, 2010
[6] 西野環, 吉海智晃, 中西雄飛, 岡田慧, 水内郁夫, 稲葉雅幸 ,
EusLisp と RT ミドルウェアを用いたプロトタイピングの容易な
ネットワーク分散型感覚行動統合システムの実現, 日本機械学
会ロボティクス・メカトロニクス講演会予稿集, pp.1P1-E15, 2008
[7] ケント・ベック, 長瀬嘉秀 監訳, (株)テクノロジックアート 訳,
テスト駆動開発入門, ピアソンエデュケーション, 2003
[8] ピート・マクブリーン, 村上雅章 訳, XP エクストリームプログ
ラミング懐疑編 XP はソフトウェア開発の救世主たりえるのか,
ピアソンエデュケーション, 2002
[9] マイケル・C・フェザーズ, ウルシステムズ(株) 監訳, 平澤章 訳,
越智典子 訳, 稲葉信之 訳, 田村友彦 訳, 小堀真義 訳, レガシ
ーコード改善ガイド, 翔泳社, 2009
[10] Object Management Group, Documents Associated With Robotic
Technology
Component
(RTC)
Version
1.0,
http://www.omg.org/spec/RTC/1.0/
[11] Google C++ Testing Framework, http://code.google.com/p/googletest/
[1]
Fig. 5 Sequence diagram that shows interaction among RT-Seam,
core logic, and port
3.2. RT-Seam を使った場合の効果
RT-Seam を使うとテストを短時間で作成できることを示す
ために,RT-Seam を使った場合と使わなかった場合で,テス
トのソースコードの行数を比較した.
テストの対象とする RTC は,データ入力ポートとデータ出
力ポートを 1 つずつ持ち,入力された整数に 1 を加算した値
を出力する.テストでは,RTC に 10 を入力すると,11 を出力
す る こ と を 確 認 し た . 使 用 し た RT ミ ド ル ウ ェ ア は
OpenRTM-aist-1.0.0-RELEASE の C++版である.また,テスト
作成には,テスト作成のためのフレームワークである Google
C++ Testing Framework[11]を使用した.
RT-Seam を使った場合と使わなかった場合のテストのソー
スコード行数を表 1 に示す.RT-Seam を使わない場合,テス
トのソースコードの約 60%がポートを使うための準備処理で
あった.RT-Seam を使うと,このポートの準備処理が不要に
なる.また,前述したように RT-Seam はコアロジックと
OpenRTM-aist との間に位置するラ イ ブ ラ リで あ るため ,
RT-Seam を使うと OpenRTM -aist のクラス群にほとんど依存し
ないコアロジックを作成 できるようになる. このため,
RT-Seam を使ったテストでは,通常 RTC を起動する前に必要
な OpenRTM-aist の初期化処理も不要になる.これらの要因に
より,RT-Seam を使った場合,テストのソースコードの行数
を約 80%削減できた.
䣐䣱䢰䢢䢳䢳䢯䢷䢢䣒䣴䣱䣥䣧䣧䣦䣫䣰䣩䣵䢢䣱䣨䢢䣶䣪䣧䢢䢴䢲䢳䢳䢢䣌䣕䣏䣇䢢䣅䣱䣰䣨䣧䣴䣧䣰䣥䣧䢢䣱䣰䢢䣔䣱䣤䣱䣶䣫䣥䣵䢢䣣䣰䣦䢢䣏䣧䣥䣪䣣䣶䣴䣱䣰䣫䣥䣵䢮䢢䣑䣭䣣䣻䣣䣯䣣䢮䢢䣌䣣䣲䣣䣰䢮䢢䣏䣣䣻䢢䢴䢸䢯䢴䢺䢮䢢䢴䢲䢳䢳
䢳䣃䢳䢯䣊䢳䢷䢪䢵䢫