NaITE #33 LT「品質技術を知る、学ぶ、作る」を発表しました

##1. はじめに
2019年9月29日(日)に開催された[NaITE(長崎IT技術者会)](https://nagasaki-it-engineers.connpass.com/)の[#33 UnitTest入門](https://nagasaki-it-engineers.connpass.com/event/145218/)(ツイートまとめは[こちら](https://togetter.com/li/1410832)) のLT枠で「品質技術を知る、学ぶ、作る」を発表させていただきました。[NaITE](https://nagasaki-it-engineers.connpass.com/)の勉強会は何回か参加していますが発表は初めてです。参加されたみなさまのお役に少しでも立てれば幸いです。

##2. 資料
<script async class="speakerdeck-embed" data-id="f76c3d876ddf41f8a75e22ea61dd9cd8" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

資料に記載したURLリンクが踏めないため以下に補足します。
p.4ほか [アプリ実行時の消費電力チェックを自動化する検討](https://qiita.com/pbjpkas/items/ae3cb9653bbc56231223)
p.7 [JaSST Tokyoのまとめ(8ページ目)](https://togetter.com/li/1079456?page=8)[^1]
p.10 [ソフトウェアの品質保証の本質～技法の変遷から学ぶ～](http://jasst.jp/symposium/jasst17tokyo/pdf/A7.pdf)
p.12 [ソフトウェア品質シンポジウム2019](https://www.juse.jp/sqip/symposium/)
p.15ほか [出典：バグだけが品質と考えていませんか？～つながる世界に向けてSQuaRE ベースに品質を考えよう！～](https://www.ipa.go.jp/files/000045962.pdf)
p.17 [20年後のソフトウェアテストの話をしよう](https://builderscon.io/builderscon/tokyo/2019/session/783619e0-4c45-45cb-b29a-fbff39077f43)
p.17 [builderscon tokyo 2019で「20年後のソフトウェアテストの話をしよう」を発表しました #builderscon](http://yumulog.hatenablog.com/entry/2019/08/31/235727)
p.23 [電圧電流などを測定し、データ出力できる高機能テスター「SD-WWC01」](https://www.area-powers.jp/product/others/4580127696875/)
p.28 [mhama/M5StackHIDCtrlAltDel](https://github.com/mhama/M5StackHIDCtrlAltDel)
p.28 [M5Stackでコマンド操作](https://qiita.com/pbjpkas/items/c8c26837a1a5a243f4b6)
p.28 [Universal Serial Bus (USB) HID Usage Tables](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf)
p.38 [ソフトウェア品質保証 入門](https://www.amazon.co.jp/dp/4817192631)
p.38 [ソフトウェア品質保証の基本](https://www.amazon.co.jp/dp/4817196572/)
p.38 [ソフトウェア品質知識体系ガイド第2版](https://www.amazon.co.jp/dp/4274505227/)

##3. LTの補足
###3.1 品質技術のマッピング例(学びの地図)
LTでも触れましたが[NaITE](https://nagasaki-it-engineers.connpass.com/)はテストだけでなく開発や品質保証など様々なテーマで勉強会を開催されていて[資料](https://nagasaki-it-engineers.connpass.com/presentation/)も126件あがっています(2019/10/6時点)。ぜひ資料を読んでみたり勉強会に足を運んでみてください。

###3.2 実機デモ
デモは準備にちょっと時間がかかることと動画の再生は手持ちのモバイルルータが会場でうまく電波をつかめるか運任せなところがあるためテストベンチの現物を紹介するだけの予定でいたのですが、池田さんの[4th長崎QDG](https://nagasaki-it-engineers.connpass.com/event/122763/)紹介のあいだに準備が整い冒頭でデモをできました。

ただ、スピーカーから音声を出して再生中、一時停止中がわかるようにすればよかったとあとで気が付きました。改めてデモをする機会があれば改善したいです。

###3.3 「品質技術を作る」で触れなかったもの
LTでは品質技術を開発する動機や背景を厚めに話したぶん開発の手順を割愛しています。といっても特別なことはなく、1)目標を立てる→2)目標達成の確認方法を確立する、と資料の9ページ目に書いた通りです。

####3.3.1 目標設定
LTで取り上げた資源効率性ですが[JIS X 25023:2018(ISO/IEC 25023:2016) システム及びソフトウェア製品の品質要求及び評価(SQuaRE)―システム及びソフトウェア製品の品質の測定 ](https://webdesk.jsa.or.jp/books/W11M0090/index/?bunsyo_id=JIS%20X%2025023:2018) 8.3.2 資源効率性の測定量を見てもじつは消費電力は載っていません。こういう時はほかの規格[^2]を参照したり自前で定義することになります。自前で目標を立てるとこんな感じでしょうか。

|項目|内容|
|---|---|
|品質目標|ふだんと同じ使い方をしたときにふだんと同程度の消費電力であること|
|判定方法|消費電力を測定し基準値と比較する|
|判定基準|N回測定を行いその平均値が基準値のX倍以内であること|

「ふだんと同じ使い方」の中身も決める必要があります。

- バッテリーを取り付けた状態 or 外した状態
- 有効化する通信モジュール(WiFi/LTE/Bluetooth)
- 画面の明るさ
- スピーカー出力の音量
- 使用する充電器やケーブルの指定[^3]
- 外部サービスの指定[^4]
- 測定時の環境(室温、湿度)

今時点では基準を持っていないので先々例えば「N回測定しそのうち1回でも最大値が基準値のX倍を超えないこと」と基準が変わるかもしれません。NやXの値はひとまずN=10、X=1.1などと決めてテストベンチを仮組みし、実際に何回か測定して傾向が見えてきたら見直すと良いでしょう。

####3.3.2 確認手段
目標にマッチした確認方法を設計、実装します。電力であれば以下のような項目を検討します。

1. 瞬時値/積算値
2. 電圧や電流の測定レンジ、分解能
3. 計測時間の分解能(何秒ごとに測定するか)
4. 測定値の取得方法

今回は動画をストリーミング受信しながら再生したり一時停止したりとダイナミックな動作を行いながらその時々の電力を測定するので市販のスマホ用充電チェッカーを使ってある瞬間の値を測定することとしました。もし確認したいことがスリープ中の微弱な消費電力であれば微弱な電流を検出できる電流センサを用いて所定時間の積算値を求めるなど、目的に合った方法を設計し実装します。

##4. Unit TEST入門の感想
藤沢さんのUnit TEST入門のセッションです。

(1)Unit Testフレームワーク(JUnit)が使える言語(Java)でIDE(Eclipse)の支援があるとUnit Testがやりやすい。
(2)フレームワークがあってもUnit Testでテストできるように実装しないとテストするのは難しそう。
(3)仕様ベースでテスト設計を行い、次にカバレッジを満たすように足りないテストケースを補うと良さそう。
(4)ロジックをテストしたいとか、インターフェースをテストしたいとか、目的大事。

プログラムのチェックは実機で動かす[^5]かprintf()でログを出すかデバッガで変数の値を変えるくらいはやったことがあるものの、というのも(1)の段階で敷居が高かったのですが、テストツールを作るときに触っているArduino IDE[^6]に[ArduinoUnit](https://github.com/mmurdoch/arduinounit)というパッケージがあることがあとで調べて分かりました[^7][^8]。

今までならUnit Testができると判明しても何をどうすれバインダーとなるのが、まずは仕様ベースでチェックすることを挙げて分岐のからむものはカバレッジを意識しながらテストを足せばよいとすでに分かっているので敷居が下がった感じがします。

##5. おわりに
- 品質技術の開発はありものを調達していたり数十行のプログラムだったりして意外と難しくないと思っていただけたら嬉しいです。
- 8月～9月は[Maker Faire Tokyo 2019](https://makezine.jp/event/mft2019/)、[builderscon tokyo 2019](https://builderscon.io/tokyo/2019)、[CEDEC 2019](https://cedec.cesa.or.jp/2019/)、[ソフトウェア品質シンポジウム 2019](https://www.juse.jp/sqip/symposium/)、[技術書典7](https://techbookfest.org/event/tbf07)とインプットの機会がたくさんあり、このタイミングで品質保証の話を整理してアウトプットする機会を得られて良かったです。
- Unit Testの質問タイムや懇親会でお話ししたことで自分自身理解を深めることができました。

講師の藤沢さん、勉強会を開催された[NaITE](https://nagasaki-it-engineers.connpass.com/)の方々、参加されたみなさまにお礼を申し上げます。

[^1]: 1ページ当たりの表示数によってはページ番号がずれることがあります。
[^2]: 例えばパソコンのバッテリ動作時間であれば[JEITAバッテリ動作時間測定法](https://home.jeita.or.jp/cgi-bin/page/detail.cgi?n=84&ca=14)があります。
[^3]: よわよわな充電器や細いケーブルだとこれが原因で電流に制限がかかるので測定に対して十分な能力を持った機材が必要になります。
[^4]: 動画の再生であればコンテンツのビットレートやエンコード方式なども決めたいところです。
[^5]: タイミングが関係するものはオシロで処理時間を見るとか、、、
[^6]: Visual Studio Code + PlatformIOも試したことがありますがhoge.ino 1ファイルで足りるときはArduino IDEで十分で、、、
[^7]: [ArduinoUnit](https://qiita.com/T-YOSH/items/d94e78a7c5c5ab8c881b)
[^8]: Unityでやる方法もあります→[TDDによるマイコンのLチカ開発(1)](https://qiita.com/iwatake2222/items/396959d1d7dffee479f7)、[組込みCテストフレームワークUnityを導入してテストコード生産性をUp](https://akerun.hateblo.jp/entry/2017/12/04/152620)