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
55
Circuits.GPIOはいかにテストされているか
pojiro
July 23, 2022
Tweet
Share
More Decks by pojiro
See All by pojiro
Raspberry Pi Mouse を Nerves で動かしてみた
pojiro
0
950
Raspberry Pi で試す 組み込みLinux⼊⾨ Nerves の場合
pojiro
2
200
おいでよ! Nerves JP!
pojiro
1
150
描画ライブラリScenic紹介
pojiro
0
71
Nerves tips, /bin/sh & nerves_heart
pojiro
0
17
Elixir/NervesでどこまでできるのIoT?
pojiro
1
200
『推し』で仕事をする
pojiro
1
95
OSSを全面利用して商用プロダクトを作る
pojiro
2
770
出張の多い現場エンジニアをサポートするデバイス
pojiro
0
970
Other Decks in Technology
See All in Technology
Google Cloud の AI を支える裏側のインフラを垣間見る!
maroon1st
0
160
"好き"との生活/Regularly update profile with GitHub Actions
judeeeee
0
150
小さな開発会社がWebサービスを作る理由
polidog
PRO
1
150
クラウドサインにおけるプロダクトマネージャーの役割と開発プロセス / 20240410_cloudsign-PdM
bengo4com
1
680
Postman v10リリース後を振り返る
nagix
0
130
プロトタイピングによる不確実性の低減 / Reducing Uncertainty through Prototyping
ohbarye
3
230
コンパウンドスタートアップのためのスケーラブルでセキュアなInfrastructure as Codeパイプラインを考える / Scalable and Secure Infrastructure as Code Pipeline for a Compound Startup
yuyatakeyama
3
2.1k
The CloudCompare project by Dr. Daniel Girardeau-Montaut
kentaitakura
0
500
Four keys改善の取り組み事例紹介
sansantech
PRO
3
230
Algyan イベント振り返り
linyixian
0
190
Janus
bkuhlmann
1
490
反実仮想機械学習とは何か
usaito
PRO
6
1.9k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3k
Building Better People: How to give real-time feedback that sticks.
wjessup
354
18k
Code Review Best Practice
trishagee
54
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
124
32k
What’s in a name? Adding method to the madness
productmarketing
PRO
15
2.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
39
4.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
658
120k
What's new in Ruby 2.0
geeforr
337
31k
Testing 201, or: Great Expectations
jmmastey
27
6.3k
Into the Great Unknown - MozCon
thekraken
10
980
The Art of Programming - Codeland 2020
erikaheidi
41
12k
Creatively Recalculating Your Daily Design Routine
revolveconf
209
11k
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!!