見出し画像

QAエンジニアがテスト自動生成に興味をもってゆるふわチャレンジしてみた!第一弾

わたしは普段テスト開発や実行を担当しています。
業務の過程で「テストケース作成って自動化できないのかな?」と疑問に思いました。

ちょっと試してみたいなー。
やってみよっかな?
仕組みを知るだけでも、きっと有意義なはず!
ただ私はプログラミング経験がなく、なんも書けません。
でも機械学習的なやつを試すならPythonが必要そうかも?(勝手なイメージ)と考えちょびっと学習してみました。

自分の忘備録のためにブログを書いてみます!

私と同じように「Python?知らんけど?」「機械学習ってなあに?」というQAエンジニアの方に読んで頂けたらうれしいです❤️
超初心者向けだよー。

もし間違いなどがあれば指摘や、もっとこんなこともやってみるといいよ!など、アドバイス頂けたらとてもよろこびます!


1. なぜ機械学習でテストを自動生成したいのか?

テスト開発をしていると、こんな気持ちになりました。

● テストケース作成に時間がかかる(つらい)
・仕様書を読み、どんなテストが必要か考えるのは手間がかかる
・同じようなテストケースを何度も作っている気がする

● 十分なテストケースの考慮がむずかしい(つらい)
・必要なケースを洗い出したつもりでも、抜け漏れがあるかもしれない
・人間が手作業で考えると、バイアスがかかる気がする

● 仕様変更のたびに修正が必要(つらい)
・変更があると、テストケースの見直しが大変

そこで、機械学習を使ってテストケースを自動生成できないか?と考え、お試しでやってみることにしました!
実験!実験!GO!GO!


2. 使った書籍とツール&最初に知っておいて良かったこと

①今回のチャレンジに使ったもの

🤩 書籍:入門Python3
🤩 Google Colab(無料のPython実行環境)
🤩 scikit-learn サイキット・ラーン(Pythonの機械学習ライブラリ)

②書籍「入門Python3」を使った学習

書籍を使って、実際に手を動かして書いて試すを実施しました。

③Google Colabの使い方

1.以下のリンクからアクセース

2.ノートブックを新規作成
3.空白の「コードセル」が表示されているので、ここにコードを書く

④scikit-learn 基本的な使い方を知る

1.インストール方法
(Google Colabを使う場合は不要だったけど一応記録しておく)

pip install scikit-learn

2.共通的な使い方例
ざっくり言うと「データを準備 → 分ける → モデルを学習 → 予測する」と言う流れ。
最初はこの流れを理解するように試してみたりしました。
(でも今もあんまり理解できていない、今後がんばる!)

【ステップ1】必要なライブラリを読み込む

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

【ステップ2】データを準備する

# 説明変数(X)と目的変数(y)を用意する
X = [[5, 3], [10, 2], [2, 8], [9, 7]] 
y = [0, 0, 1, 1] # 0と1のラベル

【ステップ3】データを学習用とテスト用に分ける

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

【ステップ4】モデルを作成して学習する

model = RandomForestClassifier() # ランダムフォレストモデルを使う
model.fit(X_train, y_train) # 学習データでモデルを訓練する

【ステップ5】テストデータで予測する

predictions = model.predict(X_test) # 予測を実行
print(predictions) # 結果を表示

※上記はchatGPTに教えてもらったコードのためRandomForestを使用しています。次のセクションで実際にやってみる際はわかりやすそうなKNeighborsClassifierを使用しています。


3. 胸アツ!実際にやってみた!「ユーザーストーリーからテストケース自動生成」

① ありそうなイマジナリーテストケースのデータを準備

実際のプロジェクトではなく、よくありそうな簡易的ユーザーストーリーと、それに対応するテストケースをCSVでまとめました。
これをGoogle Colab の左メニューの「ファイル」にアップロードします。

test_cases.csv(テストケースデータ)

