テスト自動化取組により得られた感動

## はじめに
業務で行っている総合テストの一部を自動化したい！
と、チーム目標として取り組みを行い、
問題となった点・良かった点をお伝えしたいと思います。

## 使用したもの
<img width="100" alt="python.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/7bc5817d-488a-b997-ff70-fbf25ad2545f.png"><img width="100" alt="スプレッドシート.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/a841d9da-2799-b58a-0e5b-b784bbb86a03.png"><img width="100" alt="selenium.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/3fa40bb6-9991-ff4b-1b02-07723f768e43.png"><img width="100" alt="GAS.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/f5cd47c3-3529-3897-2c5a-5f13c8989346.png">
・Windows10 Chrome
・Googleスプレッドシート
・Google Apps Script（GAS）
・Python
・Selenium(WebDriver)

## テストの概要
データ変換アプリの総合テスト
入稿データをもとにデータ変換アプリを実行し、
WEBサイトに期待値通りの値が表示できているかを検証します。
![convert.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/d37f733c-979b-48b7-9206-6c8e6f0f83a6.png)
## テスト手順
・テスト設計
・テストデータ作成
・テスト実行
⎿データ変換アプリ実行
⎿WEBサイト画面目視確認 ※ココを自動化
⎿WEBサイト画面キャプチャ(エビデンス)取得 ※ココを自動化

**値自動比較＆エビデンス自動取得ツールの作成！**
<img width="100" alt="hikaku.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/09666570-1b91-6bf7-32bb-32787951929b.png">　　<img width="30" alt="and.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/5c805173-3378-18b7-8812-0ab7af87a96c.png">　　<img width="100" alt="kamera.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1577716/fd0065dd-d309-ef4e-ad39-a9269286b78a.png">

## 予め設定した期待値とWEBサイトに表示された値を自動比較
・確認したい値をスプレッドシートに記載
・Selenium(WebDriver)、gspreadライブラリを使用しスプレッドシートに記載した値の抽出とWEBサイトに表示されている値を抽出して比較
・比較した結果をログ出力
※下記、値比較一部抜粋

```sample.py
#==========エビデンスチェック関数(＊＊)==========#
def CheckMethod(driver,intStockNum,strNo,lstCheckData,intMaxStockRow,intCheckStartRow,lstHtmlFirstCol,lstHtml):
    """
    エビデンスチェック関数 \n
    引数1:セレニウムドライバー
    引数2:＊＊の番号[i]
    引数3:＊＊番号
    引数3:＊＊情報のリスト
    引数4:＊＊情報のリストの最大行
    引数5:チェック開始行
    引数6:＊＊の最初の行のリスト
    引数7:＊＊_HTMLのリスト
    """    #ログ出力
    OutPutTextShowTime("＊＊番号「" + strNo + "」の＊＊チェック処理を開始します。")

    i = intStockNum
    blSkipCheckOption = False
    blOptionCheckList = False
    imageComment = False
    PhotoCnt = 0
    Oldx = 1
    DBCoonection = False
    ArrowCheck = False

    for intCheckRow in range(intCheckStartRow,intMaxStockRow):
        #チェックする値の取得
        strCheckData = lstCheckData[intCheckRow][i]
        #チェックする項目名の取得
        strItem = lstCheckData[intCheckRow][0]        
        #チェック項目が装備確認の場合
        if strItem == "＊＊_装備確認":
            #行う以外の場合はスキップ
            if strCheckData != "行う":
                blSkipCheckOption = True
            blOptionCheckList = True

            continue
```
・画面キャプチャ(エビデンス)取得
※下記、エビデンス取得一部抜粋

```sample.py
#-----------------エビデンス取得処理-----------------#
#開始ログ出力
OutPutTextShowTime("エビデンス取得処理を開始します。")
#ヘッドレス用オプション
options = Options()
options.add_argument('--fe-scrollbars')
options.add_argument('--disable-gpu')
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
options.add_argument('--hide-scrollbars')
options.add_argument('--log-level=3') #追加

#デバッグ：クロームドライバーのパスを表示
if strDebugMode == "True":
    OutPutTextShowTime("DebugInfo：[ドライバーパス]:" + strWebDriverPath)

#ドライバーのパス設定
if strCheckShowChrome == "True":
    #表示ありの場合、ヘッドレスオプション設定を読み込みしない
    # driver = webdriver.Chrome(executable_path=strWebDriverPath,options=options)
    driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)
    OutPutTextShowTime("ヘッドレス=あり　起動")
else:
    options.add_argument('--headless')
    # driver = webdriver.Chrome(executable_path=strWebDriverPath,options=options)
    driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)
    OutPutTextShowTime("ヘッドレス=なし　起動")

#カレントウインドウを最大化する
driver.maximize_window()

strOldClientId = "NotLogin"

#デバッグ：＊＊のURLを表示
if strDebugMode == "True":
    OutPutTextShowTime("DebugInfo：[＊＊ URL]:" + str＊＊Url)

for i in range(1,intColCount):

    #エラーが発生した場合、次の＊＊へ移る用のフラグ
    blErrCountinue = False
    #＊＊IDの取得を行う
    strClientId = cell_list[intClientIdRow][i]
    #エビデンス番号用の値を取得
    strEviNo = cell_list[intEvidenceNo][i]
    #エビデンス取得処理
    strGetEvidence = cell_list[intGetEvidenceRow][i]
    #データチェック処理
    strCheckEvidence = cell_list[intCheckEvidemceRow][i]
    strEvicenceAcquisitionStatus = ""
    #エビデンス取得状態
    if intEvicenceAcquisitionStatus != -1:
        strEvicenceAcquisitionStatus = cell_list[intEvicenceAcquisitionStatus][i]

    #エビデンスの取得が「行う」の場合以下処理を実施　取得済みは再度取得を行わない用に
    if strGetEvidence == "行う" and strEvicenceAcquisitionStatus != "取得済み":
```
## 問題となった点
・テストメンバーは日々開発業務を行っておらずブラックボックスメイン
⎿開発担当者の協力でテストツールを作成
・今までなかったテストツール用のデータ作成が必要となった
⎿データ変換アプリ用のデータ作成にプラスしてテストツール用データ作成が必要となり誰も使わなくなった:cry:

## 問題点をチーム力で解決
効率化の為のテスト自動化なのに、新たなデータ作成時間が増えることはナンセンスなので
テスト設計書から自動でテストツール用データ作成が行えるようにGASを使い改善。

・GASの調査、Script作成
・テスト設計書のフォーマット改善
・メンバーでそれぞれ役割を別け分担する
・日々1～2時間の取り組み時間を設けて進捗
・オンラインMTGで顔出しと積極的参加によりチーム力向上

## おわりに
無事運用に乗せる目途が立ってめでたしなのですが、
良かった点はチーム一丸となって目標を達成できたことです。
通常のプロジェクト完了にはない、チーム目標達成の感動がありました。
デモンストレーションの際に鳥肌が立ち、メンバー全員の笑顔が印象的でした！
今後の目標としてはデータ変換アプリ用のデータ作成もテスト設計書から自動で行えるよう取り組む予定です。
チーム一丸となって達成した際の感動を再び味わいたいと思います！