Browse Source

testcase queries

aguryev 3 years ago
parent
commit
b6e7936ac2
4 changed files with 151 additions and 33 deletions
  1. 31 4
      baangt/base/DataBaseORM.py
  2. 16 0
      baangt/base/ResultsBrowser.py
  3. 54 26
      baangt/reports/templates/dashboard.html
  4. 50 3
      test_browser.py

+ 31 - 4
baangt/base/DataBaseORM.py

@@ -3,11 +3,10 @@ from sqlalchemy import Column, String, Integer, DateTime, Boolean, Table, Foreig
 from sqlalchemy.orm import relationship
 from sqlalchemy import create_engine
 from sqlalchemy.ext.declarative import declarative_base
-import os
-import re
-import uuid
+import os, re, uuid
+from datetime import timedelta
 from baangt.base.PathManagement import ManagedPaths
-from baangt.base.GlobalConstants import EXECUTION_STAGE
+from baangt.base.GlobalConstants import EXECUTION_STAGE, TIMING_DURATION, TESTCASESTATUS
 
 
 managedPaths = ManagedPaths()
@@ -149,6 +148,34 @@ class TestCaseLog(base):
 	fields = relationship('TestCaseField')
 	networkInfo = relationship('TestCaseNetworkInfo')
 
+	@property
+	def status(self):
+		#
+		# testcase status
+		#
+
+		for field in self.fields:
+			if field.name == TESTCASESTATUS:
+				return field.value
+
+		return None	
+
+	@property
+	def duration(self):
+		#
+		# duration as timedelta
+		#
+
+		for field in self.fields:
+			if field.name == TIMING_DURATION:
+				# parse value from H:M:S.microseconds
+				m = re.search(r'(?P<hours>\d+):(?P<minutes>\d+):(?P<seconds>\d[\.\d+]*)', field.value)
+				if m:
+					duration = {key: float(value) for key, value in m.groupdict().items()}
+					return timedelta(**duration)
+
+		return None
+
 	def __str__(self):
 		return str(uuid.UUID(bytes=self.id))
 

+ 16 - 0
baangt/base/ResultsBrowser.py

@@ -86,5 +86,21 @@ class ResultsBrowser:
 
 		return records
 
+	def getTestCases(self, name, stage, start_date=None, end_date=None):
+		#
+		# retuns data on the specified testrun stages
+		#
+
+		# get records
+		records = self.getResults(name, stage, start_date, end_date)
+
+		print(f'Records read: {len(records)}')
+		for r in records:
+			for tc in r.testcase_sequences[0].testcases:
+				print(f'{tc.duration}:\t{tc.status}\t{tc}')
+
+		#return [{'duration': tc.duration, 'status': tc.status for tc in r.testcase_sequences[0].testcases} for r in records]
+		
+
 
 

+ 54 - 26
baangt/reports/templates/dashboard.html

@@ -16,7 +16,7 @@
     {% if data.names %}
     <div class="row mx-2 pt-3 rounded shadow">
         <div class="col-md-1 h4">Filters:</div>
-        <div class="col-md-3 mb-3 input-group">
+        <div class="col-lg-3 mb-3 input-group">
             <div class="input-group-prepend">
                 <label class="input-group-text px-4" for="selectName">Name</label>
             </div>
@@ -27,7 +27,7 @@
                 {% endfor %}
             </select>
         </div>
-        <div class="col-md-3 mb-3 input-group">
+        <div class="col-lg-3 mb-3 input-group">
             <div class="input-group-prepend">
                 <label class="input-group-text px-4" for="selectStage">Stage</label>
             </div>
@@ -43,53 +43,53 @@
 
     <!-- header -->
     <div class="row mx-2 mb-2 mt-3">
-        <div class="col-md-3 h3">Testrun</div>
-        <div class="col-md-3 h3">Summary</div>
-        <div class="col-md-3 h3">Results</div>
-        <div class="col-md-3 h3">Duration</div>
+        <div class="col-lg-3 h3">Testrun</div>
+        <div class="col-lg-3 h3">Summary</div>
+        <div class="col-lg-3 h3">Results</div>
+        <div class="col-lg-3 h3">Duration</div>
     </div>
 
     <!-- testrun list -->
     {% for item in data.records %}
         <div class="row hovered-item border-top py-3 mx-2" id="{{ item.id }}" data-name="{{ item.name }}" data-stage="{{ item.stage }}">
-            <div class="col-md-3 text-break">
+            <div class="col-lg-3 text-break">
                 <p class="text-primary">{{ item.name }}</p>
                 <p class="text-secondary">{{ item.stage }}</p> 
             </div>
-            <div class="col-md-3">
-                <div class="row">
-                    <div class="d-flex col-3">
+            <div class="col-lg-3">
+                <div class="row my-auto">
+                    <div class="col-4 p-0">
                         <canvas class="statusChart" width="100" height="100"></canvas>
                     </div>
-                    <div class="d-flex flex-column col-2 border-right px-0">
-                        <h2 class="text-center">{{ item.figures.records }}</h2>
-                        <h6 class="text-center">TESTS</h6>
+                    <div class="col-2 border-right px-0 figure my-auto">
+                        <div class="test-digit">{{ item.figures.records }}</div>
+                        <div class="test-status">TESTS</div>
                     </div>
                     {% if item.figures.successful > 0  %}
