From 0dfe9a7cabb99df411322bcce46cb12e1e12017e Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Sat, 27 Jan 2024 14:41:14 +0900 Subject: [PATCH 1/7] Add e2e test for loading journal storage --- e2e_tests/test_standalone/test_study_list.py | 50 +++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/e2e_tests/test_standalone/test_study_list.py b/e2e_tests/test_standalone/test_study_list.py index e84a7f5a..3c588aed 100644 --- a/e2e_tests/test_standalone/test_study_list.py +++ b/e2e_tests/test_standalone/test_study_list.py @@ -25,7 +25,7 @@ def test_home( assert title == "Optuna Dashboard (Wasm ver.)" -def test_load_storage( +def test_load_rdb_storage( page: Page, server_url: str, ) -> None: @@ -69,3 +69,51 @@ def test_load_storage( count = count_components(page, "MuiCard-root") assert count == 4 + + +def test_load_journal_storage( + page: Page, + server_url: str, +) -> None: + study_name = "single-objective" + url = f"{server_url}" + + def create_storage_file(filename: str): + import optuna + + storage = optuna.storages.JournalStorage( + optuna.storages.JournalFileStorage(f"{filename}"), + ) + study = optuna.create_study(study_name=study_name, storage=storage) + + def objective(trial: optuna.Trial) -> float: + x1 = trial.suggest_float("x1", 0, 10) + x2 = trial.suggest_float("x2", 0, 10) + return (x1 - 2) ** 2 + (x2 - 5) ** 2 + + study.optimize(objective, n_trials=100) + + with tempfile.TemporaryDirectory() as dir: + with tempfile.NamedTemporaryFile() as fp: + filename = fp.name + path = os.path.join(dir, filename) + create_storage_file(filename) + page.goto(url) + with page.expect_file_chooser() as fc_info: + page.get_by_role("button").nth(2).click() + file_chooser = fc_info.value + file_chooser.set_files(path) + + page.get_by_role("link", name=study_name).click() + + def count_components(page: Page, component_name: str): + component_count = page.evaluate( + f"""() => {{ + const components = document.querySelectorAll('.{component_name}'); + return components.length; + }}""" + ) + return component_count + + count = count_components(page, "MuiCard-root") + assert count == 4 From f0751b8d4808917fe4993e88c2139e6e46213461 Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Mon, 5 Feb 2024 23:03:30 +0900 Subject: [PATCH 2/7] Follow review comments --- e2e_tests/test_standalone/test_study_list.py | 108 +++++++------------ e2e_tests/utils.py | 11 ++ 2 files changed, 47 insertions(+), 72 deletions(-) diff --git a/e2e_tests/test_standalone/test_study_list.py b/e2e_tests/test_standalone/test_study_list.py index 3c588aed..18c57e08 100644 --- a/e2e_tests/test_standalone/test_study_list.py +++ b/e2e_tests/test_standalone/test_study_list.py @@ -1,10 +1,13 @@ import os import tempfile +from typing import Callable +import optuna from playwright.sync_api import Page import pytest from ..test_server import make_standalone_server +from ..utils import count_components @pytest.fixture @@ -25,31 +28,49 @@ def test_home( assert title == "Optuna Dashboard (Wasm ver.)" -def test_load_rdb_storage( +def create_rdb_storage_sqlite_file(filename: str, study_name: str): + storage = optuna.storages.RDBStorage(f"sqlite:///{filename}") + study = optuna.create_study(study_name=study_name, storage=storage) + + def objective(trial: optuna.Trial) -> float: + x1 = trial.suggest_float("x1", 0, 10) + x2 = trial.suggest_float("x2", 0, 10) + return (x1 - 2) ** 2 + (x2 - 5) ** 2 + + study.optimize(objective, n_trials=100) + + +def create_journal_storage_local_file(filename: str, study_name: str): + storage = optuna.storages.JournalStorage( + optuna.storages.JournalFileStorage(f"{filename}"), + ) + study = optuna.create_study(study_name=study_name, storage=storage) + + def objective(trial: optuna.Trial) -> float: + x1 = trial.suggest_float("x1", 0, 10) + x2 = trial.suggest_float("x2", 0, 10) + return (x1 - 2) ** 2 + (x2 - 5) ** 2 + + study.optimize(objective, n_trials=100) + + +@pytest.mark.parametrize( + "create_storage_file", + [create_rdb_storage_sqlite_file, create_journal_storage_local_file], +) +def test_load_storage( page: Page, server_url: str, + create_storage_file: Callable[[str, str], optuna.storages.BaseStorage], ) -> None: study_name = "single-objective" url = f"{server_url}" - def create_storage_file(filename: str): - import optuna - - storage = optuna.storages.RDBStorage(f"sqlite:///{filename}") - study = optuna.create_study(study_name=study_name, storage=storage) - - def objective(trial: optuna.Trial) -> float: - x1 = trial.suggest_float("x1", 0, 10) - x2 = trial.suggest_float("x2", 0, 10) - return (x1 - 2) ** 2 + (x2 - 5) ** 2 - - study.optimize(objective, n_trials=100) - with tempfile.TemporaryDirectory() as dir: with tempfile.NamedTemporaryFile() as fp: filename = fp.name path = os.path.join(dir, filename) - create_storage_file(filename) + create_storage_file(filename, study_name) page.goto(url) with page.expect_file_chooser() as fc_info: page.get_by_role("button").nth(2).click() @@ -58,62 +79,5 @@ def test_load_rdb_storage( page.get_by_role("link", name=study_name).click() - def count_components(page: Page, component_name: str): - component_count = page.evaluate( - f"""() => {{ - const components = document.querySelectorAll('.{component_name}'); - return components.length; - }}""" - ) - return component_count - - count = count_components(page, "MuiCard-root") - assert count == 4 - - -def test_load_journal_storage( - page: Page, - server_url: str, -) -> None: - study_name = "single-objective" - url = f"{server_url}" - - def create_storage_file(filename: str): - import optuna - - storage = optuna.storages.JournalStorage( - optuna.storages.JournalFileStorage(f"{filename}"), - ) - study = optuna.create_study(study_name=study_name, storage=storage) - - def objective(trial: optuna.Trial) -> float: - x1 = trial.suggest_float("x1", 0, 10) - x2 = trial.suggest_float("x2", 0, 10) - return (x1 - 2) ** 2 + (x2 - 5) ** 2 - - study.optimize(objective, n_trials=100) - - with tempfile.TemporaryDirectory() as dir: - with tempfile.NamedTemporaryFile() as fp: - filename = fp.name - path = os.path.join(dir, filename) - create_storage_file(filename) - page.goto(url) - with page.expect_file_chooser() as fc_info: - page.get_by_role("button").nth(2).click() - file_chooser = fc_info.value - file_chooser.set_files(path) - - page.get_by_role("link", name=study_name).click() - - def count_components(page: Page, component_name: str): - component_count = page.evaluate( - f"""() => {{ - const components = document.querySelectorAll('.{component_name}'); - return components.length; - }}""" - ) - return component_count - count = count_components(page, "MuiCard-root") assert count == 4 diff --git a/e2e_tests/utils.py b/e2e_tests/utils.py index 68952ae9..2520fc65 100644 --- a/e2e_tests/utils.py +++ b/e2e_tests/utils.py @@ -1,9 +1,20 @@ from optuna_dashboard._storage import trials_cache from optuna_dashboard._storage import trials_cache_lock from optuna_dashboard._storage import trials_last_fetched_at +from playwright.sync_api import Page def clear_inmemory_cache() -> None: with trials_cache_lock: trials_cache.clear() trials_last_fetched_at.clear() + + +def count_components(page: Page, component_name: str): + component_count = page.evaluate( + f"""() => {{ + const components = document.querySelectorAll('.{component_name}'); + return components.length; + }}""" + ) + return component_count From 9eba1ce243248290a844800fdad616fa96c92e3f Mon Sep 17 00:00:00 2001 From: keisuke umezawa Date: Thu, 22 Feb 2024 10:38:59 +0900 Subject: [PATCH 3/7] Apply suggestions from code review Co-authored-by: Shuhei Watanabe <47781922+nabenabe0928@users.noreply.github.com> --- e2e_tests/test_standalone/test_study_list.py | 33 +++++++------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/e2e_tests/test_standalone/test_study_list.py b/e2e_tests/test_standalone/test_study_list.py index 18c57e08..0e6b5079 100644 --- a/e2e_tests/test_standalone/test_study_list.py +++ b/e2e_tests/test_standalone/test_study_list.py @@ -1,6 +1,6 @@ import os import tempfile -from typing import Callable +from collections.abc import Callable import optuna from playwright.sync_api import Page @@ -28,8 +28,16 @@ def test_home( assert title == "Optuna Dashboard (Wasm ver.)" -def create_rdb_storage_sqlite_file(filename: str, study_name: str): - storage = optuna.storages.RDBStorage(f"sqlite:///{filename}") +def create_rdb_storage_file(filename: str, study_name: str, storage_type: str): + if storage_type == "rdb": + storage = optuna.storages.RDBStorage(f"sqlite:///{filename}") + elif storage_type == "journal": + storage = optuna.storages.JournalStorage( + optuna.storages.JournalFileStorage(f"{filename}"), + ) + else: + assert False, f"Got an unexpected storage_type={storage_type}." + study = optuna.create_study(study_name=study_name, storage=storage) def objective(trial: optuna.Trial) -> float: @@ -40,24 +48,7 @@ def create_rdb_storage_sqlite_file(filename: str, study_name: str): study.optimize(objective, n_trials=100) -def create_journal_storage_local_file(filename: str, study_name: str): - storage = optuna.storages.JournalStorage( - optuna.storages.JournalFileStorage(f"{filename}"), - ) - study = optuna.create_study(study_name=study_name, storage=storage) - - def objective(trial: optuna.Trial) -> float: - x1 = trial.suggest_float("x1", 0, 10) - x2 = trial.suggest_float("x2", 0, 10) - return (x1 - 2) ** 2 + (x2 - 5) ** 2 - - study.optimize(objective, n_trials=100) - - -@pytest.mark.parametrize( - "create_storage_file", - [create_rdb_storage_sqlite_file, create_journal_storage_local_file], -) +@pytest.mark.parametrize("storage_type", ["rdb", "journal"]) def test_load_storage( page: Page, server_url: str, From 688d087240ee71fb8417fd786af9ef206d0d55e7 Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Sat, 2 Mar 2024 15:57:44 +0900 Subject: [PATCH 4/7] Fix isort --- e2e_tests/test_standalone/test_study_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e_tests/test_standalone/test_study_list.py b/e2e_tests/test_standalone/test_study_list.py index 0e6b5079..ed749979 100644 --- a/e2e_tests/test_standalone/test_study_list.py +++ b/e2e_tests/test_standalone/test_study_list.py @@ -1,6 +1,6 @@ +from collections.abc import Callable import os import tempfile -from collections.abc import Callable import optuna from playwright.sync_api import Page From 22653eeaf48892c82529c549f46a894555387c9b Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Sat, 2 Mar 2024 16:02:54 +0900 Subject: [PATCH 5/7] Update python version of standalone test --- .github/workflows/e2e-standalone-tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/e2e-standalone-tests.yml b/.github/workflows/e2e-standalone-tests.yml index 49839e4b..c3f654f2 100644 --- a/.github/workflows/e2e-standalone-tests.yml +++ b/.github/workflows/e2e-standalone-tests.yml @@ -31,6 +31,12 @@ jobs: with: node-version: '18' + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.10' + architecture: x64 + - name: Setup Optuna ${{ matrix.optuna-version }} run: | python -m pip install --progress-bar off --upgrade pip setuptools From 5bab40e33c357e0ccb344b1ff40af5aec8aa56da Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Sat, 2 Mar 2024 22:13:44 +0900 Subject: [PATCH 6/7] Fix typo --- e2e_tests/test_standalone/test_study_list.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e_tests/test_standalone/test_study_list.py b/e2e_tests/test_standalone/test_study_list.py index ed749979..9ac9f221 100644 --- a/e2e_tests/test_standalone/test_study_list.py +++ b/e2e_tests/test_standalone/test_study_list.py @@ -28,7 +28,7 @@ def test_home( assert title == "Optuna Dashboard (Wasm ver.)" -def create_rdb_storage_file(filename: str, study_name: str, storage_type: str): +def create_storage_file(filename: str, study_name: str, storage_type: str): if storage_type == "rdb": storage = optuna.storages.RDBStorage(f"sqlite:///{filename}") elif storage_type == "journal": @@ -52,7 +52,7 @@ def create_rdb_storage_file(filename: str, study_name: str, storage_type: str): def test_load_storage( page: Page, server_url: str, - create_storage_file: Callable[[str, str], optuna.storages.BaseStorage], + storage_type: str, ) -> None: study_name = "single-objective" url = f"{server_url}" @@ -61,7 +61,7 @@ def test_load_storage( with tempfile.NamedTemporaryFile() as fp: filename = fp.name path = os.path.join(dir, filename) - create_storage_file(filename, study_name) + create_storage_file(filename, study_name, storage_type) page.goto(url) with page.expect_file_chooser() as fc_info: page.get_by_role("button").nth(2).click() From 94815c56eee981d4785db04ec1b6e7e1ec5d03fa Mon Sep 17 00:00:00 2001 From: keisuke-umezawa Date: Sat, 2 Mar 2024 22:17:40 +0900 Subject: [PATCH 7/7] Fix flake8 --- e2e_tests/test_standalone/test_study_list.py | 1 - 1 file changed, 1 deletion(-) diff --git a/e2e_tests/test_standalone/test_study_list.py b/e2e_tests/test_standalone/test_study_list.py index 9ac9f221..3d163844 100644 --- a/e2e_tests/test_standalone/test_study_list.py +++ b/e2e_tests/test_standalone/test_study_list.py @@ -1,4 +1,3 @@ -from collections.abc import Callable import os import tempfile