Circuits.GPIOは
いかにテストされているか
2022/07/23 NervesJP #27
What’s Circuits.GPIO?
iex> alias Circuits.GPIO
iex> {:ok, pin} = GPIO.open(1, :output)
iex> :ok = GPIO.write(pin, 1)
Circuits.GPIOの構成
ちょっとだけ中身をのぞこう(時間あるかな?
Circuits.GPIOをテストするには?
なので、
に分けてやれば、�後者はどんな環境でもテストを回すことができる
どのように分け、後者のテストをしているか興味あり!!
ユーザの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で
このパターンは?見覚えが、、
NervesJP.Behabiour
NervesJP.Impl
NervesJP.Mock
ビヘイビアで各関数の入出力、�インタフェースを定義する
OSのファイル操作や外部のWeb APIなど�応答をコントロールできない関数を�まとめたモジュール
応答をコントロール可能なMockに切り替え、�このインタフェースを呼び出す�ロジックのテストを可能にする
まとめ
Have nice Nerves days!!!�Thank you!!