【Python】Excelのテストケース表からテストデータをCSV形式で出力する

■概要

以下のExcelのテストケース表から、テストデータを抽出し、CSVファイルに出力する。

実装する仕様は以下の通り。

  • 「データ項目」列はCSVファイルのヘッダー部とする
  • 「値」列はCSVファイルのデータ部とする
  • Excelの「main」シートから「○」の部分をテスト対象のデータとし、CSV出力する
  • 「値」列の「値なし」は値を入力しない(空文字「”」をセットする)

また、Excelのセル値に関する仕様は以下の通りとする(後に定数として使用)。

項目行/列数値
データ開始4
データ項目2
3
ケース4

作成するモジュールの階層構造は以下の通り。

MakeTestCase
│  make_test_case.py
│
├─input
│      TestCaseSample.xlsx
│
└─output
        testcase.csv

■フローチャート

開始
開始
ヘッダー部・データ部の
リスト初期化
ヘッダー部・データ部の リスト初期化
ヘッダー部作成フラグセット
ヘッダー部作成フラグセット
Excelファイル読込
Excelファイル読込
mainシート読込
mainシート読込
列カウンタ初期化
列カウンタ初期化
TestCaseSample.xlsx
TestCaseSample.xlsx
[ケースの番号]列が空白になるまで繰り返し
[ケースの番号]列が空白になるまで繰り返し
行カウンタ初期化
行カウンタ初期化
テストデータ要素リスト初期化
テストデータ要素リスト初期化
[値]行が空白になるまで繰り返し
[値]行が空白になるまで繰り返し
ヘッダー作成
フラグ
ヘッダー作成 フラグ
FALSE
FALSE
TRUE
TRUE
データ項目
データ項目
空白ではない
空白ではない
空白
空白
ヘッダー部リストに追加
ヘッダー部リストに追加
テストケース
テストケース
対象
対象
対象外
対象外
テストデータ
テストデータ
値なし
値なし
その他
その他
テストデータ要素リストに
空文字追加
テストデータ要素リストに 空文字追加
テストデータ要素リストに
値を追加
テストデータ要素リストに 値を追加
行カウンタインクリメント
行カウンタインクリメント
データ部リストに
テストデータ要素リストを追加
データ部リストに テストデータ要素リストを追加
ヘッダー部作成フラグOFF
ヘッダー部作成フラグOFF
列カウンタインクリメント
列カウンタインクリメント
CSVファイル出力
CSVファイル出力
testcase.csv
testcase.csv
Excelファイルクローズ
Excelファイルクローズ
終了
終了
Text is not SVG – cannot display

■サンプルコード

import openpyxl
import pandas as pd


# ファイル名の定数
EXCEL_FILE_PATH = "./input/TestCaseSample.xlsx"
OUTPUT_TESTCASE_PATH = "./output/testcase.csv"

# EXCEL内の定数
SHEET_NAME_MAIN = "main"

COMMON_START_ROW = 4
CASE_NUM_START_ROW = 3
HEADER_START_COL = 2
VALUE_START_COL = 3
CASE_START_COL = 4

DATA_NO_VALUE = "値なし"
TARGET_DATA_SIGN = "○"


# テストケース作成処理
def make_test_case_main():

    # ヘッダー・データ部のリスト初期化
    heder_list = []
    test_data_list = []

    # ヘッダー作成フラグ(True:作成する、False:作成しない)
    is_make_heder = True

    # テストケースのExcelファイル読み込み
    WorkBook = openpyxl.load_workbook(filename=EXCEL_FILE_PATH)

    # ワークシート設定
    WorkSheet = WorkBook[SHEET_NAME_MAIN]

    # 列カウンタ初期化
    i_col = CASE_START_COL

    # [ケースの番号]列が空白になるまで繰り返し
    while not WorkSheet.cell(row=CASE_NUM_START_ROW, column=i_col).value is None:
        
        # 行カウンタ初期化
        i_row = COMMON_START_ROW

        # テストデータ要素リスト初期化
        test_data_element = []

        # [値]行が空白になるまで繰り返し
        while not WorkSheet.cell(row=i_row, column=VALUE_START_COL).value is None:
            
            # ヘッダー作成フラグONならヘッダー情報を取得(ループ1周目目のみ)
            if is_make_heder:
                if not WorkSheet.cell(row=i_row, column=HEADER_START_COL).value is None:
                    # 「データ項目」列が空白でなければヘッダーリストに設定
                    heder_list.append(WorkSheet.cell(row=i_row, column=HEADER_START_COL).value)

            # テストケース対象判定
            if WorkSheet.cell(row=i_row, column=i_col).value == TARGET_DATA_SIGN:

                if WorkSheet.cell(row=i_row, column=VALUE_START_COL).value == DATA_NO_VALUE:
                    # 「値なし」の場合は空白を設定
                    test_data_element.append('')
                else:
                    # 「値」のデータを設定
                    test_data_element.append(WorkSheet.cell(row=i_row, column=VALUE_START_COL).value)

            # 行カウンタインクリメント
            i_row += 1

        # データリストに格納
        test_data_list.append(test_data_element)

        # ヘッダー作成フラグOFF
        is_make_heder = False

        # 列カウンタインクリメント
        i_col += 1
    
    # csv出力
    result_data = pd.DataFrame(test_data_list)
    result_data.to_csv(OUTPUT_TESTCASE_PATH, index=False, header=heder_list)

    # Excelファイルを終了
    WorkBook.close()


# メイン処理
if __name__ == '__main__':
    make_test_case_main()

■実行結果

出力するCSVファイルは以下の通り。

date,prefecture,point,value,Flag
2024-07-01,Fukuoka,40,AAA,True
2024-07-02,Tokyo,50,BBB,True
2024-07-03,Osaka,10,CCC,True
2024-07-04,Hokkaido,20,,True
2024-07-05,Okinawa,30,AAA,True
2024-07-01,Fukuoka,40,BBB,False
2024-07-02,Tokyo,50,CCC,False
2024-07-03,Osaka,10,,False
2024-07-04,Hokkaido,20,AAA,False
2024-07-05,Okinawa,30,BBB,False
タイトルとURLをコピーしました