ユーザーストーリー,テストケース,期待結果
"ユーザーがログインする","正しいパスワードを入力する","ログイン成功"
"ユーザーがログインする","間違ったパスワードを入力する","エラーメッセージを表示"
"ユーザーがログインする","未登録のメールアドレスでログインする","エラーメッセージを表示"
"ユーザーがログインする","パスワードを空のままログインする","エラーメッセージを表示"
"商品をカートに追加する","商品をカートに追加する","カートに商品が追加される"
"商品をカートに追加する","在庫がない商品をカートに追加する","エラーメッセージを表示"
"商品をカートに追加する","同じ商品を複数回カートに追加する","カート内の数量が増加"
"商品をカートに追加する","カートに追加後、カートページを開く","商品情報が正しく表示される"
"決済を行う","クレジットカード情報を正しく入力する","決済が成功"
"決済を行う","クレジットカード情報を誤って入力する","エラーメッセージを表示"
"決済を行う","残高が不足しているプリペイドカードで決済する","エラーメッセージを表示"
"決済を行う","支払い方法を選択せずに進む","警告メッセージを表示"
"注文履歴を確認する","注文履歴ページにアクセスする","過去の注文情報が表示される"
"注文履歴を確認する","過去に注文がない状態でアクセスする","履歴がない旨のメッセージを表示"

② scikit-learnでCSVを読み込んでテストケースと期待結果を予測

「ユーザーがパスワードを変更する」という新しいユーザーストーリーに対して、どんなテストケースと期待結果が予測されるかを試してみました。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.neighbors import KNeighborsClassifier

# CSVファイルを読み込む
data = pd.read_csv("test_cases.csv")

# 学習データをリスト化
stories = data["ユーザーストーリー"].tolist()
test_cases = data["テストケース"].tolist()
expected_results = data["期待結果"].tolist()

# TF-IDFでユーザーストーリーを数値化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(stories)

# テストケース予測モデルを作成・学習
model_test = KNeighborsClassifier(n_neighbors=1)
model_test.fit(X, test_cases)

# 期待結果予測モデルを作成・学習
model_result = KNeighborsClassifier(n_neighbors=1)
model_result.fit(X, expected_results)

# 新しいユーザーストーリーを用意
new_story = ["ユーザーがパスワードを変更する"]
new_X = vectorizer.transform(new_story)

# 予測を実行
predicted_test_case = model_test.predict(new_X)
predicted_expected_result = model_result.predict(new_X)

# 結果を表示
print(f"予測されたテストケース→ {predicted_test_case[0]}")
print(f"予測された期待結果→ {predicted_expected_result[0]}")

実行結果

予測されたテストケース→ 正しいパスワードを入力する  
予測された期待結果→ ログイン成功

③考察

めちゃくちゃシンプルな類似度をもとにした分類でも、「パスワード変更」という新しいユーザーストーリーに対して、「ログイン」に関連するテストケースと期待結果の予測が引き出すことができました。
(十分なテストケースとは言えないけど)
こんなに少ないデータでも「それっぽい」テストのヒントを与えてくれるのは面白いです!ワクワクです!胸アツ!!

でも、もっと高精度な予測を行うためには、
・データの量と多様性を増やすこと
・自然言語処理(NLP)を活用した文脈理解
・テストケースと期待結果を一体として扱えること

などが今後の課題になるのかな?と感じました。


4. まとめ

今回のチャレンジを通じて、Python初心者でも以下のことができました🙌

・「入門Python3」で文法の基礎をちょっと理解
・Google ColabでPythonコードを実行
・scikit-learnで簡単な機械学習モデルを構築
・ユーザーストーリーからテストケースと期待結果を予測


今後は、

・より高性能なモデル(BERTは前後の文脈を読んで、単語の意味を理解しようとするらしい!すごい!)の使用
・LLMを使って、ゼロからテストケースを生成してみる
・自分専用のモデルをファインチューニングして育てる
・GUIをつけて、ツールっぽくしてみる
・自動生成されたテストケースを評価する仕組みをつくる


をやってみたい気持ちがあります。
でも難しそう。

最後まで読んでいただきありがとうございました!
機械学習なんもわからんnacoのゆるふわチャレンジはつづく……(かも?)

またね👍

いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
QAエンジニア、スクラムマスターとか色々やるひと。
QAエンジニアがテスト自動生成に興味をもってゆるふわチャレンジしてみた!第一弾|naco
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1