目的
毎週手動で動作確認しているテストケースの中にadbコマンドを叩いて確認するものがある。作業手順としては、
- Androidデバイス(動作確認対象となるアプリインストール済み)をMacにUSB接続する
- テスト用コマンド(
adb shell ~
)をテスト仕様書からコピーする - Terminalにテスト用コマンドをペーストする
- Androidデバイス側の挙動を目視で確認する
というものだが、テスト用コマンドは増減することはあっても変更になることはそうそうないので、
- AndroidデバイスをMacにUSB接続する
- Terminalでshellを実行しコマンドIDを入力する
- Androidデバイス側の挙動を目視で確認する
くらいシンプルに作業できるようにしたい。実現することで、
- 煩雑なコピペが不要になる
- コピペミスが生じなくなる
というメリットがある。
要件
- コマンドIDはテスト仕様書に準ずる(0スタートではない)
- このスクリプトを書くために工数を使いたくないのでやっつけでいい
- 今のところ自分しか使わない
- adbコマンド実行に必要なPATHはあらかじめ通しておく
実装・実行
実装
#!/bin/bash
# 配列宣言
arr_command=()
# keyを指定してadbコマンドを配列に格納
arr_command["1"]="adb shell am broadcast -a jp.co.example.XXX"
# コマンドがいくつ格納されているか表示
echo "there are ${#arr_command[@]} commands"
# なぜ対話型にしたのか思い出せない
while :
do
echo "input command No."
read key
echo "run command No.${key}"
echo `${arr_command[${key}]}`
break
done
文字列として配列に格納したshellコマンドはecho
するときにあの……フランス語の記号のアクサングラーヴみたいなやつ……で括ると実行できる。
実行
$ sh test_adb.sh
there are 12 commands
input command No.
key
と入力するとarr_command["key"]
のコマンドが実行されレスポンスが返る。
1
run command No.1
Broadcast completed: result=XXXX }
配列にない値を入力した場合はそのままスクリプトが終了する。
拡張
配列もっときれいに指定できないのか問題
shellスクリプトをちゃんと書いたことがないので存じ上げないんだけどJSONみたいにkey:valueで一括指定できないんだろうか?
実行コマンドを外出しにできないのか問題
上でJSONって言ったけど本当はnodeでfs使って外出しにしたかった。作業時間が見合わなかったのでしなかった。いつかします。
対話型にする必要ないよね問題
さっき実際に使ってみて思ったんだけどこれ
$ sh test_adb.sh id
で実行できてほしい。実行ファイルパス以降にパラメータがあった場合コマンドIDとみなしてそのまま動くようにしたい。
その他
- デバイスのステータス(Wi-fi/モバイルネットワーク/Bluetooth接続の有無とかGPSの有効・無効)を取って吐くようにするとちょっと便利かもしれない
- ステータスチェックもしてくれるともっと便利かもしれない
- 期待値もTerminal上で表示されると楽かもしれない
2018/06/11追記
対話型にした
$ sh test_adb.sh id
で実行できてほしい
って書いたけどやっぱり対話型にしたほうが楽じゃない?と思って対話型にした。動作確認自体はAndroidデバイス上でするので。
#!/bin/bash
arr_command=()
arr_command["1"]="adb shell am broadcast -a jp.co.example.XXX"
echo "there are ${#arr_command[@]} commands"
while :
do
echo "input command No."
read key
# 数字のみの文字列の場合はコマンドを実行、それ以外は終了
if [[ ${key} =~ [0-9]+ ]]; then
echo "run command No.${key}"
echo `${arr_command[${key}]}`
else
echo "exit."
break
fi
done
こんな↓感じになりました。
$ sh test_adb.sh
input command No.
1
run command No.1
Broadcast completed: result=XXXX }
input command No.
a
exit.