-                        <div class="d-flex flex-column col-2 text-success px-0">
-                            <h2 class="text-center">{{ item.figures.successful }}</h2>
-                            <h6 class="text-center">PASSED</h6>
+                        <div class="col-2 text-success px-0 figure">
+                            <div class="test-digit">{{ item.figures.successful }}</div>
+                            <div class="test-status">PASSED</div>
                         </div>
                     {% endif %}
                     {% if item.figures.error > 0  %}
-                        <div class="d-flex flex-column col-2 text-danger px-0">
-                            <h2 class="text-center">{{ item.figures.error }}</h2>
-                            <h6 class="text-center">FAILED</h6>
+                        <div class="col-2 text-danger px-0 figure">
+                            <div class="test-digit">{{ item.figures.error }}</div>
+                            <div class="test-status">FAILED</div>
                         </div>
                     {% endif %}
                     {% if item.figures.paused > 0  %}
-                        <div class="d-flex flex-column col-2 text-secondary px-0">
-                            <h2 class="text-center">{{ item.figures.paused }}</h2>
-                            <h6 class="text-center">PAUSED</h6>
+                        <div class="col-2 text-secondary px-0 figure">
+                            <div class="test-digit">{{ item.figures.paused }}</div>
+                            <div class="test-status">PAUSED</div>
                         </div>
                     {% endif %}
                 </div>
             </div>
-            <div class="col-md-3">
-                <canvas class="resultsChart" height="60"></canvas>
+            <div class="col-lg-3 p-0 pl-2">
+                <canvas class="resultsChart timeChart" height="100"></canvas>
             </div>
-            <div class="col-md-3 text-break">
-                <canvas class="durationChart" height="60"></canvas>
+            <div class="col-lg-3 p-0 pl-2">
+                <canvas class="durationChart timeChart" height="100"></canvas>
             </div>
         </div>
 
@@ -98,6 +98,34 @@
 </div>
 </main>
 
+<style>
+    .figure {
+      min-width: 4rem;
+      margin-bottom: auto;
+      margin-top: auto;
+      padding: 0;
+    }
+
+    .statusChart {
+        min-width: 6rem;
+        min-height: 6rem;
+    }
+
+    .timeChart {
+        min-height: 6rem;
+    } 
+
+    .test-digit {
+        font-size: 2.7rem;
+        text-align: center !important;
+    }
+
+    .test-state {
+        font-size: 1rem;
+        text-align: center !important;
+    }
+</style>
+
 <script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>
 <script type="text/javascript">
 

+ 50 - 3
test_browser.py

@@ -1,11 +1,14 @@
 from baangt.base.ResultsBrowser import ResultsBrowser
 from datetime import datetime
+import json
 
 #DATABASE_URL = 'sqlite:///testrun_my.db'
 
 # filter parameters
 name = 'heartbeat.json'
+#name = 'RSantragAll.json'
 stage = 'HF'
+#stage = 'PQA'
 start_time = datetime.strptime("2020-06-10 00:00", "%Y-%m-%d %H:%M")
 end_time = datetime.strptime("2020-06-11 00:00", "%Y-%m-%d %H:%M")
 
@@ -17,6 +20,7 @@ def print_logs(logs):
 
 #r = ResultsBrowser(db_url=DATABASE_URL)
 r = ResultsBrowser()
+#r.getTestCases(name=name, stage=stage)
 
 print('\n***** Get All Records')
 logs = r.getResults()
@@ -37,7 +41,50 @@ print_logs(logs)
 print('\n***** Filter By Name and Date')
 logs = r.getResults(name=name, start_date=start_time, end_date=end_time)
 print_logs(logs)
-
-id = 'eff78fa9-83b7-484a-a8ab-5e30cf0f12cf'
+'''
+id = 'eff78fa9-83b7-484a-a8ab-5e30cf0f12cc'
 print(f'\n****** GET BY ID: {id}')
-print_logs([r.get(id)])
+print_logs([r.get(id)])
+'''
+
+def draw_seconds(t):
+	if t is None:
+		return '\033[35mnan\033[0m'
+
+	n = t.seconds
+	if n < 20:
+		return f'\033[45m{n:3}\033[0m'
+	elif n < 50:
+		return f'\033[44m{n:3}\033[0m'
+	elif n < 100:
+		return f'\033[42m{n:3}\033[0m'
+	elif n < 150:
+		return f'\033[43m{n:3}\033[0m'
+	else:
+		return f'\033[41m{n:3}\033[0m'
+
+print(f'\n****** TestCase details for {name}')
+status = {
+	"OK": '\033[92mK\033[0m',
+	"Failed": '\033[91mF\033[0m',
+	"Paused": '\033[90mP\033[0m',
+}
+logs = r.getResults(name=name, stage=stage)
+
+print(f'\n{"Date":^20}\tTest Case Status')
+for log in logs:
+	print(log.startTime, end='\t')
+	for tc in log.testcase_sequences[0].testcases:
+		print(status[tc.status], end=' ')
+	print()
+
+print(f'\n{"Date":^20}\tTest Case Duration (s)')
+for log in logs:
+	print(log.startTime, end='\t')
+	for tc in log.testcase_sequences[0].testcases:
+		print(draw_seconds(tc.duration), end=' ')
+	print()
+
+
+
+