# 評価実験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で送信してください * アンケートに協力してください