自己紹介福嶺 秀策 : Shusaku FUKUMINE
twitter :@shumach217
趣味:(ビール飲みながら)プログラミング
自称:固いものを少しだけ分かる柔かいエンジニア
FPGAからRuby on Rails, iOSまでw
shumachappというiOSアプリ出してます!!
!
!
!
!
!
現在の業務は低レイヤー(L1、L2)なんですが、ruby使ってます。
(実はRailsも)
組み込みについて
- アプリケーションに最適化されてアーキテクチャが特殊
- ハードディスクが無い(マイクロプロセッサ)
- ログは見れない。。。
- 基本、システムコールは使用不可。。。
- etc
組み込み開発の必需品!!
-> RS232による操作
RS232による操作
- メモリの操作
- 指定したアドレスのメモリをダンプ
- 指定したアドレスに値を書き込む
- コマンドを用意してRS232経由で実機の関数をコール
- 割り込みハンドラ等
!
!
!
!
!
!
!
メモリモニタの例
メモリ書き込み
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000000Aに1Aを書き込み
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000000 00 00 00 00 00 00 00 00 00 00 1A 00 00 00 00 00
ハンドラコール
> myHndr
(0B - 0F間を0Aをコピー)
メモリモニタ
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000000 00 00 00 00 00 00 00 00 00 00 1A 1A 1A 1A 1A 1A
このような流れを基本としてデバッグを行います
気づいた人もいると思いますが。。。
ワタシ、最近気づきましたwww。
rspecで
except(data).to match “00000000001A1A1A”
って出来きるんじゃない??
!
ということで作りました!!
ruby - 組み込み間で
メモリ操作(setter), メモリ値取得(getter), 関数コール
なI/Fを具備する環境を構築しました。
電気ポッドの仕様(例)
• 90度未満
• 沸騰
• 90度以上
• 保温
• 0.5s毎に割り込みが発生
• 温度で状態を決定
turnipでテスト記述すると!!
Scenario: 電気ポット(例)
Given 初期化
Given “40” 温度設定
When 割り込み発生
Then 沸騰中確認
Given “90” 温度設定
When 割り込み発生
Then 保温中確認
Scenario: 電気ポット(例)
Given 初期化
Given “40” 温度設定
Given “90” まで1度ずつインクリメント # 割り込み発生 & 内部で状態確認
Then 保温中確認
!
!
というような実機テストの自動化を出来る様にしました!!
単体・全体テストを含めた全てのテストパターンを
bundle exec rspec
で出来るのは感動!!
• この考え方って、デバッガでbreak時に自動で値の比較を行う事と等価!!
プログラムは
• メモリから情報を集めて
• 処理
• メモリに情報を書く
!
!
!
!
!
!
!
!
!
!
処理の同期を取ることが悩ましい。。。
イベント・ドリブンなプログラム
• イベント待ち
• 割り込み
• メモリから情報を集めて
• 処理
• メモリに情報を書く
• イベント待ち(同期がとれる!!)
!
!
!
!
!
!
!
イベント待ちがbreakになってくれて同期を取ることが出来る!!
• turnipを使用して実機テストの自動化をすると開発速度が大幅に上昇しました(自分比)
• TDDな感じで石橋を高速に叩いて渡れる!!
• このアプローチは万能では無いけど実は面白いのかも!!
組み込み相手でも出来るなら、iOSデバイスでも!!
iOSの実機テストの主なテストフレームワーク
- KIF
Squareが作成した
objective-cベース
- Frank
cucumber
シミュレーション
私が欲しいテストフレームワーク
- テストコード
- rubyの手軽さが欲しい!!
- 実機動作
- シミュレータは実機と動作が違う!!
- 外部からオブジェクト操作、状態をモニタ
ということで、iOS用にも作成しています♪
objective-cというかiOSなので、メモリではなくて、オブジェクトベース -> JSONで!!
except(data).to match “{“type”:”getObject”, “data”:”hoge”}”
作成中なんですけど、基本的な動作は目処が付いています
Scenario: iOSテスト
Given 初期化
When タブを1に切替
Then PatternB_1を確認
When PatternB_2へ移動
Then PatternB_2を確認
• turnip記述でiOSデバイスをリモート操作!!
• その時に内部状態を取得して比較!!
まとめ
• turnipを実機テストに用いると想像以上に良さそう!!
• iOS用はもう少しまとまったら公開します!(きっと)
告知
• Cloud on the Beach 2014 4/26に開催決定!!
• http://jaws-ug.jp/es/cloud-on-the-beach-2014-in-%E6%B2%96%E7%B8%84/
• JASW-UG沖縄
!
!
!
!
!
!
!
いい仕事しますよw。
ビーチでは何かが起こる!!
是非参加して下さい♪♪