Skip to content

Commit 3347912

Browse files
[#19050] GP Test automation changes
1 parent 664c285 commit 3347912

5 files changed

Lines changed: 109 additions & 55 deletions

File tree

tests/e2e-test/pytest.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ log_cli = true
33
log_cli_level = INFO
44
log_file = logs/tests.log
55
log_file_level = INFO
6-
addopts = -p no:warnings
6+
addopts = -p no:warnings --tb=short
7+

tests/e2e-test/readme.MD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Installing Playwright Pytest from Virtual Environment
2424

2525
Run test cases
2626

27-
- To run test cases from your 'tests' folder : "pytest --html=report.html --self-contained-html"
27+
- To run test cases from your 'tests/e2e-test' folder : "pytest --html=report.html --self-contained-html"
2828

2929
Create .env file in project root level with web app url and client credentials
3030

tests/e2e-test/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ pytest-reporter-html1
33
python-dotenv
44
pytest-check
55
pytest-html
6-
py
6+
py
7+
beautifulsoup4

tests/e2e-test/tests/conftest.py

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import os
2-
2+
import atexit
3+
import io
4+
from bs4 import BeautifulSoup
35
import pytest
6+
import logging
47
from config.constants import URL
58
from playwright.sync_api import sync_playwright
6-
from py.xml import html # type: ignore
79

810

911
@pytest.fixture(scope="session")
@@ -25,29 +27,74 @@ def login_logout():
2527
# perform close the browser
2628
browser.close()
2729

30+
log_streams = {}
2831

2932
@pytest.hookimpl(tryfirst=True)
30-
def pytest_html_report_title(report):
31-
report.title = "Automation_Content_Processing"
32-
33+
def pytest_runtest_setup(item):
34+
# Prepare StringIO for capturing logs
35+
stream = io.StringIO()
36+
handler = logging.StreamHandler(stream)
37+
handler.setLevel(logging.INFO)
3338

34-
# Add a column for descriptions
35-
def pytest_html_results_table_header(cells):
36-
cells.insert(1, html.th("Description"))
39+
logger = logging.getLogger()
40+
logger.addHandler(handler)
3741

42+
# Save handler and stream
43+
log_streams[item.nodeid] = (handler, stream)
3844

39-
def pytest_html_results_table_row(report, cells):
40-
cells.insert(
41-
1, html.td(report.description if hasattr(report, "description") else "")
42-
)
4345

44-
45-
# Add logs and docstring to report
4646
@pytest.hookimpl(hookwrapper=True)
4747
def pytest_runtest_makereport(item, call):
4848
outcome = yield
4949
report = outcome.get_result()
50-
report.description = str(item.function.__doc__)
51-
os.makedirs("logs", exist_ok=True)
52-
extra = getattr(report, "extra", [])
53-
report.extra = extra
50+
51+
handler, stream = log_streams.get(item.nodeid, (None, None))
52+
53+
if handler and stream:
54+
# Make sure logs are flushed
55+
handler.flush()
56+
log_output = stream.getvalue()
57+
58+
# Only remove the handler, don't close the stream yet
59+
logger = logging.getLogger()
60+
logger.removeHandler(handler)
61+
62+
# Store the log output on the report object for HTML reporting
63+
report.description = f"<pre>{log_output.strip()}</pre>"
64+
65+
# Clean up references
66+
log_streams.pop(item.nodeid, None)
67+
else:
68+
report.description = ""
69+
70+
def pytest_collection_modifyitems(items):
71+
for item in items:
72+
if hasattr(item, 'callspec'):
73+
prompt = item.callspec.params.get("prompt")
74+
if prompt:
75+
item._nodeid = prompt # This controls how the test name appears in the report
76+
77+
def rename_duration_column():
78+
report_path = os.path.abspath("report.html") # or your report filename
79+
if not os.path.exists(report_path):
80+
print("Report file not found, skipping column rename.")
81+
return
82+
83+
with open(report_path, 'r', encoding='utf-8') as f:
84+
soup = BeautifulSoup(f, 'html.parser')
85+
86+
# Find and rename the header
87+
headers = soup.select('table#results-table thead th')
88+
for th in headers:
89+
if th.text.strip() == 'Duration':
90+
th.string = 'Execution Time'
91+
#print("Renamed 'Duration' to 'Execution Time'")
92+
break
93+
else:
94+
print("'Duration' column not found in report.")
95+
96+
with open(report_path, 'w', encoding='utf-8') as f:
97+
f.write(str(soup))
98+
99+
# Register this function to run after everything is done
100+
atexit.register(rename_duration_column)
Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,46 @@
11
import logging
2-
32
import pytest
43
from pages.HomePage import HomePage
5-
4+
65
logger = logging.getLogger(__name__)
6+
7+
# Define step-wise test actions for Golden Path
8+
golden_path_steps = [
9+
("Validate home page is loaded", lambda home: home.validate_home_page()),
10+
("Select Invoice Schema", lambda home: home.select_schema("Invoice")),
11+
("Upload Invoice documents", lambda home: home.upload_files("Invoice")),
12+
("Refresh page till status is updated to Completed", lambda home: home.refresh()),
13+
("Validate extracted result for Invoice", lambda home: home.validate_invoice_extracted_result()),
14+
("Modify Extracted Data JSON & submit comments", lambda home: home.modify_and_submit_extracted_data()),
15+
("Validate process steps for Invoice", lambda home: home.validate_process_steps()),
16+
("Select Property Loss Damage Claim Form Schema", lambda home: home.select_schema("Property")),
17+
("Upload Property Loss Damage Claim Form documents", lambda home: home.upload_files("Property")),
18+
("Refresh page till status is updated to Completed", lambda home: home.refresh()),
19+
("Validate extracted result for Property Loss Damage Claim Form", lambda home: home.validate_property_extracted_result()),
20+
("Validate process steps for Property Loss Damage Claim Form", lambda home: home.validate_process_steps()),
21+
("Validate Delete files", lambda home: home.delete_files())
22+
]
23+
24+
# Generate readable test step IDs
25+
golden_path_ids = [f"{i+1:02d}. {desc}" for i, (desc, _) in enumerate(golden_path_steps)]
26+
727

28+
@pytest.mark.parametrize("description, action", golden_path_steps, ids=golden_path_ids)
29+
def test_content_processing_steps(login_logout, description, action, request):
30+
"""
31+
Executes Golden Path content processing steps with individual log entries.
32+
"""
33+
request.node._nodeid = description
834

9-
@pytest.mark.testcase_id("TC001")
10-
def test_ContentProcessing_Golden_path_test(login_logout):
11-
"""Validate Golden path test case for Content Processing Accelerator"""
1235
page = login_logout
13-
home_page = HomePage(page)
14-
logger.info("Step 1: Validate home page is loaded.")
15-
home_page.validate_home_page()
16-
logger.info("Step 2: Select Invoice Schema.")
17-
home_page.select_schema("Invoice")
18-
logger.info("Step 3: Upload Invoice documents.")
19-
home_page.upload_files("Invoice")
20-
logger.info("Step 4: Refresh page till status is updated to Completed.")
21-
home_page.refresh()
22-
logger.info("Step 5: Validate extracted result for Invoice.")
23-
home_page.validate_invoice_extracted_result()
24-
logger.info("Step 6: Modify Extracted Data JSON & submit comments.")
25-
home_page.modify_and_submit_extracted_data()
26-
logger.info("Step 7: Validate process steps for Invoice")
27-
home_page.validate_process_steps()
28-
logger.info("Step 8: Select Property Loss Damage Claim Form Schema.")
29-
home_page.select_schema("Property")
30-
logger.info("Step 9: Upload Property Loss Damage Claim Form documents.")
31-
home_page.upload_files("Property")
32-
logger.info("Step 10: Refresh page till status is updated to Completed.")
33-
home_page.refresh()
34-
logger.info(
35-
"Step 11: Validate extracted result for Property Loss Damage Claim Form."
36-
)
37-
home_page.validate_property_extracted_result()
38-
logger.info("Step 12: Validate process steps for Property Loss Damage Claim Form.")
39-
home_page.validate_process_steps()
40-
logger.info("Step 13: Validate Delete files.")
41-
home_page.delete_files()
36+
home = HomePage(page)
37+
38+
logger.info(f"Running test step: {description}")
39+
try:
40+
action(home)
41+
except Exception as e:
42+
logger.error(f"Step failed: {description}")
43+
raise
44+
45+
# Optionally attach to report
46+
request.node._report_sections.append(("call", "log", f"Step passed: {description}"))

0 commit comments

Comments
 (0)