Kea2-python 0.3.6__py3-none-any.whl → 1.0.1__py3-none-any.whl
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.
Potentially problematic release.
This version of Kea2-python might be problematic. Click here for more details.
- kea2/__init__.py +1 -1
- kea2/assets/config_version.json +16 -0
- kea2/assets/fastbot_configs/teardown.py +18 -0
- kea2/assets/monkeyq.jar +0 -0
- kea2/assets/quicktest.py +21 -2
- kea2/bug_report_generator.py +116 -34
- kea2/cli.py +19 -9
- kea2/fastbotManager.py +20 -4
- kea2/keaUtils.py +360 -111
- kea2/kea_launcher.py +61 -23
- kea2/mixin.py +22 -0
- kea2/report_merger.py +107 -42
- kea2/resultSyncer.py +1 -1
- kea2/templates/bug_report_template.html +187 -19
- kea2/templates/merged_bug_report_template.html +3293 -3213
- kea2/u2Driver.py +18 -8
- kea2/utils.py +60 -14
- kea2/version_manager.py +101 -0
- {kea2_python-0.3.6.dist-info → kea2_python-1.0.1.dist-info}/METADATA +63 -15
- {kea2_python-0.3.6.dist-info → kea2_python-1.0.1.dist-info}/RECORD +24 -20
- {kea2_python-0.3.6.dist-info → kea2_python-1.0.1.dist-info}/WHEEL +0 -0
- {kea2_python-0.3.6.dist-info → kea2_python-1.0.1.dist-info}/entry_points.txt +0 -0
- {kea2_python-0.3.6.dist-info → kea2_python-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {kea2_python-0.3.6.dist-info → kea2_python-1.0.1.dist-info}/top_level.txt +0 -0
|
@@ -279,13 +279,77 @@
|
|
|
279
279
|
width: 8%;
|
|
280
280
|
min-width: 70px;
|
|
281
281
|
}
|
|
282
|
-
|
|
282
|
+
|
|
283
283
|
.table-custom th:nth-child(7), .table-custom td:nth-child(7) { /* Error Details */
|
|
284
284
|
width: 45%;
|
|
285
285
|
min-width: 400px;
|
|
286
286
|
text-align: center;
|
|
287
287
|
position: relative;
|
|
288
288
|
}
|
|
289
|
+
|
|
290
|
+
/* Property Checking Statistics specific adjustments */
|
|
291
|
+
.table-property-stats th,
|
|
292
|
+
.table-property-stats td {
|
|
293
|
+
padding: 20px 14px;
|
|
294
|
+
line-height: 1.65;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.table-property-stats th:nth-child(1),
|
|
298
|
+
.table-property-stats td:nth-child(1) {
|
|
299
|
+
width: 6%;
|
|
300
|
+
min-width: 60px;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.table-property-stats th:nth-child(2),
|
|
304
|
+
.table-property-stats td:nth-child(2) {
|
|
305
|
+
width: 22%;
|
|
306
|
+
min-width: 200px;
|
|
307
|
+
text-align: left;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.table-property-stats th:nth-child(3),
|
|
311
|
+
.table-property-stats td:nth-child(3) {
|
|
312
|
+
width: 10%;
|
|
313
|
+
min-width: 90px;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.table-property-stats th:nth-child(4),
|
|
317
|
+
.table-property-stats td:nth-child(4) {
|
|
318
|
+
width: 9%;
|
|
319
|
+
min-width: 80px;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.table-property-stats th:nth-child(5),
|
|
323
|
+
.table-property-stats td:nth-child(5) {
|
|
324
|
+
width: 9%;
|
|
325
|
+
min-width: 80px;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.table-property-stats th:nth-child(6),
|
|
329
|
+
.table-property-stats td:nth-child(6) {
|
|
330
|
+
width: 9%;
|
|
331
|
+
min-width: 80px;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.table-property-stats th:nth-child(7),
|
|
335
|
+
.table-property-stats td:nth-child(7) {
|
|
336
|
+
width: 9%;
|
|
337
|
+
min-width: 80px;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.table-property-stats th:nth-child(8),
|
|
341
|
+
.table-property-stats td:nth-child(8) {
|
|
342
|
+
width: 26%;
|
|
343
|
+
min-width: 260px;
|
|
344
|
+
text-align: left;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.table-property-stats td:nth-child(8) {
|
|
348
|
+
display: flex;
|
|
349
|
+
justify-content: flex-start;
|
|
350
|
+
align-items: center;
|
|
351
|
+
gap: 0.75rem;
|
|
352
|
+
}
|
|
289
353
|
|
|
290
354
|
.table-custom tbody tr:nth-of-type(odd) {
|
|
291
355
|
background-color: rgba(0, 0, 0, 0.02);
|
|
@@ -1222,6 +1286,24 @@
|
|
|
1222
1286
|
<span class="stat-label">Executed Properties</span>
|
|
1223
1287
|
</div>
|
|
1224
1288
|
</div>
|
|
1289
|
+
{% if triggered_crash_count %}
|
|
1290
|
+
<div class="col-md-2 col-sm-6">
|
|
1291
|
+
<div class="text-center">
|
|
1292
|
+
<i class="bi bi-exclamation-octagon text-danger" style="font-size: 2rem;"></i>
|
|
1293
|
+
<span class="stat-value value-danger">{{ triggered_crash_count }}</span>
|
|
1294
|
+
<span class="stat-label">Triggered Crash</span>
|
|
1295
|
+
</div>
|
|
1296
|
+
</div>
|
|
1297
|
+
{% endif %}
|
|
1298
|
+
{% if triggered_anr_count %}
|
|
1299
|
+
<div class="col-md-2 col-sm-6">
|
|
1300
|
+
<div class="text-center">
|
|
1301
|
+
<i class="bi bi-hourglass-split text-warning" style="font-size: 2rem;"></i>
|
|
1302
|
+
<span class="stat-value value-warning">{{ triggered_anr_count }}</span>
|
|
1303
|
+
<span class="stat-label">Triggered ANR</span>
|
|
1304
|
+
</div>
|
|
1305
|
+
</div>
|
|
1306
|
+
{% endif %}
|
|
1225
1307
|
</div>
|
|
1226
1308
|
</div>
|
|
1227
1309
|
</div>
|
|
@@ -1340,6 +1422,7 @@
|
|
|
1340
1422
|
|
|
1341
1423
|
<!-- Screenshots Section -->
|
|
1342
1424
|
{% if take_screenshots %}
|
|
1425
|
+
{% if screenshots %}
|
|
1343
1426
|
<div class="section-block">
|
|
1344
1427
|
<h2 class="section-title">Test Screenshots</h2>
|
|
1345
1428
|
<div class="card">
|
|
@@ -1357,6 +1440,14 @@
|
|
|
1357
1440
|
</div>
|
|
1358
1441
|
</div>
|
|
1359
1442
|
</div>
|
|
1443
|
+
{% else %}
|
|
1444
|
+
<div class="section-block">
|
|
1445
|
+
<h2 class="section-title">Test Screenshots</h2>
|
|
1446
|
+
<div class="alert alert-info text-center">
|
|
1447
|
+
<i class="bi bi-info-circle"></i> No screenshots captured in this test session.
|
|
1448
|
+
</div>
|
|
1449
|
+
</div>
|
|
1450
|
+
{% endif %}
|
|
1360
1451
|
{% endif %}
|
|
1361
1452
|
|
|
1362
1453
|
<!-- Crash Analysis Section -->
|
|
@@ -1398,6 +1489,9 @@
|
|
|
1398
1489
|
<th>Time</th>
|
|
1399
1490
|
<th>Exception</th>
|
|
1400
1491
|
<th>Process</th>
|
|
1492
|
+
{% if take_screenshots %}
|
|
1493
|
+
<th>Interaction Scenario Pages</th>
|
|
1494
|
+
{% endif %}
|
|
1401
1495
|
<th>Details</th>
|
|
1402
1496
|
</tr>
|
|
1403
1497
|
</thead>
|
|
@@ -1408,20 +1502,31 @@
|
|
|
1408
1502
|
<td>{{ crash.time }}</td>
|
|
1409
1503
|
<td>{{ crash.exception_type }}</td>
|
|
1410
1504
|
<td>{{ crash.process }}</td>
|
|
1505
|
+
{% if take_screenshots %}
|
|
1506
|
+
<td>
|
|
1507
|
+
{% if crash.screenshot_id %}
|
|
1508
|
+
<a href="#{{ crash.screenshot_id }}" class="link-button" onclick="scrollToScreenshot('{{ crash.screenshot_id }}')">
|
|
1509
|
+
<i class="bi bi-camera"></i> Screenshot {{ crash.screenshot_id }}
|
|
1510
|
+
</a>
|
|
1511
|
+
{% else %}
|
|
1512
|
+
<span class="text-muted">No screenshot</span>
|
|
1513
|
+
{% endif %}
|
|
1514
|
+
</td>
|
|
1515
|
+
{% endif %}
|
|
1411
1516
|
<td>
|
|
1412
|
-
<button class="btn btn-sm btn-outline-primary" type="button"
|
|
1413
|
-
data-bs-toggle="collapse" data-bs-target="#crash-detail-{{ loop.index }}"
|
|
1517
|
+
<button class="btn btn-sm btn-outline-primary" type="button"
|
|
1518
|
+
data-bs-toggle="collapse" data-bs-target="#crash-detail-{{ loop.index }}"
|
|
1414
1519
|
aria-expanded="false" aria-controls="crash-detail-{{ loop.index }}">
|
|
1415
1520
|
<i class="bi bi-eye"></i> Details
|
|
1416
1521
|
</button>
|
|
1417
|
-
<button class="btn btn-sm btn-outline-secondary copy-stack-btn"
|
|
1522
|
+
<button class="btn btn-sm btn-outline-secondary copy-stack-btn"
|
|
1418
1523
|
data-stack-index="{{ loop.index }}">
|
|
1419
1524
|
<i class="bi bi-clipboard"></i> Copy
|
|
1420
1525
|
</button>
|
|
1421
1526
|
</td>
|
|
1422
1527
|
</tr>
|
|
1423
1528
|
<tr class="collapse" id="crash-detail-{{ loop.index }}">
|
|
1424
|
-
<td colspan="5">
|
|
1529
|
+
<td colspan="{% if take_screenshots %}6{% else %}5{% endif %}">
|
|
1425
1530
|
<div class="bg-light p-3 rounded">
|
|
1426
1531
|
<h6 class="text-danger">Stack Trace:</h6>
|
|
1427
1532
|
<pre class="text-danger mb-0 text-start" id="stack-trace-{{ loop.index }}" style="font-size: 0.9em; white-space: pre-wrap; text-align: left;">{{ crash.stack_trace }}</pre>
|
|
@@ -1436,20 +1541,31 @@
|
|
|
1436
1541
|
<td>{{ anr.time }}</td>
|
|
1437
1542
|
<td>{{ anr.reason }}</td>
|
|
1438
1543
|
<td>{{ anr.process }}</td>
|
|
1544
|
+
{% if take_screenshots %}
|
|
1439
1545
|
<td>
|
|
1440
|
-
|
|
1441
|
-
|
|
1546
|
+
{% if anr.screenshot_id %}
|
|
1547
|
+
<a href="#{{ anr.screenshot_id }}" class="link-button" onclick="scrollToScreenshot('{{ anr.screenshot_id }}')">
|
|
1548
|
+
<i class="bi bi-camera"></i> Screenshot {{ anr.screenshot_id }}
|
|
1549
|
+
</a>
|
|
1550
|
+
{% else %}
|
|
1551
|
+
<span class="text-muted">No screenshot</span>
|
|
1552
|
+
{% endif %}
|
|
1553
|
+
</td>
|
|
1554
|
+
{% endif %}
|
|
1555
|
+
<td>
|
|
1556
|
+
<button class="btn btn-sm btn-outline-primary" type="button"
|
|
1557
|
+
data-bs-toggle="collapse" data-bs-target="#anr-detail-{{ loop.index }}"
|
|
1442
1558
|
aria-expanded="false" aria-controls="anr-detail-{{ loop.index }}">
|
|
1443
1559
|
<i class="bi bi-eye"></i> Details
|
|
1444
1560
|
</button>
|
|
1445
|
-
<button class="btn btn-sm btn-outline-secondary copy-stack-btn"
|
|
1561
|
+
<button class="btn btn-sm btn-outline-secondary copy-stack-btn"
|
|
1446
1562
|
data-stack-index="anr-{{ loop.index }}">
|
|
1447
1563
|
<i class="bi bi-clipboard"></i> Copy
|
|
1448
1564
|
</button>
|
|
1449
1565
|
</td>
|
|
1450
1566
|
</tr>
|
|
1451
1567
|
<tr class="collapse" id="anr-detail-{{ loop.index }}">
|
|
1452
|
-
<td colspan="5">
|
|
1568
|
+
<td colspan="{% if take_screenshots %}6{% else %}5{% endif %}">
|
|
1453
1569
|
<div class="bg-light p-3 rounded">
|
|
1454
1570
|
<h6 class="text-dark">ANR Details:</h6>
|
|
1455
1571
|
<pre class="text-dark mb-0 text-start" id="stack-trace-anr-{{ loop.index }}" style="font-size: 0.9em; white-space: pre-wrap; text-align: left;">{{ anr.trace }}</pre>
|
|
@@ -1512,7 +1628,12 @@
|
|
|
1512
1628
|
<tr class="property-violation-row" data-page="1">
|
|
1513
1629
|
<td>{{ violation.index }}</td>
|
|
1514
1630
|
<td><span class="badge bg-light text-dark badge-custom">{{ violation.property_name }}</span></td>
|
|
1515
|
-
<td
|
|
1631
|
+
<td>
|
|
1632
|
+
<a href="#{{ violation.interaction_pages|last }}" class="link-button"
|
|
1633
|
+
onclick="scrollToScreenshot('{{ violation.interaction_pages|last }}')">
|
|
1634
|
+
{{ violation.interaction_pages[0] }} ~ {{ violation.interaction_pages[1] }}
|
|
1635
|
+
</a>
|
|
1636
|
+
</td>
|
|
1516
1637
|
</tr>
|
|
1517
1638
|
{% endfor %}
|
|
1518
1639
|
</tbody>
|
|
@@ -1576,13 +1697,14 @@
|
|
|
1576
1697
|
</div>
|
|
1577
1698
|
|
|
1578
1699
|
<div class="table-responsive">
|
|
1579
|
-
<table class="table table-custom">
|
|
1700
|
+
<table class="table table-custom table-property-stats">
|
|
1580
1701
|
<thead>
|
|
1581
1702
|
<tr>
|
|
1582
1703
|
<th>Index</th>
|
|
1583
1704
|
<th>Property Name <span class="badge bg-primary ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_properties }}</span></th>
|
|
1584
1705
|
<th>Precondition Satisfied <span class="badge bg-success ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_precond_satisfied }}</span></th>
|
|
1585
1706
|
<th>Executed <span class="badge bg-info ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_executed }}</span></th>
|
|
1707
|
+
<th>Passes <span class="badge bg-secondary ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_passes }}</span></th>
|
|
1586
1708
|
<th>Fails <span class="badge bg-danger ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_fails }}</span> <i class="bi bi-arrow-down-up text-muted sort-icon" id="fails-sort" data-column="fails" data-order="none" style="cursor: pointer;"></i></th>
|
|
1587
1709
|
<th>Errors <span class="badge bg-warning ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_errors }}</span> <i class="bi bi-arrow-down-up text-muted sort-icon" id="errors-sort" data-column="errors" data-order="none" style="cursor: pointer;"></i></th>
|
|
1588
1710
|
<th>Error Details</th>
|
|
@@ -1595,12 +1717,14 @@
|
|
|
1595
1717
|
data-property-name="{{ property_name }}"
|
|
1596
1718
|
data-precond-satisfied="{{ test_result.precond_satisfied|default(0) }}"
|
|
1597
1719
|
data-executed="{{ test_result.executed|default(0) }}"
|
|
1720
|
+
data-pass="{{ test_result.pass_count|default(0) }}"
|
|
1598
1721
|
data-fails="{{ test_result.fail|default(0) }}"
|
|
1599
1722
|
data-errors="{{ test_result.error|default(0) }}">
|
|
1600
1723
|
<td>{{ loop.index }}</td>
|
|
1601
1724
|
<td><span class="badge bg-light text-dark badge-custom">{{ property_name }}</span></td>
|
|
1602
1725
|
<td>{{ test_result.precond_satisfied|default(0) }}</td>
|
|
1603
1726
|
<td>{{ test_result.executed|default(0) }}</td>
|
|
1727
|
+
<td>{{ test_result.pass_count|default(0) }}</td>
|
|
1604
1728
|
<td><span class="badge bg-danger text-white">{{ test_result.fail|default(0) }}</span></td>
|
|
1605
1729
|
<td><span class="badge bg-warning text-dark">{{ test_result.error|default(0) }}</span></td>
|
|
1606
1730
|
<td>
|
|
@@ -1632,8 +1756,8 @@
|
|
|
1632
1756
|
{% set property_index = loop.index %}
|
|
1633
1757
|
{% if error_list|length == 1 %}
|
|
1634
1758
|
<!-- Single error detail row -->
|
|
1635
|
-
<tr class="collapse" id="single-error-detail-{{ property_index }}">
|
|
1636
|
-
<td colspan="
|
|
1759
|
+
<tr class="collapse property-detail-row" data-detail-for="{{ property_name }}" id="single-error-detail-{{ property_index }}">
|
|
1760
|
+
<td colspan="8">
|
|
1637
1761
|
<div class="bg-light p-3 rounded">
|
|
1638
1762
|
<div class="mb-2">
|
|
1639
1763
|
<span class="badge bg-{{ 'danger' if error_list[0].state == 'fail' else 'warning' }}">
|
|
@@ -1664,8 +1788,8 @@
|
|
|
1664
1788
|
</tr>
|
|
1665
1789
|
{% else %}
|
|
1666
1790
|
<!-- Multiple errors detail row -->
|
|
1667
|
-
<tr class="collapse" id="multi-error-detail-{{ property_index }}">
|
|
1668
|
-
<td colspan="
|
|
1791
|
+
<tr class="collapse property-detail-row" data-detail-for="{{ property_name }}" id="multi-error-detail-{{ property_index }}">
|
|
1792
|
+
<td colspan="8">
|
|
1669
1793
|
<div class="bg-light p-3 rounded">
|
|
1670
1794
|
<!-- Error summary -->
|
|
1671
1795
|
<div class="mb-3">
|
|
@@ -2218,6 +2342,18 @@
|
|
|
2218
2342
|
function sortTable(column, order) {
|
|
2219
2343
|
const container = document.getElementById('property-stats-container');
|
|
2220
2344
|
const rows = Array.from(container.getElementsByClassName('property-stat-row'));
|
|
2345
|
+
const detailRowMap = new Map();
|
|
2346
|
+
|
|
2347
|
+
// Capture current detail rows so they can move with their parent property row
|
|
2348
|
+
const detailRows = Array.from(container.querySelectorAll('.property-detail-row'));
|
|
2349
|
+
detailRows.forEach(function(detailRow) {
|
|
2350
|
+
const key = detailRow.dataset.detailFor;
|
|
2351
|
+
if (!key) return;
|
|
2352
|
+
if (!detailRowMap.has(key)) {
|
|
2353
|
+
detailRowMap.set(key, []);
|
|
2354
|
+
}
|
|
2355
|
+
detailRowMap.get(key).push(detailRow);
|
|
2356
|
+
});
|
|
2221
2357
|
|
|
2222
2358
|
rows.sort(function(a, b) {
|
|
2223
2359
|
let valueA, valueB;
|
|
@@ -2237,11 +2373,18 @@
|
|
|
2237
2373
|
}
|
|
2238
2374
|
});
|
|
2239
2375
|
|
|
2240
|
-
|
|
2241
|
-
container.innerHTML = '';
|
|
2376
|
+
const fragment = document.createDocumentFragment();
|
|
2242
2377
|
rows.forEach(function(row) {
|
|
2243
|
-
|
|
2378
|
+
fragment.appendChild(row);
|
|
2379
|
+
const detailKey = row.dataset.propertyName;
|
|
2380
|
+
const relatedDetailRows = detailRowMap.get(detailKey) || [];
|
|
2381
|
+
relatedDetailRows.forEach(function(detailRow) {
|
|
2382
|
+
fragment.appendChild(detailRow);
|
|
2383
|
+
});
|
|
2244
2384
|
});
|
|
2385
|
+
|
|
2386
|
+
container.innerHTML = '';
|
|
2387
|
+
container.appendChild(fragment);
|
|
2245
2388
|
|
|
2246
2389
|
// Re-initialize pagination after sorting
|
|
2247
2390
|
initPagination('property-stats-container', 'property-stat-row', 'stats-pagination', 'stats-page-size');
|
|
@@ -3502,6 +3645,31 @@
|
|
|
3502
3645
|
}
|
|
3503
3646
|
return 1;
|
|
3504
3647
|
}
|
|
3648
|
+
|
|
3649
|
+
// Function to scroll to screenshot by ID
|
|
3650
|
+
function scrollToScreenshot(screenshotId) {
|
|
3651
|
+
const screenshotElement = document.getElementById(screenshotId);
|
|
3652
|
+
if (screenshotElement) {
|
|
3653
|
+
// Scroll to the screenshot with smooth behavior
|
|
3654
|
+
screenshotElement.scrollIntoView({
|
|
3655
|
+
behavior: 'smooth',
|
|
3656
|
+
block: 'center'
|
|
3657
|
+
});
|
|
3658
|
+
|
|
3659
|
+
// Add a highlight effect
|
|
3660
|
+
screenshotElement.style.border = '3px solid #007bff';
|
|
3661
|
+
screenshotElement.style.borderRadius = '8px';
|
|
3662
|
+
screenshotElement.style.transition = 'border 0.3s ease';
|
|
3663
|
+
|
|
3664
|
+
// Remove highlight after 3 seconds
|
|
3665
|
+
setTimeout(() => {
|
|
3666
|
+
screenshotElement.style.border = '';
|
|
3667
|
+
screenshotElement.style.borderRadius = '';
|
|
3668
|
+
}, 3000);
|
|
3669
|
+
} else {
|
|
3670
|
+
console.warn('Screenshot with ID', screenshotId, 'not found');
|
|
3671
|
+
}
|
|
3672
|
+
}
|
|
3505
3673
|
</script>
|
|
3506
3674
|
</body>
|
|
3507
|
-
</html>
|
|
3675
|
+
</html>
|