ラベル Test の投稿を表示しています。 すべての投稿を表示
ラベル Test の投稿を表示しています。 すべての投稿を表示

2013年4月29日月曜日

catkinでのpythonのtestについて

catkinにはまだなれません。

catkin化したパッケージのテストについて調べたので書いてみます。
catkinはとにかくドキュメントが少なすぎて泣ける。

普段pythonしかコード書かないので、pythonのtestについてです。

catkinではpythonでのtestにnoseというフレームワークを基本的に使うみたいです。
unittestフレームワークを使ったコードはそのまま使えるので、
あまり意識しなくても大丈夫かも。

まず、テストファイルをこれまでと同様に準備します。

で、CMakeLists.txtに
catkin_add_nosetests(test/unit)

などと書きます。

noseではテストをパッケージにできるので、
test/unit以下にunittestのファイルと__init__.pyを置いておけば
すべて実行されるみたいです。

で、rostestのほうは、

add_rostest(test/***.test)

と書きます。
中身は今までどおり、rostestパッケージを使った書き方でよさそうです。

これで、

$ catkin_make run_tests
とすれば、すべてのパッケージのテストが実施されます。

$ cd WORKSPACE/build
$ make run_tests_PACKAGE_NAME

で、指定したパッケージだけのテストもできます。
いろんなソースとか調べた方法なので、もし、もっとちゃんとしたドキュメントとか
ご存知の方いたら教えてください。

2010年4月11日日曜日

Pythonコードをunittestでテストする

たまにはまじめにコードを書こうと思い、テストの勉強です。


ROSではPythonのテストはそのパッケージであるunittestを使ってテストするのが標準のようです。
C++はgtestというgoogleが作ったテスト環境を使っています。

pythonのunittestもよく分かっていないので、その勉強からです。

↓のへんを読みました。


ようするに
unittest.TestCaseクラスにメソッドを定義しておくと、それを順に呼んでくれる。
assert_, assertRaises, assertEqualsなどを使って結果が想定どおりかどうかを確かめる。
テスト前に呼ばれるsetUp(), テスト後に呼ばれるtearDown()というメソッドが使える。

という感じですかね。(他にも機能はいっぱいあります)

普通テストドライバで関数呼び出しをずら〜っと手書きすると思いますが、
その辺の自動化と結果のレポートをしてくれるようです。

さっそくルンバのインタフェースプログラムに使いました。

TestRoombaOpen, TestRoombaCommand
という二つのテストケースクラスを作ったとすると、
テストプログラムから
test_support.run_unittest(TestRoombaOpen, TestRoombaCommand)

として呼び出すと思いますが、
rostestの場合は、

import rostest
rostest.unitrun('test_roombaif', sys.argv[0], TestRoombaOpen)
rostest.unitrun('test_roombaif', sys.argv[0], TestRoombaCommand)

とするみたいです。

そして、
CMakeList.txtに
rosbuild_add_pyunit(test/test_roombaif.py)
を追加します。

この状態で
$ make test
するとテストが実行され、結果が
~/.ros/test_results/otl_roomba/test_roombaif.py.xml
として保存されます。

中身は↓みたいな感じです。
<testsuite errors="0" failures="0" name="unittest.TestSuite" tests="35" time="17.229">
  <testcase classname="__main__.TestRoombaCommand" name="test_ascii" time="0.6085"></testcase>
......
  <testcase classname="__main__.TestRoombaCommand" name="test_vel9" time="0.5080"></testcase>
  <system-out><![CDATA[speed limit over -501 < -500
rad limit over -2001 < -2000
speed limit over 501 > 500
rad limit over 2001 > 2000
speed limit over -501 < -500
rad limit over -2001 < -2000
]]></system-out>
  <system-err><![CDATA[]]></system-err>
</testsuite>

これは単体テスト(ROSノード無関係)用です。

いっぽうでROSノードレベルのテストをする場合は以下のようにして呼び出します。
rostest.rosrun(PKG, 'test_bare_bones', TestBareBones)

あとはrostestを使ったテストですがこれはまた次回にしましょう。