pyplaykit 1.0.0__tar.gz → 1.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/PKG-INFO +131 -8
- pyplaykit-1.0.0/pyplaykit.egg-info/PKG-INFO → pyplaykit-1.5.0/README.md +121 -34
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit/__init__.py +31 -2
- pyplaykit-1.0.0/README.md → pyplaykit-1.5.0/pyplaykit.egg-info/PKG-INFO +157 -1
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit.egg-info/SOURCES.txt +5 -0
- pyplaykit-1.5.0/pyplaykit.egg-info/requires.txt +14 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyproject.toml +10 -7
- pyplaykit-1.5.0/utils/__init__.py +5 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/api_client.py +9 -1
- pyplaykit-1.5.0/utils/data_comparison_report.py +487 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/data_loader.py +42 -1
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/data_source.py +54 -6
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_client.py +78 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/db2.py +7 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/mysql.py +7 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/oracle.py +7 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/snowflake.py +7 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/sqlite.py +8 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/sqlserver.py +7 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_validation_helper.py +229 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/environment_validator.py +16 -3
- pyplaykit-1.5.0/utils/graphql_client.py +257 -0
- pyplaykit-1.5.0/utils/soap_client.py +260 -0
- pyplaykit-1.5.0/utils/transformation_validator.py +639 -0
- pyplaykit-1.5.0/utils/ui_db_validator.py +442 -0
- pyplaykit-1.0.0/pyplaykit.egg-info/requires.txt +0 -11
- pyplaykit-1.0.0/utils/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/MANIFEST.in +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/components/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/components/base_component.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/components/data_table.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/components/form_field.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/components/modal.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/config/config.yaml +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/config/environments.yaml +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/config/projects/customs_modernization.yaml +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/config/projects/dispatcho.yaml +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/config/projects/timelyquote.yaml +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/core/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/core/base_page.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/core/base_test.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/core/browser_factory.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/core/playwright_manager.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/dist_pkg/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/dist_pkg/distribution.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/integrations/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/integrations/adapters.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/orchestration/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/orchestration/enforcer.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/orchestration/planner.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pages/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pages/dashboard_page.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pages/login_page.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pages/orangehrm_login_page.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pages/saucedemo_inventory_page.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pages/saucedemo_login_page.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/plugins/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/plugins/api_plugin.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/plugins/base.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/plugins/data_plugin.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/plugins/registry.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/plugins/security_plugin.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit/cli.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit/plugin.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit.egg-info/dependency_links.txt +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit.egg-info/entry_points.txt +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/pyplaykit.egg-info/top_level.txt +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/resilience/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/resilience/locator_recovery.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/setup.cfg +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/api/ecom/auth_payloads.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/api/ecom/product_payloads.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/api_test_data.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/data_validation_test_data.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/login_test_data.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/orangehrm_login_data.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/test_data/ui_test_data.json +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/api_test_helper.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/assertion_helper.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/auth_manager.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/data_validator.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_drivers/__init__.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_factory.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_fixtures.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/db_pool.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/file_reader.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/logger.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/observability.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/response_validator.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/screenshot_helper.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/tdm.py +0 -0
- {pyplaykit-1.0.0 → pyplaykit-1.5.0}/utils/yaml_config_reader.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyplaykit
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5.0
|
|
4
4
|
Summary: Enterprise Python + Playwright automation framework
|
|
5
5
|
Author-email: Shan Konduru <shankonduru@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -20,16 +20,19 @@ Classifier: Operating System :: OS Independent
|
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
Requires-Dist: playwright==1.54.0
|
|
23
|
-
Requires-Dist: pytest==
|
|
24
|
-
Requires-Dist: pytest-cov==
|
|
25
|
-
Requires-Dist: pytest-xdist==3.
|
|
26
|
-
Requires-Dist: pytest-rerunfailures==
|
|
27
|
-
Requires-Dist: pytest-html==4.
|
|
28
|
-
Requires-Dist: allure-pytest==2.
|
|
23
|
+
Requires-Dist: pytest==9.1.1
|
|
24
|
+
Requires-Dist: pytest-cov==7.1.0
|
|
25
|
+
Requires-Dist: pytest-xdist==3.8.0
|
|
26
|
+
Requires-Dist: pytest-rerunfailures==16.4
|
|
27
|
+
Requires-Dist: pytest-html==4.2.0
|
|
28
|
+
Requires-Dist: allure-pytest==2.16.0
|
|
29
29
|
Requires-Dist: PyYAML==6.0.2
|
|
30
30
|
Requires-Dist: python-dotenv>=1.0.0
|
|
31
31
|
Requires-Dist: httpx>=0.27.0
|
|
32
32
|
Requires-Dist: jmespath>=1.0.0
|
|
33
|
+
Requires-Dist: xlrd>=2.0.1
|
|
34
|
+
Requires-Dist: zeep>=4.2.1
|
|
35
|
+
Requires-Dist: gql[httpx]>=3.5.0
|
|
33
36
|
|
|
34
37
|
# PyPlayKit - Enterprise Test Automation Framework
|
|
35
38
|
|
|
@@ -45,10 +48,12 @@ PyPlayKit is a **multi-project enterprise test automation framework** built with
|
|
|
45
48
|
- 🏢 **Multi-Project Support**: Separate test organization for multiple applications
|
|
46
49
|
- 👥 **Scalable**: Designed for 50-100 QE engineers working simultaneously
|
|
47
50
|
- 🎯 **Zero Merge Conflicts**: Project-first organization eliminates conflicts
|
|
51
|
+
- 📊 **Data Comparison**: File-to-File, File-to-DB, DB-to-File validation (Excel, CSV, JSON)
|
|
52
|
+
- 📈 **Interactive HTML Reports**: Filterable validation reports with KPIs ⭐ **NEW**
|
|
48
53
|
- 📚 **Comprehensive Documentation**: 8,700+ lines across 15+ guides
|
|
49
54
|
- 🔧 **Extensible**: Plugin architecture with orchestration support
|
|
50
55
|
- 🔍 **Self-Healing**: Locator recovery with fallback chains
|
|
51
|
-
-
|
|
56
|
+
- 🔭 **Observable**: Comprehensive metrics and reporting
|
|
52
57
|
|
|
53
58
|
---
|
|
54
59
|
|
|
@@ -437,6 +442,118 @@ pytest tests/projects/timelyquote/functional/ui/quotes/test_create_quote.py -v
|
|
|
437
442
|
|
|
438
443
|
---
|
|
439
444
|
|
|
445
|
+
## Data Comparison Patterns
|
|
446
|
+
|
|
447
|
+
PyPlayKit provides comprehensive data comparison capabilities using the built-in `DataValidator` utility.
|
|
448
|
+
|
|
449
|
+
### Prerequisites for Data Comparison
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
# Install data comparison dependencies
|
|
453
|
+
pip install pandas openpyxl
|
|
454
|
+
|
|
455
|
+
# Or use the examples requirements file
|
|
456
|
+
pip install -r examples/requirements.txt
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### Supported Comparison Types
|
|
460
|
+
|
|
461
|
+
| Comparison Type | Use Case | Example |
|
|
462
|
+
|----------------|----------|---------|
|
|
463
|
+
| **File-to-File** | Compare Excel, CSV, JSON files | Validate data export/import |
|
|
464
|
+
| **File-to-Database** | Verify data loads into database | ETL validation |
|
|
465
|
+
| **Database-to-File** | Validate database exports | Report generation testing |
|
|
466
|
+
|
|
467
|
+
### Quick Example: Excel-to-Excel Comparison
|
|
468
|
+
|
|
469
|
+
```python
|
|
470
|
+
import pytest
|
|
471
|
+
import pandas as pd
|
|
472
|
+
from pathlib import Path
|
|
473
|
+
from pyplaykit import DataValidator
|
|
474
|
+
|
|
475
|
+
@pytest.mark.data
|
|
476
|
+
def test_compare_excel_files(logger):
|
|
477
|
+
# Read both files
|
|
478
|
+
df1 = pd.read_excel("report_baseline.xlsx")
|
|
479
|
+
df2 = pd.read_excel("report_current.xlsx")
|
|
480
|
+
|
|
481
|
+
records1 = df1.to_dict('records')
|
|
482
|
+
records2 = df2.to_dict('records')
|
|
483
|
+
|
|
484
|
+
# Compare row by row
|
|
485
|
+
for idx, (r1, r2) in enumerate(zip(records1, records2)):
|
|
486
|
+
DataValidator.assert_records_equal(r1, r2)
|
|
487
|
+
|
|
488
|
+
logger.info("✓ Files match!")
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### DataValidator Methods
|
|
492
|
+
|
|
493
|
+
| Method | Purpose |
|
|
494
|
+
|--------|---------|
|
|
495
|
+
| `assert_records_equal()` | Compare two dictionaries exactly |
|
|
496
|
+
| `assert_floats_equal()` | Compare numeric values with tolerance |
|
|
497
|
+
| `assert_strings_equal_normalized()` | Compare strings with normalization |
|
|
498
|
+
| `assert_collection_contains_record()` | Check if record exists in collection |
|
|
499
|
+
| `assert_datetimes_equal()` | Compare datetime values |
|
|
500
|
+
|
|
501
|
+
### Runnable Examples
|
|
502
|
+
|
|
503
|
+
See **[examples/data_comparison_examples.py](examples/data_comparison_examples.py)** for 8 complete examples:
|
|
504
|
+
|
|
505
|
+
```bash
|
|
506
|
+
# Run all data comparison examples
|
|
507
|
+
pytest examples/data_comparison_examples.py -v -s
|
|
508
|
+
|
|
509
|
+
# Run specific example
|
|
510
|
+
pytest examples/data_comparison_examples.py::test_excel_to_excel_basic -v -s
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### Interactive HTML Reports ⭐ **NEW**
|
|
514
|
+
|
|
515
|
+
Generate filterable, searchable HTML validation reports:
|
|
516
|
+
|
|
517
|
+
```python
|
|
518
|
+
from utils.data_comparison_report import DataComparisonReport
|
|
519
|
+
|
|
520
|
+
# Initialize report
|
|
521
|
+
report = DataComparisonReport()
|
|
522
|
+
report.set_comparison_type("FILE_TO_FILE (Excel)")
|
|
523
|
+
report.set_source("baseline.xlsx", 100)
|
|
524
|
+
report.set_target("current.xlsx", 100)
|
|
525
|
+
|
|
526
|
+
# Add mismatch
|
|
527
|
+
report.add_mismatch(
|
|
528
|
+
mismatch_type="VALUE_MISMATCH",
|
|
529
|
+
row_index=5,
|
|
530
|
+
mismatching_fields=["Price"],
|
|
531
|
+
source_value=99.99,
|
|
532
|
+
target_value=100.00,
|
|
533
|
+
reason="Price increased by $0.01"
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
# Generate interactive HTML report
|
|
537
|
+
report.generate_report("reports/data_validation/report.html")
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
**Report Features:**
|
|
541
|
+
- 📊 KPI dashboard with pass/fail rates
|
|
542
|
+
- 🔍 Column-level filtering and search
|
|
543
|
+
- 📋 Row-by-row mismatch details
|
|
544
|
+
- 🎨 Color-coded status indicators
|
|
545
|
+
- 📱 Mobile-responsive design
|
|
546
|
+
|
|
547
|
+
See **[examples/data_comparison_with_html_report.py](examples/data_comparison_with_html_report.py)** for complete examples.
|
|
548
|
+
|
|
549
|
+
### Full Documentation
|
|
550
|
+
|
|
551
|
+
- **[docs/PIP_INSTALL_GUIDE.md](docs/PIP_INSTALL_GUIDE.md#step-8--data-comparison-patterns)** - Complete patterns guide
|
|
552
|
+
- **[examples/README.md](examples/README.md)** - Examples documentation
|
|
553
|
+
- **[docs/DATA_VALIDATION_GUIDE.md](docs/DATA_VALIDATION_GUIDE.md)** - Advanced validation
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
440
557
|
## Unit Testing and Coverage
|
|
441
558
|
|
|
442
559
|
```bash
|
|
@@ -506,6 +623,7 @@ Each project config includes:
|
|
|
506
623
|
- **[QUICK_START_QE.md](QUICK_START_QE.md)** - Get started in 10 minutes
|
|
507
624
|
- **[TEST_LOCATION_CHEATSHEET.md](TEST_LOCATION_CHEATSHEET.md)** - One-page reference
|
|
508
625
|
- **[COMMANDS_FOR_YOUR_PROJECTS.md](COMMANDS_FOR_YOUR_PROJECTS.md)** - Command reference
|
|
626
|
+
- **[docs/PIP_INSTALL_GUIDE.md](docs/PIP_INSTALL_GUIDE.md)** - Pip install guide with data comparison patterns
|
|
509
627
|
|
|
510
628
|
### Implementation
|
|
511
629
|
- **[YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md](YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md)** - Step-by-step guide
|
|
@@ -517,6 +635,11 @@ Each project config includes:
|
|
|
517
635
|
- **[docs/TEST_ORGANIZATION.md](docs/TEST_ORGANIZATION.md)** - Organization strategy
|
|
518
636
|
- **[docs/QE_VISUAL_GUIDE.md](docs/QE_VISUAL_GUIDE.md)** - Visual guide with diagrams
|
|
519
637
|
|
|
638
|
+
### Data Comparison & Validation
|
|
639
|
+
- **[examples/data_comparison_examples.py](examples/data_comparison_examples.py)** - Runnable examples for Excel, CSV, DB comparison
|
|
640
|
+
- **[examples/README.md](examples/README.md)** - Examples documentation
|
|
641
|
+
- **[docs/DATA_VALIDATION_GUIDE.md](docs/DATA_VALIDATION_GUIDE.md)** - Advanced validation patterns
|
|
642
|
+
|
|
520
643
|
### Project Guides
|
|
521
644
|
- **[tests/projects/timelyquote/README.md](tests/projects/timelyquote/README.md)** - TimelyQuote guide
|
|
522
645
|
- **[tests/projects/dispatcho/README.md](tests/projects/dispatcho/README.md)** - Dispatcho guide
|
|
@@ -1,36 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: pyplaykit
|
|
3
|
-
Version: 1.0.0
|
|
4
|
-
Summary: Enterprise Python + Playwright automation framework
|
|
5
|
-
Author-email: Shan Konduru <shankonduru@gmail.com>
|
|
6
|
-
License: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/ShanKonduru/pyplaykit
|
|
8
|
-
Project-URL: Repository, https://github.com/ShanKonduru/pyplaykit
|
|
9
|
-
Project-URL: Bug Tracker, https://github.com/ShanKonduru/pyplaykit/issues
|
|
10
|
-
Keywords: playwright,pytest,automation,framework,enterprise,testing,page-object-model
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
-
Classifier: Framework :: Pytest
|
|
16
|
-
Classifier: Topic :: Software Development :: Testing
|
|
17
|
-
Classifier: Intended Audience :: Developers
|
|
18
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
-
Classifier: Operating System :: OS Independent
|
|
20
|
-
Requires-Python: >=3.11
|
|
21
|
-
Description-Content-Type: text/markdown
|
|
22
|
-
Requires-Dist: playwright==1.54.0
|
|
23
|
-
Requires-Dist: pytest==8.4.1
|
|
24
|
-
Requires-Dist: pytest-cov==6.2.1
|
|
25
|
-
Requires-Dist: pytest-xdist==3.6.1
|
|
26
|
-
Requires-Dist: pytest-rerunfailures==15.1
|
|
27
|
-
Requires-Dist: pytest-html==4.1.1
|
|
28
|
-
Requires-Dist: allure-pytest==2.13.5
|
|
29
|
-
Requires-Dist: PyYAML==6.0.2
|
|
30
|
-
Requires-Dist: python-dotenv>=1.0.0
|
|
31
|
-
Requires-Dist: httpx>=0.27.0
|
|
32
|
-
Requires-Dist: jmespath>=1.0.0
|
|
33
|
-
|
|
34
1
|
# PyPlayKit - Enterprise Test Automation Framework
|
|
35
2
|
|
|
36
3
|
**Tagline**: A modular, scalable, and CI/CD-ready Python + Playwright framework for enterprise automation supporting multiple projects and 50+ QE engineers.
|
|
@@ -45,10 +12,12 @@ PyPlayKit is a **multi-project enterprise test automation framework** built with
|
|
|
45
12
|
- 🏢 **Multi-Project Support**: Separate test organization for multiple applications
|
|
46
13
|
- 👥 **Scalable**: Designed for 50-100 QE engineers working simultaneously
|
|
47
14
|
- 🎯 **Zero Merge Conflicts**: Project-first organization eliminates conflicts
|
|
15
|
+
- 📊 **Data Comparison**: File-to-File, File-to-DB, DB-to-File validation (Excel, CSV, JSON)
|
|
16
|
+
- 📈 **Interactive HTML Reports**: Filterable validation reports with KPIs ⭐ **NEW**
|
|
48
17
|
- 📚 **Comprehensive Documentation**: 8,700+ lines across 15+ guides
|
|
49
18
|
- 🔧 **Extensible**: Plugin architecture with orchestration support
|
|
50
19
|
- 🔍 **Self-Healing**: Locator recovery with fallback chains
|
|
51
|
-
-
|
|
20
|
+
- 🔭 **Observable**: Comprehensive metrics and reporting
|
|
52
21
|
|
|
53
22
|
---
|
|
54
23
|
|
|
@@ -437,6 +406,118 @@ pytest tests/projects/timelyquote/functional/ui/quotes/test_create_quote.py -v
|
|
|
437
406
|
|
|
438
407
|
---
|
|
439
408
|
|
|
409
|
+
## Data Comparison Patterns
|
|
410
|
+
|
|
411
|
+
PyPlayKit provides comprehensive data comparison capabilities using the built-in `DataValidator` utility.
|
|
412
|
+
|
|
413
|
+
### Prerequisites for Data Comparison
|
|
414
|
+
|
|
415
|
+
```bash
|
|
416
|
+
# Install data comparison dependencies
|
|
417
|
+
pip install pandas openpyxl
|
|
418
|
+
|
|
419
|
+
# Or use the examples requirements file
|
|
420
|
+
pip install -r examples/requirements.txt
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Supported Comparison Types
|
|
424
|
+
|
|
425
|
+
| Comparison Type | Use Case | Example |
|
|
426
|
+
|----------------|----------|---------|
|
|
427
|
+
| **File-to-File** | Compare Excel, CSV, JSON files | Validate data export/import |
|
|
428
|
+
| **File-to-Database** | Verify data loads into database | ETL validation |
|
|
429
|
+
| **Database-to-File** | Validate database exports | Report generation testing |
|
|
430
|
+
|
|
431
|
+
### Quick Example: Excel-to-Excel Comparison
|
|
432
|
+
|
|
433
|
+
```python
|
|
434
|
+
import pytest
|
|
435
|
+
import pandas as pd
|
|
436
|
+
from pathlib import Path
|
|
437
|
+
from pyplaykit import DataValidator
|
|
438
|
+
|
|
439
|
+
@pytest.mark.data
|
|
440
|
+
def test_compare_excel_files(logger):
|
|
441
|
+
# Read both files
|
|
442
|
+
df1 = pd.read_excel("report_baseline.xlsx")
|
|
443
|
+
df2 = pd.read_excel("report_current.xlsx")
|
|
444
|
+
|
|
445
|
+
records1 = df1.to_dict('records')
|
|
446
|
+
records2 = df2.to_dict('records')
|
|
447
|
+
|
|
448
|
+
# Compare row by row
|
|
449
|
+
for idx, (r1, r2) in enumerate(zip(records1, records2)):
|
|
450
|
+
DataValidator.assert_records_equal(r1, r2)
|
|
451
|
+
|
|
452
|
+
logger.info("✓ Files match!")
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### DataValidator Methods
|
|
456
|
+
|
|
457
|
+
| Method | Purpose |
|
|
458
|
+
|--------|---------|
|
|
459
|
+
| `assert_records_equal()` | Compare two dictionaries exactly |
|
|
460
|
+
| `assert_floats_equal()` | Compare numeric values with tolerance |
|
|
461
|
+
| `assert_strings_equal_normalized()` | Compare strings with normalization |
|
|
462
|
+
| `assert_collection_contains_record()` | Check if record exists in collection |
|
|
463
|
+
| `assert_datetimes_equal()` | Compare datetime values |
|
|
464
|
+
|
|
465
|
+
### Runnable Examples
|
|
466
|
+
|
|
467
|
+
See **[examples/data_comparison_examples.py](examples/data_comparison_examples.py)** for 8 complete examples:
|
|
468
|
+
|
|
469
|
+
```bash
|
|
470
|
+
# Run all data comparison examples
|
|
471
|
+
pytest examples/data_comparison_examples.py -v -s
|
|
472
|
+
|
|
473
|
+
# Run specific example
|
|
474
|
+
pytest examples/data_comparison_examples.py::test_excel_to_excel_basic -v -s
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### Interactive HTML Reports ⭐ **NEW**
|
|
478
|
+
|
|
479
|
+
Generate filterable, searchable HTML validation reports:
|
|
480
|
+
|
|
481
|
+
```python
|
|
482
|
+
from utils.data_comparison_report import DataComparisonReport
|
|
483
|
+
|
|
484
|
+
# Initialize report
|
|
485
|
+
report = DataComparisonReport()
|
|
486
|
+
report.set_comparison_type("FILE_TO_FILE (Excel)")
|
|
487
|
+
report.set_source("baseline.xlsx", 100)
|
|
488
|
+
report.set_target("current.xlsx", 100)
|
|
489
|
+
|
|
490
|
+
# Add mismatch
|
|
491
|
+
report.add_mismatch(
|
|
492
|
+
mismatch_type="VALUE_MISMATCH",
|
|
493
|
+
row_index=5,
|
|
494
|
+
mismatching_fields=["Price"],
|
|
495
|
+
source_value=99.99,
|
|
496
|
+
target_value=100.00,
|
|
497
|
+
reason="Price increased by $0.01"
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
# Generate interactive HTML report
|
|
501
|
+
report.generate_report("reports/data_validation/report.html")
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
**Report Features:**
|
|
505
|
+
- 📊 KPI dashboard with pass/fail rates
|
|
506
|
+
- 🔍 Column-level filtering and search
|
|
507
|
+
- 📋 Row-by-row mismatch details
|
|
508
|
+
- 🎨 Color-coded status indicators
|
|
509
|
+
- 📱 Mobile-responsive design
|
|
510
|
+
|
|
511
|
+
See **[examples/data_comparison_with_html_report.py](examples/data_comparison_with_html_report.py)** for complete examples.
|
|
512
|
+
|
|
513
|
+
### Full Documentation
|
|
514
|
+
|
|
515
|
+
- **[docs/PIP_INSTALL_GUIDE.md](docs/PIP_INSTALL_GUIDE.md#step-8--data-comparison-patterns)** - Complete patterns guide
|
|
516
|
+
- **[examples/README.md](examples/README.md)** - Examples documentation
|
|
517
|
+
- **[docs/DATA_VALIDATION_GUIDE.md](docs/DATA_VALIDATION_GUIDE.md)** - Advanced validation
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
|
|
440
521
|
## Unit Testing and Coverage
|
|
441
522
|
|
|
442
523
|
```bash
|
|
@@ -506,6 +587,7 @@ Each project config includes:
|
|
|
506
587
|
- **[QUICK_START_QE.md](QUICK_START_QE.md)** - Get started in 10 minutes
|
|
507
588
|
- **[TEST_LOCATION_CHEATSHEET.md](TEST_LOCATION_CHEATSHEET.md)** - One-page reference
|
|
508
589
|
- **[COMMANDS_FOR_YOUR_PROJECTS.md](COMMANDS_FOR_YOUR_PROJECTS.md)** - Command reference
|
|
590
|
+
- **[docs/PIP_INSTALL_GUIDE.md](docs/PIP_INSTALL_GUIDE.md)** - Pip install guide with data comparison patterns
|
|
509
591
|
|
|
510
592
|
### Implementation
|
|
511
593
|
- **[YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md](YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md)** - Step-by-step guide
|
|
@@ -517,6 +599,11 @@ Each project config includes:
|
|
|
517
599
|
- **[docs/TEST_ORGANIZATION.md](docs/TEST_ORGANIZATION.md)** - Organization strategy
|
|
518
600
|
- **[docs/QE_VISUAL_GUIDE.md](docs/QE_VISUAL_GUIDE.md)** - Visual guide with diagrams
|
|
519
601
|
|
|
602
|
+
### Data Comparison & Validation
|
|
603
|
+
- **[examples/data_comparison_examples.py](examples/data_comparison_examples.py)** - Runnable examples for Excel, CSV, DB comparison
|
|
604
|
+
- **[examples/README.md](examples/README.md)** - Examples documentation
|
|
605
|
+
- **[docs/DATA_VALIDATION_GUIDE.md](docs/DATA_VALIDATION_GUIDE.md)** - Advanced validation patterns
|
|
606
|
+
|
|
520
607
|
### Project Guides
|
|
521
608
|
- **[tests/projects/timelyquote/README.md](tests/projects/timelyquote/README.md)** - TimelyQuote guide
|
|
522
609
|
- **[tests/projects/dispatcho/README.md](tests/projects/dispatcho/README.md)** - Dispatcho guide
|
|
@@ -13,27 +13,56 @@ from core.base_page import BasePage
|
|
|
13
13
|
from utils.api_client import ApiClient, ApiResponse
|
|
14
14
|
from utils.auth_manager import AuthTokenManager
|
|
15
15
|
from utils.data_validator import DataValidator
|
|
16
|
+
from utils.ui_db_validator import UIDbValidator
|
|
17
|
+
from utils.graphql_client import GraphQLClient, GraphQLResponse, GraphQLValidator
|
|
18
|
+
from utils.soap_client import SoapClient, SoapResponse, SoapValidator
|
|
16
19
|
from utils.db_client import BaseDbClient, DbClient
|
|
20
|
+
from utils.transformation_validator import (
|
|
21
|
+
ColumnSpec,
|
|
22
|
+
PairRule,
|
|
23
|
+
RowRule,
|
|
24
|
+
RuleValidator,
|
|
25
|
+
TransformationValidator,
|
|
26
|
+
Violation,
|
|
27
|
+
)
|
|
17
28
|
from utils.db_fixtures import DbCleaner, DbSeeder, DbTransaction
|
|
29
|
+
from utils.data_source import ChunkedDbDataSource
|
|
18
30
|
from utils.logger import get_logger
|
|
19
31
|
from utils.response_validator import ResponseValidator
|
|
20
32
|
|
|
21
|
-
__version__ = "1.
|
|
33
|
+
__version__ = "1.3.0"
|
|
22
34
|
|
|
23
35
|
__all__ = [
|
|
24
|
-
# HTTP / API
|
|
36
|
+
# HTTP / API — REST
|
|
25
37
|
"ApiClient",
|
|
26
38
|
"ApiResponse",
|
|
27
39
|
"AuthTokenManager",
|
|
28
40
|
"ResponseValidator",
|
|
41
|
+
# HTTP / API — GraphQL
|
|
42
|
+
"GraphQLClient",
|
|
43
|
+
"GraphQLResponse",
|
|
44
|
+
"GraphQLValidator",
|
|
45
|
+
# HTTP / API — SOAP
|
|
46
|
+
"SoapClient",
|
|
47
|
+
"SoapResponse",
|
|
48
|
+
"SoapValidator",
|
|
29
49
|
# Data validation
|
|
30
50
|
"DataValidator",
|
|
51
|
+
"UIDbValidator",
|
|
52
|
+
# Transformation + rule-based validation
|
|
53
|
+
"ColumnSpec",
|
|
54
|
+
"TransformationValidator",
|
|
55
|
+
"RowRule",
|
|
56
|
+
"PairRule",
|
|
57
|
+
"RuleValidator",
|
|
58
|
+
"Violation",
|
|
31
59
|
# Database
|
|
32
60
|
"BaseDbClient",
|
|
33
61
|
"DbClient",
|
|
34
62
|
"DbTransaction",
|
|
35
63
|
"DbSeeder",
|
|
36
64
|
"DbCleaner",
|
|
65
|
+
"ChunkedDbDataSource",
|
|
37
66
|
# UI
|
|
38
67
|
"BasePage",
|
|
39
68
|
"BaseComponent",
|
|
@@ -1,3 +1,39 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pyplaykit
|
|
3
|
+
Version: 1.5.0
|
|
4
|
+
Summary: Enterprise Python + Playwright automation framework
|
|
5
|
+
Author-email: Shan Konduru <shankonduru@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/ShanKonduru/pyplaykit
|
|
8
|
+
Project-URL: Repository, https://github.com/ShanKonduru/pyplaykit
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/ShanKonduru/pyplaykit/issues
|
|
10
|
+
Keywords: playwright,pytest,automation,framework,enterprise,testing,page-object-model
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Framework :: Pytest
|
|
16
|
+
Classifier: Topic :: Software Development :: Testing
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: playwright==1.54.0
|
|
23
|
+
Requires-Dist: pytest==9.1.1
|
|
24
|
+
Requires-Dist: pytest-cov==7.1.0
|
|
25
|
+
Requires-Dist: pytest-xdist==3.8.0
|
|
26
|
+
Requires-Dist: pytest-rerunfailures==16.4
|
|
27
|
+
Requires-Dist: pytest-html==4.2.0
|
|
28
|
+
Requires-Dist: allure-pytest==2.16.0
|
|
29
|
+
Requires-Dist: PyYAML==6.0.2
|
|
30
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
31
|
+
Requires-Dist: httpx>=0.27.0
|
|
32
|
+
Requires-Dist: jmespath>=1.0.0
|
|
33
|
+
Requires-Dist: xlrd>=2.0.1
|
|
34
|
+
Requires-Dist: zeep>=4.2.1
|
|
35
|
+
Requires-Dist: gql[httpx]>=3.5.0
|
|
36
|
+
|
|
1
37
|
# PyPlayKit - Enterprise Test Automation Framework
|
|
2
38
|
|
|
3
39
|
**Tagline**: A modular, scalable, and CI/CD-ready Python + Playwright framework for enterprise automation supporting multiple projects and 50+ QE engineers.
|
|
@@ -12,10 +48,12 @@ PyPlayKit is a **multi-project enterprise test automation framework** built with
|
|
|
12
48
|
- 🏢 **Multi-Project Support**: Separate test organization for multiple applications
|
|
13
49
|
- 👥 **Scalable**: Designed for 50-100 QE engineers working simultaneously
|
|
14
50
|
- 🎯 **Zero Merge Conflicts**: Project-first organization eliminates conflicts
|
|
51
|
+
- 📊 **Data Comparison**: File-to-File, File-to-DB, DB-to-File validation (Excel, CSV, JSON)
|
|
52
|
+
- 📈 **Interactive HTML Reports**: Filterable validation reports with KPIs ⭐ **NEW**
|
|
15
53
|
- 📚 **Comprehensive Documentation**: 8,700+ lines across 15+ guides
|
|
16
54
|
- 🔧 **Extensible**: Plugin architecture with orchestration support
|
|
17
55
|
- 🔍 **Self-Healing**: Locator recovery with fallback chains
|
|
18
|
-
-
|
|
56
|
+
- 🔭 **Observable**: Comprehensive metrics and reporting
|
|
19
57
|
|
|
20
58
|
---
|
|
21
59
|
|
|
@@ -404,6 +442,118 @@ pytest tests/projects/timelyquote/functional/ui/quotes/test_create_quote.py -v
|
|
|
404
442
|
|
|
405
443
|
---
|
|
406
444
|
|
|
445
|
+
## Data Comparison Patterns
|
|
446
|
+
|
|
447
|
+
PyPlayKit provides comprehensive data comparison capabilities using the built-in `DataValidator` utility.
|
|
448
|
+
|
|
449
|
+
### Prerequisites for Data Comparison
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
# Install data comparison dependencies
|
|
453
|
+
pip install pandas openpyxl
|
|
454
|
+
|
|
455
|
+
# Or use the examples requirements file
|
|
456
|
+
pip install -r examples/requirements.txt
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### Supported Comparison Types
|
|
460
|
+
|
|
461
|
+
| Comparison Type | Use Case | Example |
|
|
462
|
+
|----------------|----------|---------|
|
|
463
|
+
| **File-to-File** | Compare Excel, CSV, JSON files | Validate data export/import |
|
|
464
|
+
| **File-to-Database** | Verify data loads into database | ETL validation |
|
|
465
|
+
| **Database-to-File** | Validate database exports | Report generation testing |
|
|
466
|
+
|
|
467
|
+
### Quick Example: Excel-to-Excel Comparison
|
|
468
|
+
|
|
469
|
+
```python
|
|
470
|
+
import pytest
|
|
471
|
+
import pandas as pd
|
|
472
|
+
from pathlib import Path
|
|
473
|
+
from pyplaykit import DataValidator
|
|
474
|
+
|
|
475
|
+
@pytest.mark.data
|
|
476
|
+
def test_compare_excel_files(logger):
|
|
477
|
+
# Read both files
|
|
478
|
+
df1 = pd.read_excel("report_baseline.xlsx")
|
|
479
|
+
df2 = pd.read_excel("report_current.xlsx")
|
|
480
|
+
|
|
481
|
+
records1 = df1.to_dict('records')
|
|
482
|
+
records2 = df2.to_dict('records')
|
|
483
|
+
|
|
484
|
+
# Compare row by row
|
|
485
|
+
for idx, (r1, r2) in enumerate(zip(records1, records2)):
|
|
486
|
+
DataValidator.assert_records_equal(r1, r2)
|
|
487
|
+
|
|
488
|
+
logger.info("✓ Files match!")
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### DataValidator Methods
|
|
492
|
+
|
|
493
|
+
| Method | Purpose |
|
|
494
|
+
|--------|---------|
|
|
495
|
+
| `assert_records_equal()` | Compare two dictionaries exactly |
|
|
496
|
+
| `assert_floats_equal()` | Compare numeric values with tolerance |
|
|
497
|
+
| `assert_strings_equal_normalized()` | Compare strings with normalization |
|
|
498
|
+
| `assert_collection_contains_record()` | Check if record exists in collection |
|
|
499
|
+
| `assert_datetimes_equal()` | Compare datetime values |
|
|
500
|
+
|
|
501
|
+
### Runnable Examples
|
|
502
|
+
|
|
503
|
+
See **[examples/data_comparison_examples.py](examples/data_comparison_examples.py)** for 8 complete examples:
|
|
504
|
+
|
|
505
|
+
```bash
|
|
506
|
+
# Run all data comparison examples
|
|
507
|
+
pytest examples/data_comparison_examples.py -v -s
|
|
508
|
+
|
|
509
|
+
# Run specific example
|
|
510
|
+
pytest examples/data_comparison_examples.py::test_excel_to_excel_basic -v -s
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### Interactive HTML Reports ⭐ **NEW**
|
|
514
|
+
|
|
515
|
+
Generate filterable, searchable HTML validation reports:
|
|
516
|
+
|
|
517
|
+
```python
|
|
518
|
+
from utils.data_comparison_report import DataComparisonReport
|
|
519
|
+
|
|
520
|
+
# Initialize report
|
|
521
|
+
report = DataComparisonReport()
|
|
522
|
+
report.set_comparison_type("FILE_TO_FILE (Excel)")
|
|
523
|
+
report.set_source("baseline.xlsx", 100)
|
|
524
|
+
report.set_target("current.xlsx", 100)
|
|
525
|
+
|
|
526
|
+
# Add mismatch
|
|
527
|
+
report.add_mismatch(
|
|
528
|
+
mismatch_type="VALUE_MISMATCH",
|
|
529
|
+
row_index=5,
|
|
530
|
+
mismatching_fields=["Price"],
|
|
531
|
+
source_value=99.99,
|
|
532
|
+
target_value=100.00,
|
|
533
|
+
reason="Price increased by $0.01"
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
# Generate interactive HTML report
|
|
537
|
+
report.generate_report("reports/data_validation/report.html")
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
**Report Features:**
|
|
541
|
+
- 📊 KPI dashboard with pass/fail rates
|
|
542
|
+
- 🔍 Column-level filtering and search
|
|
543
|
+
- 📋 Row-by-row mismatch details
|
|
544
|
+
- 🎨 Color-coded status indicators
|
|
545
|
+
- 📱 Mobile-responsive design
|
|
546
|
+
|
|
547
|
+
See **[examples/data_comparison_with_html_report.py](examples/data_comparison_with_html_report.py)** for complete examples.
|
|
548
|
+
|
|
549
|
+
### Full Documentation
|
|
550
|
+
|
|
551
|
+
- **[docs/PIP_INSTALL_GUIDE.md](docs/PIP_INSTALL_GUIDE.md#step-8--data-comparison-patterns)** - Complete patterns guide
|
|
552
|
+
- **[examples/README.md](examples/README.md)** - Examples documentation
|
|
553
|
+
- **[docs/DATA_VALIDATION_GUIDE.md](docs/DATA_VALIDATION_GUIDE.md)** - Advanced validation
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
407
557
|
## Unit Testing and Coverage
|
|
408
558
|
|
|
409
559
|
```bash
|
|
@@ -473,6 +623,7 @@ Each project config includes:
|
|
|
473
623
|
- **[QUICK_START_QE.md](QUICK_START_QE.md)** - Get started in 10 minutes
|
|
474
624
|
- **[TEST_LOCATION_CHEATSHEET.md](TEST_LOCATION_CHEATSHEET.md)** - One-page reference
|
|
475
625
|
- **[COMMANDS_FOR_YOUR_PROJECTS.md](COMMANDS_FOR_YOUR_PROJECTS.md)** - Command reference
|
|
626
|
+
- **[docs/PIP_INSTALL_GUIDE.md](docs/PIP_INSTALL_GUIDE.md)** - Pip install guide with data comparison patterns
|
|
476
627
|
|
|
477
628
|
### Implementation
|
|
478
629
|
- **[YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md](YOUR_PROJECTS_IMPLEMENTATION_GUIDE.md)** - Step-by-step guide
|
|
@@ -484,6 +635,11 @@ Each project config includes:
|
|
|
484
635
|
- **[docs/TEST_ORGANIZATION.md](docs/TEST_ORGANIZATION.md)** - Organization strategy
|
|
485
636
|
- **[docs/QE_VISUAL_GUIDE.md](docs/QE_VISUAL_GUIDE.md)** - Visual guide with diagrams
|
|
486
637
|
|
|
638
|
+
### Data Comparison & Validation
|
|
639
|
+
- **[examples/data_comparison_examples.py](examples/data_comparison_examples.py)** - Runnable examples for Excel, CSV, DB comparison
|
|
640
|
+
- **[examples/README.md](examples/README.md)** - Examples documentation
|
|
641
|
+
- **[docs/DATA_VALIDATION_GUIDE.md](docs/DATA_VALIDATION_GUIDE.md)** - Advanced validation patterns
|
|
642
|
+
|
|
487
643
|
### Project Guides
|
|
488
644
|
- **[tests/projects/timelyquote/README.md](tests/projects/timelyquote/README.md)** - TimelyQuote guide
|
|
489
645
|
- **[tests/projects/dispatcho/README.md](tests/projects/dispatcho/README.md)** - Dispatcho guide
|
|
@@ -58,6 +58,7 @@ utils/api_client.py
|
|
|
58
58
|
utils/api_test_helper.py
|
|
59
59
|
utils/assertion_helper.py
|
|
60
60
|
utils/auth_manager.py
|
|
61
|
+
utils/data_comparison_report.py
|
|
61
62
|
utils/data_loader.py
|
|
62
63
|
utils/data_source.py
|
|
63
64
|
utils/data_validator.py
|
|
@@ -68,11 +69,15 @@ utils/db_pool.py
|
|
|
68
69
|
utils/db_validation_helper.py
|
|
69
70
|
utils/environment_validator.py
|
|
70
71
|
utils/file_reader.py
|
|
72
|
+
utils/graphql_client.py
|
|
71
73
|
utils/logger.py
|
|
72
74
|
utils/observability.py
|
|
73
75
|
utils/response_validator.py
|
|
74
76
|
utils/screenshot_helper.py
|
|
77
|
+
utils/soap_client.py
|
|
75
78
|
utils/tdm.py
|
|
79
|
+
utils/transformation_validator.py
|
|
80
|
+
utils/ui_db_validator.py
|
|
76
81
|
utils/yaml_config_reader.py
|
|
77
82
|
utils/db_drivers/__init__.py
|
|
78
83
|
utils/db_drivers/db2.py
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
playwright==1.54.0
|
|
2
|
+
pytest==9.1.1
|
|
3
|
+
pytest-cov==7.1.0
|
|
4
|
+
pytest-xdist==3.8.0
|
|
5
|
+
pytest-rerunfailures==16.4
|
|
6
|
+
pytest-html==4.2.0
|
|
7
|
+
allure-pytest==2.16.0
|
|
8
|
+
PyYAML==6.0.2
|
|
9
|
+
python-dotenv>=1.0.0
|
|
10
|
+
httpx>=0.27.0
|
|
11
|
+
jmespath>=1.0.0
|
|
12
|
+
xlrd>=2.0.1
|
|
13
|
+
zeep>=4.2.1
|
|
14
|
+
gql[httpx]>=3.5.0
|