STFでAirtestを動かしてみる

#はじめに
AirtestIDE でスマホアプリ（ゲーム）のテスト自動化をしています。そこで実際に作成したスクリプトや環境をつくるために実施したことを綴ってみたいと思います。


#環境
macOS 10.15.7
Airtest IDE 1.2.6（Python）
Android 7.0（Xperia Z5 Premium）
#アクセストークンをつくる
![スクリーンショット 2020-11-25 17.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/211899d3-4f1a-54a6-045f-901db090b8f7.png)
「設定」メニューから、「認証キー」タブを開いて「＋」をクリック。
ここで、アクセストークンを作成します。

#STFの端末を取得するまで
###端末一覧を取得する

```python
import requests
import pprint

def get_devices():
    response = requests.get(
        'https://stf.sample.net/api/v1/devices',
        headers = {
           'Authorization': 'Bearer <token>'
        },
        verify = False
        )
    res = response.json()

    pprint.pprint(res)
```
一覧を取得してどの端末を借りるか決めます。
![スクリーンショット 2020-11-25 20.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/5e3fc88d-50d6-9b35-dab0-f676ca809da3.png)
今回は、Xperia Z5 Premium にします。
![スクリーンショット 2020-11-25 20.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/051107d1-29a5-4378-4d5b-487515a1e18c.png)
ここで、端末の serial を取得しておきます。



###端末を借りる
```python
import json

def reserve_device(serial):
    payload = {
      'serial': serial
    }
    response = requests.post(
        'https://stf.sample.net/api/v1/user/devices',
        headers = {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer <token>'
        },
        data = json.dumps(payload),
        verify = False
        )
    res = response.json()

    pprint.pprint(res)
```
先程の sereal を使って端末を借ります。

```
{'description': 'Device successfully added', 'success': True}
```
![stf_reserve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/1ddbf792-d1f4-e0cc-d8c7-8044ec33e1d8.png)
端末の状態が使用中になります。（自身のアカウントからみているので「Stop Automation」の表記になっている）

###端末へのリモート接続を有効にする
```python
def connect_device(serial):
    payload = {
      'serial': serial
    }
    response = requests.post(
        'https://stf.sample.net/api/v1/user/devices/' + serial + '/remoteConnect',
        headers = {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer <token>'
        },
        data = json.dumps(payload),
        verify = False
        )
    res = response.json()

    pprint.pprint(res)
```

```
{'remoteConnectUrl': '<ip>:<port>', 'success': True}
```
当該端末への接続情報 ```<ip>:<port>``` が取得できます。


#STFの端末でAirtestのスクリプトを実行する

STFの端末を指定してAirtestIDEコマンドを実行します。


###コマンドラインから実行する
```
$ cd $PROJECT_HOME
$ /Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE runner "<プロジェクト>.air" --device Android://127.0.0.1:5037/<ip>:<port> --log log
```

先程取得した接続情報 ```<ip>:<port>``` を使用します。
※複数台同時実行も可能です

###レポートを作成する
```
$ /Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE reporter "<プロジェクト>.air" --log_root log --export exp
```
作成されたレポートは ```exp/<プロジェクト>.air/log.html``` から参照できます。

#端末を返却する
```python

def release_device(serial):
    response = requests.delete(
        'https://stf.sample.net/api/v1/user/devices/' + serial,
        headers = {
          'Authorization': 'Bearer <token>'
        },
        verify = False
        )
    res = response.json()
```
端末が開放され、貸出のステータスが元に戻ります。

#おわりに
参考になった箇所などありましたでしょうか。実際にSTFでAirtestIDEコマンドを試そうとした際に、関連する情報が見つからず試行錯誤したことがありましたので、何かのお役に立てたなら幸いです。

#参考
OSSなリモートスマホサービス（STF）が素敵すぎる
https://qiita.com/tabbyz/items/5f6cec37e1d525a8e4d5
Airtestを使ってUIのテストを自動化する話
https://qiita.com/johro/items/b77f5a8c3c3cf00bde30
Welcome to Airtest documentation!
https://airtest.readthedocs.io/en/latest/index.html
STF API
https://github.com/openstf/stf/blob/master/doc/API.md