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
69
Circuits.GPIOはいかにテストされているか
pojiro
July 23, 2022
Tweet
Share
More Decks by pojiro
See All by pojiro
分野に潜むツールの紹介
pojiro
1
440
Raspberry Pi Mouse を Nerves で動かしてみた
pojiro
0
1.1k
Raspberry Pi で試す 組み込みLinux⼊⾨ Nerves の場合
pojiro
2
330
おいでよ! Nerves JP!
pojiro
1
210
描画ライブラリScenic紹介
pojiro
0
110
Nerves tips, /bin/sh & nerves_heart
pojiro
0
27
Elixir/NervesでどこまでできるのIoT?
pojiro
1
270
『推し』で仕事をする
pojiro
1
100
OSSを全面利用して商用プロダクトを作る
pojiro
2
890
Other Decks in Technology
See All in Technology
Qdrant を用いた検索改善施策の紹介 / Search Engineering Tech Talk 2024 Summer
visional_engineering_and_design
2
260
パートナー企業のテクニカルサポートエンジニアとして気になる、より良い AWS サポートの利活用について
kazzpapa3
0
140
運営11年目タイトルを守る最強の盾の有効性と活用法
mixi_engineers
PRO
2
110
【㈱アイモバイル】エンジニア向け会社説明資料
imobile
0
480
小さな勉強会の始め方、広げ方、あるいは友達の作り方 / How to Start, Grow, and Build Connections with Small Study Groups
ar_tama
6
3.2k
CData Virtuality 日本ローンチイベントのKeynote
cdataj
0
400
不要なリソースを自動で定期的に整理する方法 ~Sandboxアカウントのコストを削減しよう!~
amixedcolor
4
180
普通の Web エンジニアのための様相論理入門 #yapcjapan / YAPC Hakodate 2024
ytaka23
7
1.7k
Develop to Survive - YAPC::Hakodate 2024 Keynote
moznion
8
3.4k
From LibreOffice to « La Suite » : providing civil servants with Free Software sovereign tools
bluehats
0
110
AWSの初級者向けAI・ML資格『AWS Certified AI Practitioner』の傾向と対策/So You Want To Pass AWS Certified AI Practitioner
quiver
0
750
多数のWebサービスをECS/Fargate構成で効率よく構築・運用するなら copilot-cli
interu
2
120
Featured
See All Featured
From Idea to $5000 a Month in 5 Months
shpigford
381
46k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
30
1.7k
How to Think Like a Performance Engineer
csswizardry
17
1k
Navigating Team Friction
lara
183
14k
Teambox: Starting and Learning
jrom
132
8.7k
Testing 201, or: Great Expectations
jmmastey
38
7k
Bootstrapping a Software Product
garrettdimon
PRO
304
110k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
Raft: Consensus for Rubyists
vanstee
136
6.6k
BBQ
matthewcrist
85
9.2k
Being A Developer After 40
akosma
84
590k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
9
600
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!!