プログラミング初心者のQAエンジニアがExcelからテスト実行するプログラムを作ってみた

## どのくらいプログラミング初心者か
- 就活時代：Javaを少し勉強する
- QA（1~2.5年目）：ブラックボックステスト中心でコードなんてわからない
- QA（2.5~3年目）：テスト自動化とかもあるし、そろそろ勉強するか
    - Progate、Udemy、友人からpythonのもろもろを教わる
    - 基礎知識できたし、ちょっと何か作ってみる


## 今回のプログラムについて
今回の目標は「勉強の応用編としてプログラムを作成する」を目標としたため、GUI形式/ローコードのテスト実行プログラムではない。
手動で以下の対応が必要となる。
- Excelファイルの作成
- 作成ファイルの該当行にxpathや実行してほしい内容を記載
- コマンドプロンプトでpy [ファイル名].pyを実行

また、以下の基礎的な操作が実行できるだけである。
- ボタンなどの押下
- テキストボックスなどへの入力
- 文章の比較
## 環境情報
### OS
- Windows11

### 言語
- Python3

### ライブラリ
- Selenium
- openpyxl

### 使用サイト
- [HOTEL PLANISPHERE](https://hotel.testplanisphere.dev/ja/index.html)
※テスト自動化の学習用練習サイト

## 実際に書いてみる
### コード
```test.py
#以下ブラウザの立ち上げ（設定も含む）
options = Options()
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(options=options)
driver.maximize_window()

#押下の定義
def click_button(a):
    click_something = driver.find_element(By.XPATH, a)
    click_something.click()
    time.sleep(3)

#入力の定義
def input_value(b,c):
    input_something = driver.find_element(By.XPATH, b)
    input_something.send_keys(c)
    time.sleep(3)

#比較の定義
def compare_value(d,e):
    raw_text = driver.find_element(By.XPATH, d).text
    assert raw_text == e

#テストケース実行の定義
def run_testcase(sheet_name):
    ws_case_1 = book1[sheet_name]

    #行ごとに処理を実行&セルの値をとりだす
    testcase = []
    column_list = []
    result_list = []
    for data_number, raw_row in enumerate(ws_case_1['B2':'H8']):
        temp = {}
        if data_number == 0:
            for column_cell in raw_row:
                column_list.append(column_cell.value)
            continue
        for column_name, cell in list(zip(column_list, raw_row)):
            temp[column_name] = cell.value
        testcase.append(temp)

    for fixed_row in testcase:
        discription = fixed_row['実施内容']
        xpath = fixed_row['Path']
        value = fixed_row['入力値']
        expect = fixed_row['期待値']
        action_type = fixed_row['操作']

        try:
            if action_type == "押下":
                click_button(xpath)
            elif action_type == "入力":
                input_value(xpath, value)
            elif action_type == "比較":
                compare_value(xpath,expect)

        except:
            print(traceback.format_exc()) 
            result_list.append('NG')
        else:
            result_list.append('OK')

    # ここから先で結果列に書き込み
    for key, result in enumerate(result_list):
        ws_case_1.cell(row = key+3, column =8) .value = result

    book1.save(R"C:[ファイル名].xlsx")

#テストケース実行の定義完了

#以下URLを開く
driver.get('https://hotel.testplanisphere.dev/ja/index.html')
time.sleep(5)

#手順のexcelを読み込む
book1 = excel.load_workbook(R"C:[ファイル名].xlsx")

#複数のシート名をsheet_name_listに格納
sheet_names_list = book1.sheetnames

#sheet_nameごとにテストケースを実行
for sheet_name in sheet_names_list:
    run_testcase(sheet_name)

book1.close()
```

### Excel
![スクリーンショット 2024-09-22 225553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842711/8c788c8d-b911-6de8-2870-950bacd8545d.png)


## 感想
QAエンジニアとしてテスト実行プログラムを作った1番の感想は「GUIもしくはローコードでテスト手順を録画して実行するテスト自動化プログラムを作った人は偉大だな」ということである。
またシステム設計で不具合が混入する理由も理解できた気がする。
普段そこまでシステム設計などには関わらない。
そのため、なぜシステム設計で不具合が混入するのだろうと思っていた。
今回自分が実際に作ってみたことで「いろいろな実装方法があり、それのうちどれを選択するか」など様々な検討要素があることを知った。
この難しい検討などを行い、システムを作ってくれている開発の皆さんに感謝をしながらQAをしていきたい。

## Special thanks
- [soi source](https://qiita.com/soiSource)