Browse Source

ResultsBrowser: updated export & bugs fixed

aguryev 3 years ago
parent
commit
c993aae1f2

+ 4 - 2
baangt/base/DataBaseORM.py

@@ -1,5 +1,4 @@
 from sqlalchemy import Column, String, Integer, DateTime, Boolean, Table, ForeignKey
-#from sqlalchemy.types import Binary(16), TypeDecorator
 from sqlalchemy.orm import relationship
 from sqlalchemy import create_engine
 from sqlalchemy.ext.declarative import declarative_base
@@ -47,7 +46,7 @@ class TestrunLog(base):
 	statusOk = Column(Integer, nullable=False)
 	statusFailed = Column(Integer, nullable=False)
 	statusPaused = Column(Integer, nullable=False)
-	RLPJson = Column(String, nullable=True)
+	RLPJson = Column(String, nullable=True) # ------------------------> New feature: comment for old DB
 	# relationships
 	globalVars = relationship('GlobalAttribute')
 	testcase_sequences = relationship('TestCaseSequenceLog')
@@ -195,6 +194,9 @@ class TestCaseLog(base):
 	def __str__(self):
 		return str(uuid.UUID(bytes=self.id))
 
+	def fields_as_dict(self):
+		return {pr.name: pr.value for pr in self.fields}
+
 	def to_json(self):
 		return {
 			'id': str(self),

+ 54 - 13
baangt/base/ResultsBrowser.py

@@ -1,6 +1,6 @@
 from sqlalchemy import create_engine, desc, and_
 from sqlalchemy.orm import sessionmaker
-from baangt.base.DataBaseORM import DATABASE_URL, engine, TestrunLog, GlobalAttribute, TestCaseLog, TestCaseSequenceLog, TestCaseField
+from baangt.base.DataBaseORM import DATABASE_URL, TestrunLog, GlobalAttribute, TestCaseLog, TestCaseSequenceLog, TestCaseField
 from baangt.base.ExportResults.ExportResults import ExcelSheetHelperFunctions
 from baangt.base.PathManagement import ManagedPaths
 import baangt.base.GlobalConstants as GC
@@ -9,6 +9,7 @@ from datetime import datetime
 from xlsxwriter import Workbook
 import logging
 import os
+import json
 
 logger = logging.getLogger("pyC")
 
@@ -61,7 +62,9 @@ class ResultsBrowser:
 
     def size(self, testcase_sequence=None):
         #
-        # the maximum number of testcase sequences
+        # returns the max number of 
+        # testcase_sequence is None: testcase sequences within the testruns in query_set
+        # testcase_sequence is a number: testcases within specified testcase sequence of all testruns in db
         #
 
         # test case sequences
@@ -69,7 +72,9 @@ class ResultsBrowser:
             return max([len(tr.testcase_sequences) for tr in self.query_set])
 
         # test cases
-        return max([len(tr.testcase_sequences[testcase_sequence].testcases) for tr in self.query_set])
+        return max(
+            [len(tr.testcase_sequences[testcase_sequence].testcases) for tr in self.query_set if len(tr.testcase_sequences)>testcase_sequence],
+        )
 
 
     def name_list(self):
@@ -190,7 +195,8 @@ class ResultsBrowser:
         # set labels
         labelTetsrun = 'TestRun'
         labelTestCaseSequence = 'Test Case Sequence'
-        labelTestCase = 'Test Case'
+        labelTestCase = 'Test Cases'
+        labelStage = 'Stage'
         labelAvgDuration = 'Avg. Duration'
 
         # initialize workbook
@@ -200,10 +206,10 @@ class ResultsBrowser:
         # define cell formats
         # green background
         cellFormatGreen = workbook.add_format({'bg_color': 'green'})
-        #cellFormatGreen.set_bg_color('green')
         # red background
         cellFormatRed = workbook.add_format({'bg_color': 'red'})
-        #cellFormatRed.set_bg_color('red')
+        # yellow background
+        cellFormatYellow = workbook.add_format({'bg_color': 'yellow'})
         # bold font
         cellFormatBold = workbook.add_format({'bold': True})
         # bold and italic font
@@ -212,7 +218,6 @@ class ResultsBrowser:
         # summary tab
         sheet = workbook.add_worksheet('Summary')
         sheet.set_column(first_col=0, last_col=0, width=18)
-        #sheet.set_column(first_col=1, last_col=1, width=12)
         # title
         sheet.write(0, 0, f'{labelTetsrun}s Summary', cellFormatBold)
         # parameters
@@ -238,8 +243,8 @@ class ResultsBrowser:
         for tcs_index in range(self.size()):
             # testcase sequence
             line += 1
-            sheet.write(line, 0, labelTestCaseSequence)
-            sheet.write(line, 1, tcs_index)
+            sheet.write(line, 0, labelTestCaseSequence, cellFormatYellow)
+            sheet.write(line, 1, tcs_index, cellFormatYellow)
             line += 1
             sheet.write(line, 0, labelAvgDuration)
             sheet.write(line, 1, self.average_duration(testcase_sequence=tcs_index))
@@ -251,10 +256,11 @@ class ResultsBrowser:
             line += 1            
             for i in range(self.size(testcase_sequence=tcs_index)):
                 sheet.write(line, 1 + i, i)
-            id_col = i + 3
-            sheet.write(line - 1, id_col, f'{labelTetsrun} ID', cellFormatBoldItalic)
+            stage_col = i + 2
+            sheet.write(line-1, stage_col, labelStage, cellFormatBoldItalic)
+            sheet.write(line-1, stage_col, f'{labelTetsrun} ID', cellFormatBoldItalic)
             # status
-            for tr in self.query_set:
+            for tr in filter(lambda tr: len(tr.testcase_sequences)>tcs_index, self.query_set):
                 line += 1
                 sheet.write(line, 0, tr.startTime.strftime('%Y-%m-%d %H:%M:%S'))
                 col = 1
@@ -264,13 +270,18 @@ class ResultsBrowser:
                     col += 1
                 #sheet.write(line, col, tr.duration)
                 #sheet.write(line, col+1, tr.testcase_sequences[0].duration)
-                sheet.write(line, id_col, str(tr))
+                sheet.write(line, stage_col, tr.stage)
+                sheet.write(line, stage_col+1, str(tr))
 
             line += 1
             sheet.write(line, 0, labelAvgDuration, cellFormatBoldItalic)
             for tc_index in range(self.size(testcase_sequence=tcs_index)):
                 sheet.write(line, tc_index+1, self.average_duration(testcase_sequence=tcs_index, testcase=tc_index))
 
+            # empty line separator
+            line += 1
+
+        '''
         # test case tabs
         for stage in self.stages:
             sheet = workbook.add_worksheet(f'{stage}_JSON')
@@ -302,6 +313,36 @@ class ResultsBrowser:
             # autowidth
             for i in range(len(headers)):
                 ExcelSheetHelperFunctions.set_column_autowidth(sheet, i)
+        '''
+        # output tab
+        sheet = workbook.add_worksheet('Output')
+        # write headers
+        headers = [
+            'Testrun UUID',
+            'TestCase UUID',
+            'Stage',
+            'TestCase Status',
+            'Duration',
+            'JSON',
+        ]
+        for index, label in enumerate(headers):
+            sheet.write(0, index, label, cellFormatBold)
+        # write data
+        line = 1
+        for tr in self.query_set:
+            for tcs in tr.testcase_sequences:
+                for tc in tcs.testcases:
+                    sheet.write(line, 0, str(tr))
+                    sheet.write(line, 1, str(tc))
+                    sheet.write(line, 2, tr.stage)
+                    sheet.write(line, 3, tc.status)
+                    sheet.write(line, 4, tc.duration)
+                    sheet.write(line, 5, json.dumps(tc.fields_as_dict()))
+                    line += 1
+        # autowidth
+        for col in range(len(headers)-1):
+            ExcelSheetHelperFunctions.set_column_autowidth(sheet, col)
+
 
         workbook.close()
 

+ 24 - 8
baangt/ui/pyqt/uiDesign.py

@@ -549,11 +549,15 @@ class Ui_MainWindow(QtCore.QObject):
         self.queryInputLayout.addWidget(self.dateToInput)
 
         # query buttons
-        # make query
-        self.queryMakePushButton = QtWidgets.QPushButton(self.queryGroupBox)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
+        #sizePolicy.setHeightForWidth(self.queryMakePushButton.sizePolicy().hasHeightForWidth())
+        # make query
+        self.queryMakePushButton = QtWidgets.QPushButton(self.queryGroupBox)
+        #sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+        #sizePolicy.setHorizontalStretch(0)
+        #sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.queryMakePushButton.sizePolicy().hasHeightForWidth())
         self.queryMakePushButton.setSizePolicy(sizePolicy)
         self.queryMakePushButton.setMinimumSize(QtCore.QSize(120, 0))
@@ -562,20 +566,31 @@ class Ui_MainWindow(QtCore.QObject):
         self.queryButtonLayout.addWidget(self.queryMakePushButton)
         # export results
         self.queryExportPushButton = QtWidgets.QPushButton(self.queryGroupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
+        #sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+        #sizePolicy.setHorizontalStretch(0)
+        #sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.queryExportPushButton.sizePolicy().hasHeightForWidth())
         self.queryExportPushButton.setSizePolicy(sizePolicy)
         self.queryExportPushButton.setMinimumSize(QtCore.QSize(120, 0))
         self.queryExportPushButton.setStyleSheet("color: rgb(255, 255, 255); background-color: rgb(138, 226, 52);")
         self.queryExportPushButton.setObjectName("queryExportPushButton")
         self.queryButtonLayout.addWidget(self.queryExportPushButton)
+        # open recent export result file
+        self.openExportPushButton = QtWidgets.QPushButton(self.queryGroupBox)
+        #sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+        #sizePolicy.setHorizontalStretch(0)
+        #sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.openExportPushButton.sizePolicy().hasHeightForWidth())
+        self.openExportPushButton.setSizePolicy(sizePolicy)
+        self.openExportPushButton.setMinimumSize(QtCore.QSize(120, 0))
+        self.openExportPushButton.setStyleSheet("color: rgb(255, 255, 255); background-color: rgb(138, 226, 52);")
+        self.openExportPushButton.setObjectName("openExportPushButton")
+        self.queryButtonLayout.addWidget(self.openExportPushButton)
         # exit to main screen
         self.queryExitPushButton = QtWidgets.QPushButton(self.queryGroupBox)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
+        #sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
+        #sizePolicy.setHorizontalStretch(0)
+        #sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(self.queryExitPushButton.sizePolicy().hasHeightForWidth())
         self.queryExitPushButton.setSizePolicy(sizePolicy)
         self.queryExitPushButton.setMinimumSize(QtCore.QSize(120, 0))
@@ -960,6 +975,7 @@ class Ui_MainWindow(QtCore.QObject):
         self.dateToInputLabel.setText(_translate("MainWindow", "Date to"))
         self.queryMakePushButton.setText(_translate("MainWindow", "Query"))
         self.queryExportPushButton.setText(_translate("MainWindow", "Export"))
+        self.openExportPushButton.setText(_translate("MainWindow", "Open Recent"))
         self.queryExitPushButton.setText(_translate("MainWindow", "Exit"))
         self.queryStatusLabel.setText(_translate("MainWindow", "Make a query"))
 

+ 22 - 4
baangt/ui/pyqt/uimain.py

@@ -25,7 +25,7 @@ from baangt.base.PathManagement import ManagedPaths
 from uuid import uuid4
 from baangt.base.FilesOpen import FilesOpen
 from baangt.base.RuntimeStatistics import Statistic
-from baangt.base.PathManagement import ManagedPaths
+#from baangt.base.PathManagement import ManagedPaths
 from baangt.base.DownloadFolderMonitoring import DownloadFolderMonitoring
 from baangt.base.Cleanup import Cleanup
 from baangt.base.ResultsBrowser import ResultsBrowser
@@ -38,6 +38,7 @@ from time import sleep
 import signal
 from datetime import datetime
 
+
 logger = logging.getLogger("pyC")
 
 
@@ -136,6 +137,7 @@ class MainWindow(Ui_MainWindow):
         self.actionQuery.triggered.connect(self.showQueryPage)
         self.queryMakePushButton.clicked.connect(self.makeResultQuery)
         self.queryExportPushButton.clicked.connect(self.exportResultQuery)
+        self.openExportPushButton.clicked.connect(self.openRecentQueryResults)
         self.queryExitPushButton.clicked.connect(self.mainPageView)
 
         # Quit Event
@@ -1363,14 +1365,30 @@ class MainWindow(Ui_MainWindow):
         _translate = QtCore.QCoreApplication.translate
 
         if self.queryResults.query_set:
-            self.queryStatusLabel.setText(_translate("MainWindow", "Exporting results..."))
-            sleep(1)
+            #self.queryStatusLabel.setText(_translate("MainWindow", "Exporting results..."))
+            #sleep(1)
             path_to_export = self.queryResults.export()
             self.queryStatusLabel.setText(_translate("MainWindow", f"Exported to: {path_to_export}"))
-            #FilesOpen.openResultFile(path_to_export)
+            FilesOpen.openResultFile(path_to_export)
         else:
             self.queryStatusLabel.setText(_translate("MainWindow", f"ERROR: No data to export"))
 
+    @pyqtSlot()
+    def openRecentQueryResults(self):
+        #
+        # opens recent query result file
+        #
+
+        try:
+            # get recent file
+            recent_export = max(
+                list(Path(self.managedPaths.getOrSetDBExportPath()).glob('*.xlsx')),
+                key=os.path.getctime,
+            )
+            FilesOpen.openResultFile(recent_export)
+        except Exception:
+            # no export file exists
+            self.statusMessage(f"No Result Export File to Show", 3000)
 
 
     @pyqtSlot()

BIN
examples/DropsTestExample.xlsx


+ 34 - 0
examples/globals_20200815_184400.json

@@ -0,0 +1,34 @@
+{
+    "TC.Lines": "1",
+    "TC.dontCloseBrowser": "False",
+    "TC.slowExecution": "False",
+    "TC.NetworkInfo": "False",
+    "TX.DEBUG": "True",
+    "TC.Browser": "FF",
+    "TC.BrowserAttributes": "",
+    "TC.ParallelRuns": "1",
+    "TC.BrowserWindowSize": "1024x768",
+    "TC.LogLevel": "Debug",
+    "Stage": "Test",
+    "SendMailTo": "",
+    "NotificationWithAttachment": "True",
+    "MsWebHook": "",
+    "SlackWebHook": "",
+    "TelegramBot": "",
+    "TelegramChannel": "",
+    "DeactivateStatistics": "False",
+    "Password": {
+        "hint": "Franzi1234",
+        "type": "text",
+        "options": [
+            "Franzi1234"
+        ],
+        "displayText": "Password",
+        "default": "Franzi1234"
+    },
+    "AR2BXLS": "CompleteBaangtWebdemo_ResultsCombined.xlsx,CombinedResults",
+    "RootPath": "/home/aguryev/freelancer/baangt/examples",
+    "Screenshots": "/home/aguryev/freelancer/baangt/examples/Screenshots",
+    "1TestResults": "/home/aguryev/freelancer/baangt/examples/1testoutput",
+    "0TestInput": "/home/aguryev/freelancer/baangt/examples/0testdateninput"
+}

BIN
examples/onestep_googleImages.xlsx