# 評価実験2025(石上担当)
## 実験方法
1. GitHubから実験用のリポジトリをCloneする
* Clone
```
$ git clone git@github.com:Takagi-swlab/WebAppTestTool.git
```
* 評価実験用Branch(evolution-experiment)を指定して、Cloneする場合
```
$ git clone -b evolution-experiment git@github.com:Takagi-swlab/WebAppTestTool.git
```
3. Webアプリケーションの簡単な説明をする
4. テストケースの内容についてを説明する
5. 簡単なテスト作成方法の説明をする
6. ツールを利用せず、テスト作成&実行
* 作成時間を計測
* `test_model/back/src/evolution_test/`以下のファイルを編集する
* `evolution_combined.py`は結合テスト
* `evolution_e2e.py`はE2Eテスト
7. ツールの機能を利用して、テストを作成&実行
* 作成時間を計測
8. テストコードの実行結果を比較
9. アンケート
## データベース
* DBのパス: /app/db/sql.db
* table名: account
* データ構造
|カラム|型|初期値|
| --- | --- | --- |
|id|int|1234|
|pass|str|1234|
|money|int|1000|
## テストケース
|画面|事前条件|事後条件|クライアントパラメータ|ボディーパラメータ|
| --- | --- | --- | --- | -- |
|login|cookieにidというキーがないこと|cookieにidというキーがあること|"username":"1234"||
|auth|cookieにidというキーがあること|||"username":"1234"|
|index|cookieにidというキーがあること||||
|in_money_input|cookieにidというキーがあること & accountというtableがsql.db上にあること|id = 1234の時,accountというtableのmoneyカラムが増加すること|"in_num": 100|"in_num": 100|
|in_money|cookieにidというキーがあること & accountというtableがsql.db上にあること|||"in_num": 100|
|result|cookieにidというキーがあること & accountというtableがsql.db上にあること|||"result":100|
|index|cookieにidというキーがあること||||
|out_money_input|cookieにidというキーがあること & accountというtableがsql.db上にあること|id = 1234の時,accountというtableのmoneyカラムが減少すること|"out_num": 100|"out_num": 100|
|out_money|cookieにidというキーがあること & accountというtableがsql.db上にあること|||"out_num": 100|
|result|cookieにidというキーがあること & accountというtableがsql.db上にあること|||"result":100|
|index|cookieにidというキーがあること|||
|result|cookieにidというキーがあること & accountというtableがsql.db上にあること|||"result":100|
|index|cookieにidというキーがあること|cookieにidというキーがないこと|||
|logout|||||
## 評価実験の環境準備
* ターミナルを開く(vscodeやcmdでも、なんでもOK)
* wslやubuntuに切り替える
* リポジトリをcloneする
```
$ git clone git@github.com:Takagi-swlab/WebAppTestTool.git
```
* リモートブランチから評価実験用ブランチを取得する
```
$ git fetch origin evolution-experiment
```
* 評価実験用のbranchに切り替える
```
$ git checkout evolution-experiment
```
* 評価実験用のbranchを読み込む
```
$ git pull origin evolution-experiment
```
* 作業用ディレクトリーに移動
```
$ cd example/bank/
```
* docker networkを作成
```
$ docker network create testnetwork
```
* docker で起動する
```
$ docker compose up --build
```
## 各サービスのアクセス方法について
* テスト対象Web アプリケーション: http://localhost:5000/
* テストAPI: http://localhost:8080/docs#/
## APIで使用する機能
* 結合テスト生成機能(Create Combined Test)
* method:Post
* url:/v1/test_tool/create_combined_test
* 結合テスト実行機能(Run Combined Test)
* method:Get
* url:/v1/test_tool/run_combined_test
* E2Eテスト生成機能(Create E2E Test)
* method:Post
* url:/v1/test_tool/create_e2e_test
* E2Eテスト実行機能(Run E2E Test Endpoint)
* method:Get
* url:/v1/test_tool/run_e2e_test
* 作成した結合テストを実行するエンドポイント
* method:Get
* url:test_tool/run_evolutin_combined_test
* 作成したE2Eテストを実行するエンドポイント
* method:Get
* url:/v1/test_tool/run_evolutin_e2e_test
## 結合テスト
* Getメソッドのテスト
```python=
import requests
# クライアントパラメーター
params = {'username': '1234'}
# ボディーパラメーター
data = {}
# アクセス
response = requests.get("https://nginx/", verify=False, params=params, data=data)
# ステータスコードの確認
response.status_code
```
* Postメソッドのテスト
```python=
import requests
# クライアントパラメーター
params = {}
# ボディーパラメーター
data = {'username': '1234'}
# アクセス
response = requests.post("https://nginx/login", verify=False, params=params, data=data)
# ステータスコードの確認
response.status_code
```
## E2Eテスト
* driverのセットアップ
```python=
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def set_driver():
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Remote(
command_executor=os.environ["SELENIUM_URL"], options=chrome_options
)
return driver
```
* driverの操作方法
```python=
# nameがusernameのinputタグに1234を代入
driver.find_element("name", "username").send_keys("1234")
# nameがloginというinputタグをクリック
driver.find_element("name", "login").click()
```
* cookieの調べ方
```python=
# cookieのidというキーを取得
cookie1 = driver.get_cookie("id")
# cookie中に値が存在しない (true か falseが格納される)
cookie_condition = (cookie1 is None or not cookie1.get("value"))
# cookie中に値が存在する (true か falseが格納される)
cookie_condition = cookie2 and cookie2.get("value")
```
* データベースの調べ方
```python=
from features.test_sql import (
get_table_count,
get_record_count,
get_table_counts,
check_sqlite_db,
fetch_data_from_db,
)
"""
指定したテーブルのデータ数を取得する関数。
Args:
database_path (str): データベースファイルのパス。
table_name (str): テーブル名。
Returns:
int: テーブル内のデータ数。テーブルがない場合-1。
"""
get_record_count(database_path, table_name)
"""
データベース内のすべてのテーブルの要素数を取得する関数。
Args:
database_path (str): データベースファイルのパス。
Returns:
int: テーブル内のデータ総数。テーブルが1つもない場合-1。
"""
get_table_counts(database_path)
"""
指定されたDBとテーブルに対してSELECTクエリを実行し、結果を取得する。
Args:
database_path (str): データベースファイルのパス。
select_query (str): 実行するSELECTクエリ。
Returns:
List[Tuple[Any]]: クエリの結果を含むリスト。
"""
fetch_data_from_db(database_path, select_query)
```
## 最後に
* 完成したテストコードをslackで送信してください
* アンケートに協力してください