Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Circuits.GPIOはいかにテストされているか
Search
pojiro
July 23, 2022
Technology
0
110
Circuits.GPIOはいかにテストされているか
pojiro
July 23, 2022
Tweet
Share
More Decks by pojiro
See All by pojiro
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
280
分野に潜むツールの紹介
pojiro
1
640
Raspberry Pi Mouse を Nerves で動かしてみた
pojiro
0
1.3k
Raspberry Pi で試す 組み込みLinux⼊⾨ Nerves の場合
pojiro
2
420
おいでよ! Nerves JP!
pojiro
1
270
描画ライブラリScenic紹介
pojiro
0
160
Nerves tips, /bin/sh & nerves_heart
pojiro
0
52
Elixir/NervesでどこまでできるのIoT?
pojiro
1
360
『推し』で仕事をする
pojiro
1
140
Other Decks in Technology
See All in Technology
クラウドとリアルの融合により、製造業はどう変わるのか?〜クラスメソッドの製造業への取組と共に〜
hamadakoji
0
450
DMMの検索システムをSolrからElasticCloudに移行した話
hmaa_ryo
0
170
Okta Identity Governanceで実現する最小権限の原則
demaecan
0
190
Observability — Extending Into Incident Response
nari_ex
1
570
猫でもわかるAmazon Q Developer CLI 解体新書
kentapapa
1
130
ざっくり学ぶ 『エンジニアリングリーダー 技術組織を育てるリーダーシップと セルフマネジメント』 / 50 minute Engineering Leader
iwashi86
4
2.7k
AIプロダクトのプロンプト実践テクニック / Practical Techniques for AI Product Prompts
saka2jp
0
120
個人でデジタル庁の デザインシステムをVue.jsで 作っている話
nishiharatsubasa
3
5.2k
20251027_マルチエージェントとは
almondo_event
1
470
アノテーション作業書作成のGood Practice
cierpa0905
PRO
0
220
OSSで50の競合と戦うためにやったこと
yamadashy
3
1k
AIでデータ活用を加速させる取り組み / Leveraging AI to accelerate data utilization
okiyuki99
5
1.3k
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
272
21k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Fireside Chat
paigeccino
41
3.7k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The World Runs on Bad Software
bkeepers
PRO
72
11k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Faster Mobile Websites
deanohume
310
31k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
650
BBQ
matthewcrist
89
9.9k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.6k
jQuery: Nuts, Bolts and Bling
dougneiner
65
7.9k
Transcript
Circuits.GPIOは いかにテストされているか 2022/07/23 NervesJP #27
What’s Circuits.GPIO? • Linux のGPIO(General-purpose input/output), 汎用入出力ピンを 操作するElixirのライブラリ • NervesでLチカをやったことがあれば使ったことがあるはず
◦ だけど、Nerves 専用のライブラリというわけではなく、 LinuxのGPIOを持ったマシンであれば、ピュア Elixirプロジェクトからも使用することができます。 iex> alias Circuits.GPIO iex> {:ok, pin} = GPIO.open(1, :output) iex> :ok = GPIO.write(pin, 1)
Circuits.GPIOの構成 • lib/gpio.ex ◦ ユーザ向けAPI用モジュール • lib/gpio_nif.ex ◦ nif用モジュール •
src/* ◦ gpio操作の低レイヤ実装 • test/cicuits_gpio_test.exs ◦ テスト用モジュール、 mix test で実行される ◦ ユーザ向けAPI用モジュールのテストを行う ちょっとだけ中身をのぞこう(時間あるかな?
Circuits.GPIOをテストするには? • Linuxマシン固有のテストは 実機でなければできない なので、 - 実機でなければテストできない部分 - 実機でなくてもテストできる部分 に分けてやれば、
後者はどんな環境でもテストを回すことができる どのように分け、後者のテストをしているか興味あり!!
ユーザのAPIコールからGPIO操作までの流れ Circuit.GPIO Circuit.GPIO.Nif gpio_nif.c gpio_nif.h hal_sysfs.c /sys/class/gpio/* を操作 iex> alias
Circuits.GPIO # /sys/class/gpio/1/direction を “out” iex> {:ok, pin} = GPIO.open(1, :output) # /sys/class/gpio/1/value を “1” iex> :ok = GPIO.write(pin, 1)
/sys/class/gpio/* なしでテストするために Circuit.GPIO Circuit.GPIO.Nif gpio_nif.c gpio_nif.h hal_sysfs.c hal_stab.c テスト用実装
ポイント Circuit.GPIO Circuit.GPIO.Nif gpio_nif.c gpio_nif.h hal_sysfs.c hal_stab.c テスト用実装 インタフェースを定 義
sysfs非依存の ロジックを実装 sysfsをシミュレートするので はなく、テストに必要な応答 のみをする薄い実装にする テスト範囲は ユーザ向けAPIの関数から、 インタフェース関数の呼び出しま で 操作実装の切り替えは Makefileで
このパターンは?見覚えが、、 • そう、Moxでやることと同じ ◦ Mox: Elixir のテストサポートライブラリ https://github.com/dashbitco/mox NervesJP.Behabiour NervesJP.Impl
NervesJP.Mock ビヘイビアで各関数の入出力、 インタフェースを定義する OSのファイル操作や外部のWeb APIなど 応答をコントロールできない関数を まとめたモジュール 応答をコントロール可能なMockに切り替え、 このインタフェースを呼び出す ロジックのテストを可能にする
まとめ • Circuits.GPIOがどのようにテストされているかを紹介しました • POINT: インタフェースを定義して、 その内部実装を切り替える方法はテストに限らず有効!なことを理解しました ◦ Cならヘッダファイルがインタフェースとして使える ◦
ElixirならBehaviourがインタフェースとして使える Have nice Nerves days!!! Thank you!!