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
230
分野に潜むツールの紹介
pojiro
1
630
Raspberry Pi Mouse を Nerves で動かしてみた
pojiro
0
1.3k
Raspberry Pi で試す 組み込みLinux⼊⾨ Nerves の場合
pojiro
2
410
おいでよ! Nerves JP!
pojiro
1
270
描画ライブラリScenic紹介
pojiro
0
160
Nerves tips, /bin/sh & nerves_heart
pojiro
0
49
Elixir/NervesでどこまでできるのIoT?
pojiro
1
360
『推し』で仕事をする
pojiro
1
140
Other Decks in Technology
See All in Technology
実践!カスタムインストラクション&スラッシュコマンド
puku0x
0
540
バイブスに「型」を!Kent Beckに学ぶ、AI時代のテスト駆動開発
amixedcolor
2
590
いま注目のAIエージェントを作ってみよう
supermarimobros
0
360
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
440
roppongirb_20250911
igaiga
1
250
AIエージェントで90秒の広告動画を制作!台本・音声・映像・編集をつなぐAWS最新アーキテクチャの実践
nasuvitz
3
360
使いやすいプラットフォームの作り方 ー LINEヤフーのKubernetes基盤に学ぶ理論と実践
lycorptech_jp
PRO
1
160
「その開発、認知負荷高すぎませんか?」Platform Engineeringで始める開発者体験カイゼン術
sansantech
PRO
2
860
共有と分離 - Compose Multiplatform "本番導入" の設計指針
error96num
2
1.2k
メルカリIBISの紹介
0gm
0
370
Create Ruby native extension gem with Go
sue445
0
130
エンジニアリングマネージャーの成長の道筋とキャリア / Developers Summit 2025 KANSAI
daiksy
3
1.1k
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Faster Mobile Websites
deanohume
309
31k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
The Power of CSS Pseudo Elements
geoffreycrofte
77
6k
Statistics for Hackers
jakevdp
799
220k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Unsuck your backbone
ammeep
671
58k
How GitHub (no longer) Works
holman
315
140k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.1k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
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!!