皆さん、夏休みはいかがお過ごしでしたか?
…そんなものはなかったですか?
私はア○プラで韓ドラ漬けの日々を送っていました。
撮影裏映像まで見ちゃってドはまりしていました。
恋愛ドラマもいいですが、殺伐としたサスペンスやアクションも魅力的ですよね(^^)
…そして、あっという間に夏は過ぎ、秋の予感とともに現実に戻って参りました。
いっぱい休んだ分、やることもいっぱい…。
あ~あ、気付いたらタスク終わってたりしないかなあ( ˘ω˘ )
なんてことを思っても終わらないので
自分の代わりに動いてくれるものを導入しましょう。
そう、殺伐としたテストの現場に救いをもたらすAUTOmealです。
今回は特別編、シリアル通信についてです!!
※本連載ではAUTOmealプロトタイプを使用しています。現在発売されている製品版とは一部異なりますのでご了承ください。
はじめに。前回の振り返り
AUTOmealは、組み込み機器のテストにおける「制御」「計測」「判定」を、人に代わって自動で実行してくれる、
夢のようなソリューションです。
連載第1回、第2回、第3回ではそれぞれ「制御」と「計測」、そして「判定」をやってみました。
第1回:制御編の振り返り
制御編では、Pythonスクリプトを使って扇風機を自動制御してみました!
ボタンをポチポチしたり、距離センサの前で手を近づけたり離したりするところを AUTOmealが代わりにやってくれたわけです。
【記事へのリンク】💡 「【連載】ラズパイとPythonでテスト自動化やってみた~AUTOmeal:制御編~」
第2回:計測編の振り返り
計測編では、I/Fボードを付け替えて計測をできるようにしました!
アナログの波形をリアルタイムで計測してAUTOmealアプリ上に表示させるところをご覧いただきました。
波形のChart表示だけでなく、スクリプトを使って取得した値をログに出力させることもできました。
【記事へのリンク】 💡 「【連載】ラズパイとPythonでテスト自動化やってみた~AUTOmeal:計測編~」
第3回:判定編の振り返り
判定編では、制御、計測した結果を判定してみました!
電源のON/OFFやモータの動作状況などをどのようにPythonスクリプトで判定しているのかもご覧いただきました。
判定まで実施できれば回帰テストも使いまわしで行けるのでテストが圧倒的に楽になります。
【記事へのリンク】 💡 「【連載】ラズパイとPythonでテスト自動化やってみた~AUTOmeal:判定編~」
第3回までで「制御」「計測」「判定」ひととおりご紹介したため、
これでもうAUTOmealの基礎はバッチリ!!
なのですが、まだまだご紹介したいことがあります。
気になっている方も多いでしょう、
シリアル通信部分のテストについて、どのように自動化すればいいのか?
というところをご紹介いたします!
自動化するにあたって、AUTOmealが周辺機器やモニタツールにまるっと成り代わることもできますし、
今使っているツールやテスト環境と組み合わせることで既存の資源を利用しながら自動化を図ることも可能なため、
「もうテストのシステムができあがってるし、今更自動化は難しいよな…」
とお悩みの方にもおすすめです。
シリアル通信のテスト
通信部分のテストの現状
組込み業界ではシリアル通信を用いられることも多いかと思います。
その際はどの部分をどのように確認しているでしょうか?
1. RAMの監視
通信そのものではなく、
通信を行った結果、正しく処理されたかをメモリの内容から判断する方法ですね。
従来のRAMの監視は以下のように行われることが多いのではないでしょうか?
- PCとターゲット基盤を直接繋いでPCのRAMモニタで監視、書き換え(ターゲットにRAMアクセスIFが存在する)
- PCとターゲット基盤の間に専用のRAMモニタツールを挟んでPCのRAMモニタで監視
この場合、監視のためのログ確認は目視で確認する必要があります。
通信内容はもちろん、RAMの内容も把握していないと処理が正しいかどうか判断することは難しいです。
また、RAMの書き換えもRAMモニタから手動で実施する必要があり、
作業者に負担がかかっています。
専用のモニタツールを用いる場合は接続もその分多くなり、
煩わしさもあるかと思います。
2. オシロスコープやラインモニタでの通信内容の確認
シリアル通信ラインの電気的なHi/Loを横取りして、通信内容を確認する方法です。
オシロスコープや市販のラインモニタツール等を使用して通信ラインを監視し、
流れているデータが期待値通りか目視で確認します。
やはりオシロスコープに慣れていなかったり、
ツールによっては準備が大変で手間取ってしまったり、
プロービングに失敗してしまうこともあります。
ここも手作業、目視での確認のため
作業者への負担がかかるところです。
3. シミュレータでの周辺機器代替
実際の周辺機器と繋ぐ代わりに、
シミュレータをターゲット基盤と繋げてデータのやり取りを確認する場合もあります。
実機に成り代わってターゲットからのデータが期待値通りかチェックしたり、
ターゲットからのデータに応じて、レスポンスとしてデータを送信します。
周辺装置の代わりに疑似的なものを用いることができるというのは利点ですが、
内製でイチからシミュレータを作っていたり、
結局は手動操作、目視確認になり、
やはり人の手をかける必要があります。
AUTOmealなら、
上記で示したような従来のテスト方法における課題を解決することができます。
AUTOmealで実現する自動化
では、AUTOmealではどのようにして通信部分のテストを自動化しているのか、
かんたんに解説します。
通信部分のテストの例としては、周辺機器とターゲット機器が通信をしていて、UARTを用いている想定です。
AUTOmealを使用するとこの構成をどのように変更可能になるのか、
かんたんに図にしてみました。
まず、AUTOmealのランナーアプリはPCのCOMポートを利用してシリアル通信の送受信を行います。
(´-`).。oO(実際はシリアル変換用のケーブル等は別途準備が必要ですが…)
これによって、
ターゲットと通信を行っている周辺機器に成り代わって、疑似的な通信再現を行います。
そのため、テストの際にわざわざ周辺機器を用意する必要がなくなります。
もちろん、周辺機器を繋げて通信部分のテストをすることも可能です。
使うものを減らすことができるだけでもありがたいでありますが、
それを自動化できてしまうというのがこのソリューションのすごいところですね。
データの送受信はランナーアプリから手動で行うことができますが、
ランナーアプリが操作できる部分はPythonスクリプトで自動化が可能です。
送受信したデータもログに残りますし、UI上で通信内容を確認できます。
スクリプトにより自動化することで、
今まで様々な機器を用いながら手作業で行っていたテスト業務を
AUTOmealが一手に担ってくれます。
たとえば、
- ・周辺機器をAUTOmealに置き換えて
- ・ターゲットとのシリアル通信を再現し
- ・その通信電文をモニタリングして
- ・意図した内容になっているか確認し
- ・意図しない内容の場合はNGとする
というようにテストを作ることもできます。
このあたりのテストは内製のツールを使ったりして行ってきたという方も多いのではないでしょうか?
お手製のものだとツールを作ったり使ったりするにも時間がかかったり、
独自の知識が必要になるかと思いますが、
AUTOmealだと学習コストが少なく、
かつ汎用的に使えるのでおすすめです。
シリアル通信部のテスト自動化
実際にAUTOmealでシリアル通信部分のテスト自動化をやってみたいと思います。
今回は
- ・UARTでデータの送受信を行っているターゲットに対して、
- ・AUTOmealからコマンドを送信し、
- ・それに対するレスポンスを受信したときにそのデータをチェックし、
- ・想定の結果であればOK、
- ・想定と異なる場合はNGにする
…という流れでやっていきます。
扇風機の仕様
今回の例で挙げる扇風機の仕様をかんたんにご説明します。
扇風機の機能としては以下の機能があります。
- 電源のON/OFF
- 風量の切り替え
扇風機へ送信するコマンドは以下の3つです。
- 電源のON
- 電源のOFF
- 風量の切り替え
扇風機は状態遷移した際に、現在のステータスを通知します。
扇風機がきちんと状態遷移しているかを確認したいため、
コマンドを送信後に、扇風機から通知されるステータス情報を受信し、
その結果、想定通りのステータスかをOK/NGで判定すればよいですね!
準備
テストの実施前に必要な準備についてご説明します。
AUTOmealの設定はSettingsフォルダ内のSettingファイルで可能
…というお話は前回まででもさせていただきました。
今回はシリアル通信での送受信部分を確認するため、”SerialCmdSettings.json”でコマンドの設定も行います。
3つのコマンドは次のように定義しました。
- “POWER_ON” コマンド
- “SWITCH_AIRFLOW” コマンド
- “POWER_OFF” コマンド
今回は下図のように設定しましたが、
ターゲットやテストに合わせてコマンドの形式もそれぞれかと思います。
Settingファイルで任意にかんたんに設定することができるため、このあたりも汎用的にお使いいただけます。
前回までのテストと変わったところとしてはこれくらいです。
他の設定は前回と同じような感じで使っていくことができます。
テスト
それでは、上記の設定をもってテストを行っていきます。
まずは今回、どのようなシナリオで動かすかを軽くご説明します。
UARTでコマンドの送受信を行い、データを確認して期待値どおりか結果判定する処理の例として
扇風機では以下のような流れで確認したいと思います。
- 電源がONになっているか
- 風量が中になっているか
- 風量が強になっている
- 風量が弱になっているか
- 電源がOFFになっているか
PCと扇風機間のシーケンスとしては以下のようになります。
PC側からコマンドを送り、扇風機はそれに合わせて処理を行ったらステータスをPCへ返します。
そのステータスが期待値と一致しているかをPCで確認し、OK/NGかを判定します。
上記のような処理をPythonスクリプトで書くと次のようになります。
### “電源ON”テスト
tlog.info(‘\”POWER_ON\”コマンド送信’)
tm.serial(‘POWER_ON’)
tlog.info(‘ステータス通知受信’)
res = tm.get_serial()
tlog.info(‘\”電源[ON]\”かチェック…’)
if res == EXPECTATION_VALUE_POWER_ON:
tlog.info(‘…OK’)
else:
tlog.info(‘…NG’)
### “風量切り替え”テスト
tlog.info(‘\”SWITCH_AIRFLOW\”コマンド送信’)
tm.serial(‘SWITCH_AIRFLOW’)
tlog.info(‘ステータス通知受信’)
res = tm.get_serial()
tlog.info(‘\”風量[中]\”かチェック…’)
if res == EXPECTATION_VALUE_AIRFLOW_MIDDLE:
tlog.info(‘…OK’)
else:
tlog.info(‘…NG’)
### “風量切り替え”テスト
tlog.info(‘\”SWITCH_AIRFLOW\”コマンド送信’)
tm.serial(‘SWITCH_AIRFLOW’)
tlog.info(‘ステータス通知受信’)
res = tm.get_serial()
tlog.info(‘\”風量[強]]\”かチェック…’)
if res == EXPECTATION_VALUE_AIRFLOW_HIGH:
tlog.info(‘…OK’)
else:
tlog.info(‘…NG’)
### “風量切り替え”テスト
tlog.info(‘\”SWITCH_AIRFLOW\”コマンド送信’)
tm.serial(‘SWITCH_AIRFLOW’)
tlog.info(‘ステータス通知受信’)
res = tm.get_serial()
tlog.info(‘\”風量[弱]]\”かチェック…’)
if res == EXPECTATION_VALUE_AIRFLOW_LOW:
tlog.info(‘…OK’)
else:
tlog.info(‘…NG’)
### “電源OFF”テスト
tlog.info(‘\”POWER_OFF\”コマンド送信’)
tm.serial(‘POWER_OFF’)
tlog.info(‘ステータス通知受信’)
res = tm.get_serial()
tlog.info(‘\”電源[OFF]\”かチェック…’)
if res == EXPECTATION_VALUE_POWER_OFF:
tlog.info(‘…OK’)
else:
tlog.info(‘…NG’)
tm.serial() は指定のコマンドを送信する関数です。
ここでは “SerialCmdSettings.json” で設定した”POWER_ON”などそれぞれのコマンドを送信しています。
今回は動作後、ステータスの変更をした際に通知を出すようにしています。
シリアル通信による最新の送受信データの取得は get_serial() で行っています。
PCはターゲットから受信したステータス情報を、定義していた期待値と比較し、
期待値どおりの結果になっているかを判定します。
では実際にAUTOmealでモニタリングした際の画面をお見せしたいと思います!
シリアル通信のモニタリングは以下のようにランナーアプリから行えます。
画面左下にはAUTOmealから扇風機へ投げるコマンドの情報が表示されています。
そして、画面中央にはPC⇔扇風機間のコマンド送受信の情報が表示され、随時更新されていきます。
ターゲットを動かしながら通信の様子を分かりやすく確認することができるのがいいですね!
もちろんリアルタイムで確認することもできますし、過去ログデータを開いて後から確認することもできます。
タイムスタンプから他のチャートなどとも同期しているため、このときどうなっていたというところを
いろんな観点から確認できるのも嬉しいです。
Pythonを実行したときにコマンドライン上にも表示されるログは以下のように出しました。
どういう操作をして、結果どうであったか確認することができます。
今回はAUTOmealでコマンドの送受信をして、結果判定までできるところをお見せしたかったのでかんたんな処理の例になりましたが、
こちらの例を元に、それぞれのテスト対象や環境で活用できそうかどうかのイメージを付けていただけたら幸いです。
通信部分のテスト自動化してみた感想
手順の観点からいうと
なんか、前回までとそんな変わらなくない?身構えてたけど全然ラク。
というのが正直な感想です。
コマンドを設定するファイルは一つ追加になりましたが、それ以外は前回までとほぼ同じでした。
スクリプトに関しても今回も処理部分はコピペ、ちょい変でいけました!
Pythonスクリプトは、実際の処理部分以外はだいたい変更がないため、
一度ベースを作ってしまえば少し手を加えるだけでかんたんに自動テストでやりたいことができてしまいますね。
学習コストがだいぶ抑えられるなというのを、この4回目までやってきてすごく感じています。
内製だったり、専用のツールやオシロスコープだと、
なんだかんだ言って使い方の資料があまりまとまっていなかったり、
使いこなせるようになるまで教えてもらいながら結構使い込まないといけなかったり、
よく分からないつまみやボタンが多くて、しばらく使わなかったら
「あれ、これどうするんだけ?」となりがちな気がします。
その点、やっぱりAUTOmealは誰でもかんたんに使えそうな感じです。
シリアル通信部分のテスト自動化というところに対しては、
届きそうで届かなかった痒いところに手が届く感がありますね。
そして、めちゃくちゃスマートにその体験をお届けされている感が半端ないです。(語彙力)
「おおー!すごーい!!」ってなるようなことを、涼しい顔してやってる。
同じクラスにいたら心の中でちょっと嫉妬しちゃうような存在…。
AUTOmeal…どこまで行くのでしょうか
最後に
いかがでしたか?
今回は、シリアル通信部分にテスト自動化を取り入れるヒントをお届けできたのではないかなと思います。
シミュレータや通信内容を確認するツールはそれぞれあり、
テストをサポートする環境をいくらかは整えてきていても、
そこを自動化する一歩がなかなか踏み出せないという方もいらっしゃったのではないでしょうか?
「ラズパイとPythonでテスト自動化やってみた」の連載としては以上になりますが、
今後もAUTOmealに関する記事は随時お届けしていくので、お楽しみに!
だんだんと日も短くなり、寒暖差も出てきました。
季節柄お体ご自愛下さい。
最後までお読みいただき、ありがとうございました!
テスト自動化ツールまとめ
~どれを使えばいいのか書いてみた~
年々、大規模化するソフトウェア開発。品質に対する要求レベルも上昇しており、テストにかかる工数も増加しています。そこで、自動化へ一歩踏み出す皆さんが導入からつまずかないよう、テスト自動化の始め方と自動化ツールについてまとめてみました。
記事を読む
【 無料セミナー 】
組込み開発向けテスト自動化プラットフォームAUTOmeal デモウェビナー
AUTOmealによる環境構築から実際の自動テストの様子まで、基本的な使い方をデモンストレーションいたします。ぜひ実動作をご覧いただき、その効果をご確認ください。
お申し込みはこちら!