From a04643b8beb66fb71b6facd00b2c18aaa119547e Mon Sep 17 00:00:00 2001 From: damies13 Date: Tue, 15 Oct 2024 01:40:49 +1000 Subject: [PATCH 01/35] Template in progress Issue #239 --- rfswarm_reporter/rfswarm_reporter.py | 404 ++++++++++++++++++++++++++- 1 file changed, 400 insertions(+), 4 deletions(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index bd834c7c2..886a36459 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -365,7 +365,10 @@ def template_create(self): base.debugmsg(5, "base.report: ", base.report._sections) - es = self.report_new_section("TOP", "Template") + # + # Information + # + es = self.report_new_section("TOP", "Information") self.report_item_set_type(es, 'note') notetxt = "Define your template by adding sections and configuring the section settings\n" notetxt += "Each section can be:\n" @@ -373,18 +376,411 @@ def template_create(self): notetxt += " - Heading, usefull for grouping sections\n" notetxt += " - Contents like a table of contents or figures\n" notetxt += " - Data Table, with data from test results\n" - notetxt += " - Data Graph, for graphical representation of test results\n\n" - notetxt += "Each section can also have sub sections\n\n" - notetxt += "The cover page and overall report settings can be found on the settings pane of the Report item above\n" + notetxt += " - Data Graph, for graphical representation of test results\n" + notetxt += " - Errors, gather error details and screenshots (if applicable) from robot logs\n\n" + notetxt += "Each section can also have sub sections.\n\n" + notetxt += "Use the arrows buttons to move sections up and down within the report.\n\n" + notetxt += "The cover page and overall report settings can be found on the settings pane of the Report item above.\n\n" + notetxt += "When you have your report how you like it, save it as a report template, so your future test results can use the same report format.\n\n" self.rt_note_set(es, notetxt) + # + # Table of Contents + # + # name = Contents + # parent = TOP + toc = self.report_new_section("TOP", "Table of Contents") + # type = contents + self.report_item_set_type(toc, 'contents') + # mode = Table Of Contents + self.rt_contents_set_mode(toc, 'Table Of Contents') + # level = 2 + self.rt_contents_set_level(toc, '2') + + # + # Scenario Plan + # + plng = self.report_new_section("TOP", "Scenario Plan") + self.report_item_set_type(plng, 'graph') + + # [FB9082D01BCL] + plngl = plng + "L" + # datatype = Plan + self.rt_table_set_dt(plngl, 'Plan') + # changed = 1728738092.5689259 + # sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' + # showtotal = 1 + base.report_item_set_int(plngl, "ShowTotal", 1) + + # [FB9082D01BCR] + plngr = plng + "R" + # datatype = None + self.rt_table_set_dt(plngr, 'None') + + # + # - Scenario Detail + # + # name = Scenario Detail + # parent = FB9082D01BC + plnt = self.report_new_section(plng, "Scenario Detail") + # type = table + self.report_item_set_type(plnt, 'table') + # colours = 1 + self.rt_table_set_colours(plnt, 1) + # datatype = Plan + self.rt_table_set_dt(plnt, "Plan") + # col_index_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("index Show"), 1) + # col_robots_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("robots Show"), 1) + # col_delay_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("delay Show"), 1) + # col_ramp_up_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("ramp up Show"), 1) + # col_run_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("run Show"), 1) + # col_script_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("script Show"), 1) + # col_script_opt = File + base.report_item_set_value(plnt, base.rt_table_ini_colname("script Opt"), "File") + # col_test_show = 1 + base.report_item_set_bool(plnt, base.rt_table_ini_colname("test Show"), 1) + + # + # Test Result Summary + # + # name = Test Result Summary + # parent = TOP trs = self.report_new_section("TOP", "Test Result Summary") + # type = table self.report_item_set_type(trs, 'table') # colours = 0 self.rt_table_set_colours(trs, 0) # datatype = ResultSummary self.rt_table_set_dt(trs, "ResultSummary") + # filteragent = + # filtertype = None + # col_result_name_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("Result Name Show"), 1) + # col_minimum_show = 0 + base.report_item_set_bool(trs, base.rt_table_ini_colname("minimum Show"), 0) + # col_average_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("average Show"), 1) + # col_90x37ile_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("90%ile Show"), 1) + # col_maximum_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("maximum Show"), 1) + # col_std_dev_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("Std Dev Show"), 1) + # col_pass_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("pass Show"), 1) + # col_fail_show = 1 + base.report_item_set_bool(trs, base.rt_table_ini_colname("fail Show"), 1) + # col_other_show = 0 + base.report_item_set_bool(trs, base.rt_table_ini_colname("other Show"), 0) + + # + # Robots vs Response Time + # + rrt = self.report_new_section("TOP", "Robots vs Response Time") + self.report_item_set_type(rrt, 'graph') + + # [FA37C950802L] + idl = rrt + "L" + # resulttype = Response Time + base.report_item_set_value(idl, "resulttype", "Response Time") + # changed = 1728738059.779502 + # filterresult = None + # filteragent = None + # datatype = Result + self.rt_table_set_dt(idl, 'Result') + + # [FA37C950802R] + idr = rrt + "R" + # datatype = Metric + self.rt_table_set_dt(idr, 'Metric') + # changed = 1728738059.7891614 + # axisen = 1 + base.report_item_set_bool(idr, "axisen", 1) + # metrictype = Scenario + base.report_item_set_value(idr, "metrictype", "Scenario") + # filteragent = None + # filtertype = None + + # + # - Response Times + # + # name = Response Times + rt = self.report_new_section(rrt, "Response Times") + # parent = FA37C950802 + self.report_item_set_type(rt, 'table') + # type = table + base.report_item_set_value(rt, "type", "table") + # changed = 1728738060.9264157 + # colours = 1 + base.report_item_set_bool(rt, "colours", 1) + # datatype = Result + base.report_item_set_value(rt, "datatype", "Result") + # resulttype = Response Time + base.report_item_set_value(rt, "resulttype", "Response Time") + # filterresult = None + # filteragent = None + + # + # - Robots + # + # name = Robots + rb = self.report_new_section(rrt, "Robots") + # type = table + self.report_item_set_type(rb, 'table') + # parent = FA37C950802 + # changed = 1728744845.4971852 + # colours = 1 + base.report_item_set_bool(rb, "colours", 1) + # datatype = Metric + base.report_item_set_value(rb, "datatype", "Metric") + # metrictype = Scenario + base.report_item_set_value(rb, "metrictype", "Scenario") + # filteragent = None + # filtertype = None + # secondarymetric = total_robots + base.report_item_set_value(rb, "secondarymetric", "total_robots") + # isnumeric = 1 + base.report_item_set_bool(rb, "isnumeric", 1) + # showcount = 0 + base.report_item_set_bool(rb, "showcount", 1) + # col_primarymetric_show = 1 + base.report_item_set_bool(rb, "col_primarymetric_show", 1) + # col_minimum_show = 0 + base.report_item_set_bool(rb, "col_minimum_show", 0) + # col_average_show = 0 + base.report_item_set_bool(rb, "col_average_show", 0) + # col_90x37ile_show = 0 + base.report_item_set_bool(rb, "col_90x37ile_show", 0) + # col_maximum_show = 1 + base.report_item_set_bool(rb, "col_maximum_show", 1) + # col_std_dev_show = 0 + base.report_item_set_bool(rb, "col_std_dev_show", 0) + # col_maximum = Robots + base.report_item_set_value(rb, "col_maximum", "Robots") + + # + # Agents + # + # name = Agents + agnt = self.report_new_section("TOP", "Agents") + # type = head + self.report_item_set_type(agnt, 'head') + # parent = TOP + + # + # - CPU + # + cpu = self.report_new_section(agnt, "Agent CPU Usage") + self.report_item_set_type(cpu, 'graph') + # name = CPU + # parent = FB90C705569 + # type = graph + + # [FB90C728C87L] + idl = cpu + "L" + # metrictype = Agent + base.report_item_set_value(idl, "metrictype", "Agent") + # changed = 1728745351.1353724 + base.report_item_set_bool(idl, "axisen", 1) + # filteragent = None + # filtertype = None + # datatype = Metric + base.report_item_set_value(idl, "datatype", "Metric") + # secondarymetric = CPU + base.report_item_set_value(idl, "secondarymetric", "CPU") + # enablefilteragent = 1 + base.report_item_set_bool(rt, "enablefilteragent", 1) + # + # [FB90C728C87R] + idr = cpu + "R" + # datatype = Metric + base.report_item_set_value(idr, "datatype", "Metric") + # changed = 1728745351.027923 + # axisen = 1 + base.report_item_set_bool(idr, "axisen", 1) + # metrictype = Scenario + base.report_item_set_value(idr, "metrictype", "Scenario") + # filteragent = None + # filtertype = None + # secondarymetric = total_robots + base.report_item_set_value(idr, "secondarymetric", "total_robots") + + # + # - Memory + # + # name = Memory + mem = self.report_new_section(agnt, "Agent Memory (RAM) Usage") + # type = graph + self.report_item_set_type(mem, 'graph') + + # [FB90C73DBB6L] + idl = cpu + "L" + # metrictype = Agent + base.report_item_set_value(idl, "metrictype", "Agent") + # changed = 1728745342.77505 + base.report_item_set_bool(idl, "axisen", 1) + # filteragent = None + # filtertype = None + # datatype = Metric + base.report_item_set_value(idl, "datatype", "Metric") + # secondarymetric = MEM + base.report_item_set_value(idl, "secondarymetric", "MEM") + # enablefilteragent = 1 + base.report_item_set_bool(rt, "enablefilteragent", 1) + # + # [FB90C73DBB6R] + idr = cpu + "R" + # datatype = Metric + base.report_item_set_value(idr, "datatype", "Metric") + # changed = 1728745342.6672406 + # axisen = 1 + base.report_item_set_bool(idr, "axisen", 1) + # filteragent = None + # filtertype = None + # metrictype = Scenario + base.report_item_set_value(idr, "metrictype", "Scenario") + # secondarymetric = total_robots + base.report_item_set_value(idr, "secondarymetric", "total_robots") + + # + # - Agent Names + # + # name = Agent Names + an = self.report_new_section(agnt, "Agent Names") + # type = table + self.report_item_set_type(an, 'table') + # colours = 1 + base.report_item_set_bool(an, "colours", 1) + # datatype = Metric + base.report_item_set_value(an, "datatype", "Metric") + # metrictype = Agent + base.report_item_set_value(an, "metrictype", "Agent") + # filteragent = None + # filtertype = None + # col_primarymetric_show = 0 + base.report_item_set_bool(an, "col_primarymetric_show", 0) + # col_metrictype_show = 1 + base.report_item_set_bool(an, "col_metrictype_show", 1) + # col_secondarymetric_show = 1 + base.report_item_set_bool(an, "col_secondarymetric_show", 1) + # col_metricvalue_show = 0 + base.report_item_set_bool(an, "col_metricvalue_show", 0) + # enablefilteragent = 1 + base.report_item_set_bool(an, "enablefilteragent", 1) + # secondarymetric = CPU + base.report_item_set_value(an, "secondarymetric", "CPU") + # col_agent_show = 1 + base.report_item_set_bool(an, "col_agent_show", 1) + + # + # - Agent Details + # + # name = Agent Details + ad = self.report_new_section(agnt, "Agent Details") + # type = table + self.report_item_set_type(ad, 'table') + # parent = FB90C705569 + # changed = 1728745707.049637 + # colours = 0 + base.report_item_set_bool(ad, "colours", 0) + # datatype = Metric + base.report_item_set_value(ad, "datatype", "Metric") + # metrictype = Agent + base.report_item_set_value(ad, "datatype", "Metric") + # filteragent = None + # filtertype = None + # col_primarymetric_show = 1 + base.report_item_set_bool(ad, "col_primarymetric_show", 1) + # col_metrictype_show = 1 + base.report_item_set_bool(ad, "col_metrictype_show", 1) + # col_secondarymetric_show = 1 + base.report_item_set_bool(ad, "col_secondarymetric_show", 1) + # col_metricvalue_show = 1 + base.report_item_set_bool(ad, "col_metricvalue_show", 1) + # enablefilteragent = 1 + base.report_item_set_bool(ad, "enablefilteragent", 1) + # col_agent_show = 0 + base.report_item_set_bool(ad, "col_agent_show", 0) + # col_primarymetric = Agent Name + base.report_item_set_value(ad, "col_primarymetric", "Agent Name") + # col_secondarymetric = Metric Name + base.report_item_set_value(ad, "col_secondarymetric", "Metric Name") + # col_metricvalue = Metric Value + base.report_item_set_value(ad, "col_metricvalue", "Metric Value") + + # + # Errors + # + # name = Errors + # parent = TOP + err = self.report_new_section("TOP", "Errors") + # type = head + self.report_item_set_type(err, 'head') + + # + # - Failed Keywords Graph + # + # name = Failed Keywords Graph + fkg = self.report_new_section(err, "Failed Keywords Graph") + # type = graph + self.report_item_set_type(fkg, 'graph') + + # [FB90CDCCFC9L] + # resulttype = TPS + # changed = 1728746053.26743 + # filterresult = Fail + # filteragent = None + # datatype = Result + # enablefilterresult = 1 + # + # [FB90CDCCFC9R] + # datatype = Metric + # changed = 1728746053.2828546 + # axisen = 1 + # metrictype = Scenario + # filteragent = None + # filtertype = None + # secondarymetric = total_robots + + # + # - Failed Keywords Names + # + fkn = self.report_new_section(err, "Failed Keywords Names") + self.report_item_set_type(fkn, 'table') + # name = Failed Keywords Names + # parent = FB90CD6ECAE + # type = table + # changed = 1728746043.623058 + # colours = 1 + # datatype = Result + # resulttype = TPS + # filterresult = Fail + # filteragent = None + # enablefilterresult = 1 + # col_result_name_show = 1 + # col_result_show = 1 + # col_count_show = 1 + + # + # - Error Details + # + ed = self.report_new_section(err, "Error Details") + self.report_item_set_type(ed, 'Err') + # name = Error Details + # parent = FB90CD6ECAE + # type = errors + # changed = 1728746092.6821463 + # images = 1 + # grouprn = 1 + # groupet = 1 + def template_save(self, filename): saved = False From b9d5a8ce4375602484b78a2ed71f2fe78c54472a Mon Sep 17 00:00:00 2001 From: damies13 Date: Tue, 15 Oct 2024 14:05:24 +1000 Subject: [PATCH 02/35] Template seems to work now, hopefully nothing broke Issue #239 --- rfswarm_reporter/rfswarm_reporter.py | 157 ++++++++++++++++++--------- 1 file changed, 104 insertions(+), 53 deletions(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 886a36459..781d4b5f3 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -377,7 +377,7 @@ def template_create(self): notetxt += " - Contents like a table of contents or figures\n" notetxt += " - Data Table, with data from test results\n" notetxt += " - Data Graph, for graphical representation of test results\n" - notetxt += " - Errors, gather error details and screenshots (if applicable) from robot logs\n\n" + notetxt += " - Errors, gather error details and screenshots (if applicable) from robot logs\n\n" notetxt += "Each section can also have sub sections.\n\n" notetxt += "Use the arrows buttons to move sections up and down within the report.\n\n" notetxt += "The cover page and overall report settings can be found on the settings pane of the Report item above.\n\n" @@ -405,6 +405,7 @@ def template_create(self): # [FB9082D01BCL] plngl = plng + "L" + base.report_add_subsection(plngl) # datatype = Plan self.rt_table_set_dt(plngl, 'Plan') # changed = 1728738092.5689259 @@ -414,6 +415,7 @@ def template_create(self): # [FB9082D01BCR] plngr = plng + "R" + base.report_add_subsection(plngr) # datatype = None self.rt_table_set_dt(plngr, 'None') @@ -486,27 +488,30 @@ def template_create(self): rrt = self.report_new_section("TOP", "Robots vs Response Time") self.report_item_set_type(rrt, 'graph') - # [FA37C950802L] - idl = rrt + "L" + # [FA37C950802L]idl + rttl = rrt + "L" + base.report_add_subsection(rttl) # resulttype = Response Time - base.report_item_set_value(idl, "resulttype", "Response Time") + base.report_item_set_value(rttl, "resulttype", "Response Time") # changed = 1728738059.779502 # filterresult = None # filteragent = None # datatype = Result - self.rt_table_set_dt(idl, 'Result') + self.rt_table_set_dt(rttl, 'Result') # [FA37C950802R] - idr = rrt + "R" + rttr = rrt + "R" + base.report_add_subsection(rttr) # datatype = Metric - self.rt_table_set_dt(idr, 'Metric') + self.rt_table_set_dt(rttr, 'Metric') # changed = 1728738059.7891614 # axisen = 1 - base.report_item_set_bool(idr, "axisen", 1) + base.report_item_set_bool(rttr, "axisen", 1) # metrictype = Scenario - base.report_item_set_value(idr, "metrictype", "Scenario") + base.report_item_set_value(rttr, "metrictype", "Scenario") # filteragent = None # filtertype = None + base.report_item_set_value(rttr, "secondarymetric", "total_robots") # # - Response Times @@ -584,33 +589,35 @@ def template_create(self): # type = graph # [FB90C728C87L] - idl = cpu + "L" + cpul = cpu + "L" + base.report_add_subsection(cpul) # metrictype = Agent - base.report_item_set_value(idl, "metrictype", "Agent") + base.report_item_set_value(cpul, "metrictype", "Agent") # changed = 1728745351.1353724 - base.report_item_set_bool(idl, "axisen", 1) + base.report_item_set_bool(cpul, "axisen", 1) # filteragent = None # filtertype = None # datatype = Metric - base.report_item_set_value(idl, "datatype", "Metric") + base.report_item_set_value(cpul, "datatype", "Metric") # secondarymetric = CPU - base.report_item_set_value(idl, "secondarymetric", "CPU") + base.report_item_set_value(cpul, "secondarymetric", "CPU") # enablefilteragent = 1 - base.report_item_set_bool(rt, "enablefilteragent", 1) + base.report_item_set_bool(cpul, "enablefilteragent", 1) # # [FB90C728C87R] - idr = cpu + "R" + cpur = cpu + "R" + base.report_add_subsection(cpur) # datatype = Metric - base.report_item_set_value(idr, "datatype", "Metric") + base.report_item_set_value(cpur, "datatype", "Metric") # changed = 1728745351.027923 # axisen = 1 - base.report_item_set_bool(idr, "axisen", 1) + base.report_item_set_bool(cpur, "axisen", 1) # metrictype = Scenario - base.report_item_set_value(idr, "metrictype", "Scenario") + base.report_item_set_value(cpur, "metrictype", "Scenario") # filteragent = None # filtertype = None # secondarymetric = total_robots - base.report_item_set_value(idr, "secondarymetric", "total_robots") + base.report_item_set_value(cpur, "secondarymetric", "total_robots") # # - Memory @@ -621,33 +628,35 @@ def template_create(self): self.report_item_set_type(mem, 'graph') # [FB90C73DBB6L] - idl = cpu + "L" + meml = mem + "L" + base.report_add_subsection(meml) # metrictype = Agent - base.report_item_set_value(idl, "metrictype", "Agent") + base.report_item_set_value(meml, "metrictype", "Agent") # changed = 1728745342.77505 - base.report_item_set_bool(idl, "axisen", 1) + base.report_item_set_bool(meml, "axisen", 1) # filteragent = None # filtertype = None # datatype = Metric - base.report_item_set_value(idl, "datatype", "Metric") + base.report_item_set_value(meml, "datatype", "Metric") # secondarymetric = MEM - base.report_item_set_value(idl, "secondarymetric", "MEM") + base.report_item_set_value(meml, "secondarymetric", "MEM") # enablefilteragent = 1 - base.report_item_set_bool(rt, "enablefilteragent", 1) + base.report_item_set_bool(meml, "enablefilteragent", 1) # # [FB90C73DBB6R] - idr = cpu + "R" + memr = mem + "R" + base.report_add_subsection(memr) # datatype = Metric - base.report_item_set_value(idr, "datatype", "Metric") + base.report_item_set_value(memr, "datatype", "Metric") # changed = 1728745342.6672406 # axisen = 1 - base.report_item_set_bool(idr, "axisen", 1) + base.report_item_set_bool(memr, "axisen", 1) # filteragent = None # filtertype = None # metrictype = Scenario - base.report_item_set_value(idr, "metrictype", "Scenario") + base.report_item_set_value(memr, "metrictype", "Scenario") # secondarymetric = total_robots - base.report_item_set_value(idr, "secondarymetric", "total_robots") + base.report_item_set_value(memr, "secondarymetric", "total_robots") # # - Agent Names @@ -715,7 +724,7 @@ def template_create(self): # col_metricvalue = Metric Value base.report_item_set_value(ad, "col_metricvalue", "Metric Value") - # + # Errors # # name = Errors @@ -733,53 +742,79 @@ def template_create(self): self.report_item_set_type(fkg, 'graph') # [FB90CDCCFC9L] + fkgl = fkg + "L" + base.report_add_subsection(fkgl) + base.report_item_set_bool(fkgl, "axisen", 1) # resulttype = TPS + base.report_item_set_value(fkgl, "resulttype", "TPS") # changed = 1728746053.26743 # filterresult = Fail + base.report_item_set_value(fkgl, "filterresult", "Fail") # filteragent = None # datatype = Result + base.report_item_set_value(fkgl, "datatype", "Result") # enablefilterresult = 1 + base.report_item_set_bool(fkgl, "enablefilterresult", 1) + + # # [FB90CDCCFC9R] + fkgr = fkg + "R" + base.report_add_subsection(fkgr) # datatype = Metric + base.report_item_set_value(fkgr, "datatype", "Metric") # changed = 1728746053.2828546 # axisen = 1 + base.report_item_set_bool(fkgr, "axisen", 1) # metrictype = Scenario + base.report_item_set_value(fkgr, "metrictype", "Scenario") # filteragent = None # filtertype = None # secondarymetric = total_robots + base.report_item_set_value(fkgr, "secondarymetric", "total_robots") # # - Failed Keywords Names # + # name = Failed Keywords Names fkn = self.report_new_section(err, "Failed Keywords Names") + # type = table self.report_item_set_type(fkn, 'table') - # name = Failed Keywords Names # parent = FB90CD6ECAE - # type = table # changed = 1728746043.623058 # colours = 1 + base.report_item_set_bool(fkn, "colours", 1) # datatype = Result + base.report_item_set_value(fkn, "datatype", "Result") # resulttype = TPS + base.report_item_set_value(fkn, "resulttype", "TPS") # filterresult = Fail + base.report_item_set_value(fkn, "filterresult", "Fail") # filteragent = None # enablefilterresult = 1 + base.report_item_set_bool(fkn, "enablefilterresult", 1) # col_result_name_show = 1 + base.report_item_set_bool(fkn, "col_result_name_show", 1) # col_result_show = 1 + base.report_item_set_bool(fkn, "col_result_show", 1) # col_count_show = 1 + base.report_item_set_bool(fkn, "col_count_show", 1) # # - Error Details # - ed = self.report_new_section(err, "Error Details") - self.report_item_set_type(ed, 'Err') # name = Error Details - # parent = FB90CD6ECAE + ed = self.report_new_section(err, "Error Details") # type = errors + self.report_item_set_type(ed, 'errors') + # parent = FB90CD6ECAE # changed = 1728746092.6821463 # images = 1 + base.report_item_set_bool(ed, "images", 1) # grouprn = 1 + base.report_item_set_bool(ed, "grouprn", 1) # groupet = 1 + base.report_item_set_bool(ed, "groupet", 1) def template_save(self, filename): @@ -9780,14 +9815,22 @@ def cs_graph_switchdt(self, _event=None): base.debugmsg(5, "Set Options") while "SMetric" not in self.contentdata[idl]: time.sleep(0.1) - self.contentdata[idl]["intIsNum"].set(base.rt_table_get_isnumeric(idl)) - self.contentdata[idl]["MType"].set(base.rt_table_get_mt(idl)) - self.contentdata[idl]["PMetric"].set(base.rt_table_get_pm(idl)) - self.contentdata[idl]["SMetric"].set(base.rt_table_get_sm(idl)) - self.contentdata[idl]["intFA"].set(base.rt_table_get_enfa(idl)) - self.contentdata[idl]["FAType"].set(base.rt_table_get_fa(idl)) - self.contentdata[idl]["FNType"].set(base.rt_table_get_fn(idl)) - self.contentdata[idl]["FPattern"].set(base.rt_table_get_fp(idl)) + if "intIsNum" in self.contentdata[idl]: + self.contentdata[idl]["intIsNum"].set(base.rt_table_get_isnumeric(idl)) + if "MType" in self.contentdata[idl]: + self.contentdata[idl]["MType"].set(base.rt_table_get_mt(idl)) + if "PMetric" in self.contentdata[idl]: + self.contentdata[idl]["PMetric"].set(base.rt_table_get_pm(idl)) + if "SMetric" in self.contentdata[idl]: + self.contentdata[idl]["SMetric"].set(base.rt_table_get_sm(idl)) + if "intFA" in self.contentdata[idl]: + self.contentdata[idl]["intFA"].set(base.rt_table_get_enfa(idl)) + if "FAType" in self.contentdata[idl]: + self.contentdata[idl]["FAType"].set(base.rt_table_get_fa(idl)) + if "FNType" in self.contentdata[idl]: + self.contentdata[idl]["FNType"].set(base.rt_table_get_fn(idl)) + if "FPattern" in self.contentdata[idl]: + self.contentdata[idl]["FPattern"].set(base.rt_table_get_fp(idl)) if datatyper == "Metric": base.debugmsg(5, "Update Options") @@ -9795,14 +9838,22 @@ def cs_graph_switchdt(self, _event=None): base.debugmsg(5, "Set Options") while "SMetric" not in self.contentdata[idr]: time.sleep(0.1) - self.contentdata[idr]["intIsNum"].set(base.rt_table_get_isnumeric(idr)) - self.contentdata[idr]["MType"].set(base.rt_table_get_mt(idr)) - self.contentdata[idr]["PMetric"].set(base.rt_table_get_pm(idr)) - self.contentdata[idr]["SMetric"].set(base.rt_table_get_sm(idr)) - self.contentdata[idr]["intFA"].set(base.rt_table_get_enfa(idr)) - self.contentdata[idr]["FAType"].set(base.rt_table_get_fa(idr)) - self.contentdata[idr]["FNType"].set(base.rt_table_get_fn(idr)) - self.contentdata[idr]["FPattern"].set(base.rt_table_get_fp(idr)) + if "intIsNum" in self.contentdata[idr]: + self.contentdata[idr]["intIsNum"].set(base.rt_table_get_isnumeric(idr)) + if "MType" in self.contentdata[idr]: + self.contentdata[idr]["MType"].set(base.rt_table_get_mt(idr)) + if "PMetric" in self.contentdata[idr]: + self.contentdata[idr]["PMetric"].set(base.rt_table_get_pm(idr)) + if "SMetric" in self.contentdata[idr]: + self.contentdata[idr]["SMetric"].set(base.rt_table_get_sm(idr)) + if "intFA" in self.contentdata[idr]: + self.contentdata[idr]["intFA"].set(base.rt_table_get_enfa(idr)) + if "FAType" in self.contentdata[idr]: + self.contentdata[idr]["FAType"].set(base.rt_table_get_fa(idr)) + if "FNType" in self.contentdata[idr]: + self.contentdata[idr]["FNType"].set(base.rt_table_get_fn(idr)) + if "FPattern" in self.contentdata[idr]: + self.contentdata[idr]["FPattern"].set(base.rt_table_get_fp(idr)) if datatypel == "Plan": self.contentdata[idl]["intSTot"].set(base.report_item_get_int(idl, "ShowTotal")) From d8b274ebcf2389ba7c3c1011f2687c34e44725e5 Mon Sep 17 00:00:00 2001 From: damies13 Date: Tue, 15 Oct 2024 21:50:18 +1000 Subject: [PATCH 03/35] Missed one option setting Issue #239 --- rfswarm_reporter/rfswarm_reporter.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 781d4b5f3..c8083c883 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -702,7 +702,7 @@ def template_create(self): # datatype = Metric base.report_item_set_value(ad, "datatype", "Metric") # metrictype = Agent - base.report_item_set_value(ad, "datatype", "Metric") + base.report_item_set_value(ad, "metrictype", "Metric") # filteragent = None # filtertype = None # col_primarymetric_show = 1 @@ -724,7 +724,6 @@ def template_create(self): # col_metricvalue = Metric Value base.report_item_set_value(ad, "col_metricvalue", "Metric Value") - # Errors # # name = Errors @@ -756,7 +755,6 @@ def template_create(self): # enablefilterresult = 1 base.report_item_set_bool(fkgl, "enablefilterresult", 1) - # # [FB90CDCCFC9R] fkgr = fkg + "R" @@ -816,7 +814,6 @@ def template_create(self): # groupet = 1 base.report_item_set_bool(ed, "groupet", 1) - def template_save(self, filename): saved = False if filename is None or len(filename) < 1: From 7daaaee9f4e13491587b23fbc9f08186a91fb18d Mon Sep 17 00:00:00 2001 From: damies13 Date: Tue, 15 Oct 2024 22:12:47 +1000 Subject: [PATCH 04/35] Test tweaks --- Tests/Regression/Reporter/GUI_Bugs.robot | 3 ++- Tests/Regression/Reporter/GUI_Common.robot | 6 +++--- Tests/Regression/Reporter/GUI_Features.robot | 6 ++++-- .../reporter_windows_section_issue#140.png | Bin 583 -> 649 bytes .../reporter_windows_section_issue#141.png | Bin 545 -> 583 bytes 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index 486d2196c..40d6eb9ae 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -260,8 +260,9 @@ Template with Start and End Dates Save Template File OS DIALOG ${templatename} Click Button GenerateHTML + Wait For Status GeneratingXHTMLReport Wait For Status SavedXHTMLReport - + Sleep 1 Close GUI ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html diff --git a/Tests/Regression/Reporter/GUI_Common.robot b/Tests/Regression/Reporter/GUI_Common.robot index 4910a9463..e340cd5a4 100644 --- a/Tests/Regression/Reporter/GUI_Common.robot +++ b/Tests/Regression/Reporter/GUI_Common.robot @@ -288,7 +288,7 @@ Open GUI windows Set Confidence 0.9 # ${process}= Start Process python3 ${pyfile} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt # ${process}= Start Process python ${pyfile} -g 6 @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt - ${process}= Start Process ${cmd_reporter} -g 6 @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt + ${process}= Start Process ${cmd_reporter} @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt Set Suite Variable $process ${process} # reporter_windows_status_previewloaded @@ -303,7 +303,7 @@ Open GUI ubuntu Set Suite Variable ${platform} ubuntu Set Confidence 0.9 # ${process}= Start Process python3 ${pyfile} -g 6 @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt - ${process}= Start Process ${cmd_reporter} -g 6 @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt + ${process}= Start Process ${cmd_reporter} @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt Set Suite Variable $process ${process} # Sleep 60 # Capture Screen @@ -315,7 +315,7 @@ Open GUI macos Set Suite Variable ${platform} macos Set Confidence 0.9 # ${process}= Start Process python3 ${pyfile} -g 5 @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt - ${process}= Start Process ${cmd_reporter} -g 6 @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt + ${process}= Start Process ${cmd_reporter} @{appargs} alias=Reporter stdout=${OUTPUT DIR}${/}stdout.txt stderr=${OUTPUT DIR}${/}stderr.txt Set Suite Variable $process ${process} # Sleep 60 Set Screenshot Folder ${OUTPUT DIR} diff --git a/Tests/Regression/Reporter/GUI_Features.robot b/Tests/Regression/Reporter/GUI_Features.robot index e2e6c94e5..d9bf03695 100644 --- a/Tests/Regression/Reporter/GUI_Features.robot +++ b/Tests/Regression/Reporter/GUI_Features.robot @@ -23,12 +23,14 @@ Verify That Files Get Saved With Correct Extension And Names Open GUI -d ${resultfolder} Click Button savetemplate Save Template File OS DIALOG ${templatename} - Click Button generatehtml - Sleep 2 Click Button generateword Sleep 2 Click Button generateexcel Sleep 2 + Click Button generatehtml + Sleep 2 + + Wait For Status SavedXHTMLReport # Verify files: Remove File ${templatefolder}${/}here_will_be_template.txt diff --git a/Tests/Regression/Reporter/Images/file_method/reporter_windows_section_issue#140.png b/Tests/Regression/Reporter/Images/file_method/reporter_windows_section_issue#140.png index 42cfbf95667741b069f04e14a57ce174789a2071..b83762e8bf4153207941472ac529d4f152259a8c 100644 GIT binary patch literal 649 zcmV;40(Sk0P)TH+XPNv zPT+B2=`Jq?w$~7BXE$sD6TTS=9+G&&umABFl!yo;gW=1+PGIDHjDih}QLuqA3N|oC z!3M@C*udyWu!2~{6x}TLK72}?`YMOGkwFooZsg_D2oRl1sfQnU<2bPw9)H4o2yYl00000NkvXXu0mjf+t)Kh literal 583 zcmV-N0=WH&P)9^aIw*rlL+r@ z?vf30FL9OSZ4KlQu{{aiYK#-a8MO5;RMVPLmBnoX1sB1jhs+iBL{Q4GJ0x0000DNk~Le0001J0000F2nGNE00`}hLy;j9fBs2C zK~z|U?U=EWqCgOazqw~&3@o1joX~Z!`Fk3bhzL(c%a3~(@T8xoKqKcV(8#%xKoyBfsIIfwzu_&3 z^-T@QSp`*sx=@$55h}9yzs$cEe-G~<|G9=q0DccseT-rwh5CTFb5+HgsZVzq$iE+t zD^Qi7ltP=DVxdslP#Ar1ML@a{B>&a9)Z16cGQu{}pMOtoAkg7$RL#|Novv6#q9SbD zW6tiqB~r&V9c^cxBjU*73@1Vv$CM(-CMD=C&$8UD$bVk(C*P3k3sk*fe`X~jf{2jM zFU0ycA<=7IT$3*)yjtIp=h!hJz_VwH?#TF#$1c~r{2nY|G+bXGJtZs_M5hn5E7phK zv!%x9gM$_Y_0F9p92~izC>AKCF@-_5?!2(AU9x_8C+)S^xVXMRLCQvica~r6tSdIi zp=BMfZ?(1QZ3`*KzK${t>H0X{I zkgnop0#oNB?ws6ZaD3a9LUq_~o^MElM)=`#?J-f$KTF5W<9-MI7bpAyF68)jpUE08 P00000NkvXXu0mjfXvPpH delta 538 zcmV+#0_FY31fc{WiBL{Q4GJ0x0000DNk~Le0000%0000D2nGNE0QPMIQjsAOf7nSx zK~zYI?Up@`+b|S_Kjti=3&SU%PGE2E)*V$^O}donwxLR^+t$@KkxpQpz;I#mE-!`r zZ%Q&YNY+4h02UgJh{5CNJt`3q{&Rf$Yy;1LND*o>l~MnDFAxf{BD5Z|8wYiU>hKkc z6qOc)2lcmjsw9M8YZxUE_Au5*f0iOusCTf@uWDZN=5m(-eFSocN-S2Y`xk!?l@;KA z87F?gmv=_2b7HQv-TD{?l5nW1YFC@k7*~_2l;V`fo99rFs^d42h)!3Cc${^35h`n` zM3Bvrq}N`-V)uj9%cDmgM}HCOSMo`Ph#(@YrX5`WCS-ce+_!qE;Aasce>%^O5eb1k zV{}AujX<$jGygtlU=aO9&|^$FBfT^o@ zZDDmz)8y#e3GpBvnhwcwaD#V-?LKsHnz3m(9dP|lc@mD8Pij_ukzF_&H6eq{FabbJ42(?N-RU7Mfk cvh-Q_4VU?a7xmv!9RL6T07*qoM6N<$f(!!osQ>@~ From 5143cce4fef53f8180428194282379ddc944734a Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 01:00:39 +1000 Subject: [PATCH 05/35] Several tests failed in Wait For Status at 5 min, and were at 80-90% Issue #239 Seems the new template make the status take a bit longer, makes sense it's a more complex template --- Tests/Regression/Reporter/GUI_Common.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Regression/Reporter/GUI_Common.robot b/Tests/Regression/Reporter/GUI_Common.robot index e340cd5a4..522f3e157 100644 --- a/Tests/Regression/Reporter/GUI_Common.robot +++ b/Tests/Regression/Reporter/GUI_Common.robot @@ -257,7 +257,7 @@ Click Dialog Button # Take A Screenshot Wait For Status - [Arguments] ${status} ${timeout}=300 + [Arguments] ${status} ${timeout}=600 ${statusl}= Convert To Lower Case ${status} ${img}= Set Variable reporter_${platform}_status_${statusl}.png Log ${CURDIR} From 58b7f62a6414a7ff33dbf1930cf22f20d8175b22 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 01:43:34 +1000 Subject: [PATCH 06/35] Handle finding xml files better Issue 239 --- rfswarm_reporter/rfswarm_reporter.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index c8083c883..36f77fed0 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -2999,18 +2999,14 @@ def rt_errors_parse_xml(self, id, rid): ldir = os.path.join(os.path.dirname(dbfile), "logs") base.debugmsg(8, "ldir:", ldir) - # opencart_1_1_1690876686_1_1690876693 - gpatt = os.path.join(ldir, "{}_{}_{}_*_{}*".format(rdata['script'].split('.')[0], rdata['script_index'], rdata['robot'], rdata['iteration'])) - base.debugmsg(9, "gpatt:", gpatt) - - lfol = glob.glob(gpatt, recursive=True)[0] - base.debugmsg(9, "lfol:", lfol) - # opencart_1_1_1690876686_1_1690876693/Opencart_Sales_output.xml - gxpatt = os.path.join(ldir, "{}_{}_{}_*_{}*".format(rdata['script'].split('.')[0], rdata['script_index'], rdata['robot'], rdata['iteration']), "*_output.xml") + gxpatt = os.path.join(ldir, "{}_{}_{}_*_{}_*".format(rdata['script'].split('.')[0], rdata['script_index'], rdata['robot'], rdata['iteration']), "*_output.xml") base.debugmsg(9, "gxpatt:", gxpatt) - xmlf = glob.glob(gxpatt, recursive=True)[0] + xmlf = "not_found" + xmll = glob.glob(gxpatt, recursive=True) + if len(xmll)>0: + xmlf = glob.glob(gxpatt, recursive=True)[0] base.debugmsg(5, "xmlf:", xmlf) if os.path.isfile(xmlf): From 755f04fc2a0a3fa1f084f2392d077e331ae56c32 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 01:49:31 +1000 Subject: [PATCH 07/35] Copy files to result folder before trying testing their content Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index 40d6eb9ae..fab4ac4b2 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -265,14 +265,14 @@ Template with Start and End Dates Sleep 1 Close GUI + Copy Files ${resultfolder0}/*.report ${testresultfolder0} + Copy Files ${resultfolder0}/*.html ${testresultfolder0} + ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table ${expected}= Get Elements Texts ${table} tr/td[1] - Copy Files ${resultfolder0}/*.report ${testresultfolder0} - Copy Files ${resultfolder0}/*.html ${testresultfolder0} - Log To Console Open Reporter with resultfolder1 and check template works Open GUI -d ${resultfolder1} -t ${templatefolder}${/}${templatename}.template From 2767c361185c019d6bb6538e8268082796b00b9e Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 01:52:08 +1000 Subject: [PATCH 08/35] for linter --- rfswarm_reporter/rfswarm_reporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 36f77fed0..17be6f7ec 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -3005,7 +3005,7 @@ def rt_errors_parse_xml(self, id, rid): xmlf = "not_found" xmll = glob.glob(gxpatt, recursive=True) - if len(xmll)>0: + if len(xmll) > 0: xmlf = glob.glob(gxpatt, recursive=True)[0] base.debugmsg(5, "xmlf:", xmlf) From f34d2e82485ec787f25f33f1c44675cc39a24af0 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 02:13:47 +1000 Subject: [PATCH 09/35] weird fST stacktrace --- .../20230928_141103_OCDemo_Requests.report | 275 ++++++++++++++++-- rfswarm_reporter/rfswarm_reporter.py | 4 +- 2 files changed, 245 insertions(+), 34 deletions(-) diff --git a/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report b/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report index 5837a6617..8eb30163b 100644 --- a/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report +++ b/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report @@ -1,55 +1,266 @@ [Report] -order = F96CC319A38,F96CC319A3D,F96CC3282EB +order = FB9A8F6C3ED,FB9A8F6C406,FB9A8F6C420,FB9A8F6C462,FB9A8F6C48B,FB9A8F6C4F3,FB9A8F6C60E title = OCDemo Requests -showtlogo = -1 -dateformat = yyyy-mm-dd -timeformat = HH:MM -timezone = Australia/Brisbane -showstarttime = -1 -showendtime = -1 -font = Verdana -fontsize = 12 -percentile = 90 - -[F96CC319A38] -name = Template + +[FB9A8F6C3ED] +name = Information parent = TOP type = note -changed = 1714034531.3852513 -note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12x12Each section can also have sub sectionsx12x12The cover page and overall report settings can be found on the settings pane of the Report item abovex12 +changed = 1729007811.0718975 +note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12 - Errors, gather error details and screenshots (if applicable) from robot logsx12x12Each section can also have sub sections.x12x12Use the arrows buttons to move sections up and down within the report.x12x12The cover page and overall report settings can be found on the settings pane of the Report item above.x12x12When you have your report how you like it, save it as a report template, so your future test results can use the same report format.x12x12 + +[FB9A8F6C406] +name = Table of Contents +parent = TOP +type = contents +changed = 1729007811.0750935 +mode = Table Of Contents +level = 2 -[F96CC319A3D] +[FB9A8F6C420] +name = Scenario Plan +parent = TOP +type = graph +changed = 1729007811.0755727 +order = FB9A8F6C42E + +[FB9A8F6C420L] +datatype = Plan +changed = 1729007817.0380068 +showtotal = 1 +sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' + +[FB9A8F6C420R] +datatype = None +changed = 1729007811.076515 + +[FB9A8F6C42E] +name = Scenario Detail +parent = FB9A8F6C420 +type = table +changed = 1729007818.0096607 +colours = 1 +datatype = Plan +col_index_show = 1 +col_robots_show = 1 +col_delay_show = 1 +col_ramp_up_show = 1 +col_run_show = 1 +col_script_show = 1 +col_script_opt = File +col_test_show = 1 +sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' + +[FB9A8F6C462] name = Test Result Summary parent = TOP type = table -changed = 1728516305.4417443 +changed = 1729007819.0345929 colours = 0 datatype = ResultSummary +col_result_name_show = 1 +col_minimum_show = 0 +col_average_show = 1 +col_90x37ile_show = 1 +col_maximum_show = 1 +col_std_dev_show = 1 +col_pass_show = 1 +col_fail_show = 1 +col_other_show = 0 sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1695874263 AND r.end_time <= 1695877212 GROUP BY r.result_name ORDER BY x91Result Namex93 -[F96CC3282EB] -name = Robots +[FB9A8F6C48B] +name = Robots vs Response Time parent = TOP type = graph -changed = 1714034594.8325248 +changed = 1729007811.0863962 +order = FB9A8F6C4A9,FB9A8F6C4B7 -[F96CC3282EBL] -secondarymetric = total_robots -changed = 1728516306.583407 -filteragent = None -filtertype = None +[FB9A8F6C48BL] +resulttype = Response Time +changed = 1729007821.8438196 +datatype = Result +sql = SELECT end_time as 'Time' , elapsed_time as 'Value' , result_name as x91Namex93 FROM Results WHERE x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 + +[FB9A8F6C48BR] datatype = Metric +changed = 1729007821.8606243 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime + +[FB9A8F6C4A9] +name = Response Times +parent = FB9A8F6C48B +type = table +changed = 1729007823.1129255 +colours = 1 +datatype = Result +resulttype = Response Time +sql = SELECT result_name as x91Result Namex93 , round(min(elapsed_time),3) 'Minimum' , round(avg(elapsed_time),3) 'Average' , round(percentile(elapsed_time, 90),3) '90x37ile' , round(max(elapsed_time),3) 'Maximum' , round(stdev(elapsed_time),3) 'Std. Dev.' , count(result) as 'Count' FROM Results WHERE x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 GROUP by x91Result Namex93 + +[FB9A8F6C4B7] +name = Robots +parent = FB9A8F6C48B +type = table +changed = 1729007827.998625 +colours = 1 +datatype = Metric +metrictype = Scenario +secondarymetric = total_robots +isnumeric = 1 +showcount = 1 +col_primarymetric_show = 1 +col_minimum_show = 0 +col_average_show = 0 +col_90x37ile_show = 0 +col_maximum_show = 1 +col_std_dev_show = 0 +col_maximum = Robots +sql = SELECT PrimaryMetric , PrimaryMetric as x91Colourx93 , min(CAST(MetricValue AS NUMERIC)) AS 'Minimum' , round(avg(CAST(MetricValue AS NUMERIC)),3) AS 'Average' , round(percentile(CAST(MetricValue AS NUMERIC), 90),3) AS '90x37ile' , max(CAST(MetricValue AS NUMERIC)) AS 'Maximum' , round(stdev(CAST(MetricValue AS NUMERIC)),3) AS 'Std. Dev.' FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 GROUP by PrimaryMetric + +[FB9A8F6C4F3] +name = Agents +parent = TOP +type = head +changed = 1729007811.0967772 +order = FB9A8F6C4FA,FB9A8F6C538,FB9A8F6C586,FB9A8F6C5BA + +[FB9A8F6C4FA] +name = Agent CPU Usage +parent = FB9A8F6C4F3 +type = graph +changed = 1729007811.0980453 + +[FB9A8F6C4FAL] +metrictype = Agent +changed = 1729007827.4941306 +axisen = 1 +datatype = Metric +secondarymetric = CPU +enablefilteragent = 1 +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime + +[FB9A8F6C4FAR] +datatype = Metric +changed = 1729007827.4949844 +axisen = 1 metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime + +[FB9A8F6C538] +name = Agent Memory (RAM) Usage +parent = FB9A8F6C4F3 +type = graph +changed = 1729007811.103636 + +[FB9A8F6C538L] +metrictype = Agent +changed = 1729007831.166079 axisen = 1 +datatype = Metric +secondarymetric = MEM +enablefilteragent = 1 +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'MEM' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime -[F96CC3282EBR] +[FB9A8F6C538R] +datatype = Metric +changed = 1729007831.1664815 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime + +[FB9A8F6C586] +name = Agent Names +parent = FB9A8F6C4F3 +type = table +changed = 1729007835.3977072 +colours = 1 datatype = Metric -changed = 1728516306.5845017 -axisen = 0 metrictype = Agent -filteragent = None -filtertype = None -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'Robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime -secondarymetric = Robots +col_primarymetric_show = 0 +col_metrictype_show = 1 +col_secondarymetric_show = 1 +col_metricvalue_show = 0 +enablefilteragent = 1 +secondarymetric = CPU +col_agent_show = 1 +sql = SELECT PrimaryMetric , DataSource 'Agent' , PrimaryMetric || ' - ' || DataSource as x91Colourx93 , MetricValue FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 GROUP by PrimaryMetric , DataSource + +[FB9A8F6C5BA] +name = Agent Details +parent = FB9A8F6C4F3 +type = table +changed = 1729007836.9755812 +colours = 0 +datatype = Metric +metrictype = Metric +col_primarymetric_show = 1 +col_metrictype_show = 1 +col_secondarymetric_show = 1 +col_metricvalue_show = 1 +enablefilteragent = 1 +col_agent_show = 0 +col_primarymetric = Agent Name +col_secondarymetric = Metric Name +col_metricvalue = Metric Value +sql = SELECT PrimaryMetric , SecondaryMetric , DataSource 'Agent' , MetricValue FROM MetricData WHERE MetricType == 'Metric' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 GROUP by PrimaryMetric , SecondaryMetric , DataSource + +[FB9A8F6C60E] +name = Errors +parent = TOP +type = head +changed = 1729007811.1255562 +order = FB9A8F6C61C,FB9A8F6C670,FB9A8F6C6C6 + +[FB9A8F6C61C] +name = Failed Keywords Graph +parent = FB9A8F6C60E +type = graph +changed = 1729007811.1267478 + +[FB9A8F6C61CL] +axisen = 1 +changed = 1729007827.33468 +resulttype = TPS +filterresult = Fail +datatype = Result +enablefilterresult = 1 +sql = SELECT floor(end_time) as 'Time' , count(result) as 'Value' , result_name as x91Namex93 FROM Results WHERE result == 'FAIL' AND x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 GROUP by floor(end_time) , result_name , result ORDER by floor(end_time), result DESC, count(result) DESC + +[FB9A8F6C61CR] +datatype = Metric +changed = 1729007827.3359115 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime + +[FB9A8F6C670] +name = Failed Keywords Names +parent = FB9A8F6C60E +type = table +changed = 1729007831.16401 +colours = 1 +datatype = Result +resulttype = TPS +filterresult = Fail +enablefilterresult = 1 +col_result_name_show = 1 +col_result_show = 1 +col_count_show = 1 +sql = SELECT result_name as x91Result Namex93 , result 'Result' , count(result) as 'Count' FROM Results WHERE result == 'FAIL' AND x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 GROUP by x91Result Namex93 , result ORDER BY result DESC, count(result) DESC + +[FB9A8F6C6C6] +name = Error Details +parent = FB9A8F6C60E +type = errors +changed = 1729007832.3849218 +images = 1 +grouprn = 1 +groupet = 1 +sql = SELECT r.script_index || '_' || r.robot || '_' || r.iteration || '_' || r.sequence 'id' , r.result_name , r.script_index , r.robot , r.iteration , r.sequence , mt.SecondaryMetric 'script' , mt.MetricValue 'test_name' FROM Results r LEFT JOIN MetricData mt on mt.PrimaryMetric = r.script_index AND mt.MetricType = 'Scenario_Test' WHERE r.result = 'FAIL' AND r.end_time >= 1695874263 AND r.end_time <= 1695877212 ORDER BY x91idx93 ASC diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 17be6f7ec..36d685297 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -9212,7 +9212,7 @@ def cs_graph_update(self, _event=None): changes = 0 # start time - if "strST" in self.contentdata[pid]: + if "strST" in self.contentdata[pid] and "fST" in self.contentdata[pid]: st = self.contentdata[pid]["strST"].get() base.debugmsg(5, "st:", st) if st != self.contentdata[pid]["fST"]: @@ -9229,7 +9229,7 @@ def cs_graph_update(self, _event=None): self.contentdata[id]["fST"] = fST # end time - if "strET" in self.contentdata[pid]: + if "strET" in self.contentdata[pid] and "fET" in self.contentdata[pid]: et = self.contentdata[pid]["strET"].get() base.debugmsg(5, "et:", et) if et != self.contentdata[pid]["fET"]: From a7a8d70941b18be00e6e93b794d7cfd6b664cedc Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 02:39:19 +1000 Subject: [PATCH 10/35] Try to fix XMLSyntaxError error Issue #239 XMLSyntaxError: Opening and ending tag mismatch: img line 60 and div, line 60, column 20943 (file:/D:/a/rfswarm/rfswarm/Tests/Regression/Reporter/testdata/Issue-%23250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html, line 60) --- rfswarm_reporter/rfswarm_reporter.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 36d685297..00f4d9837 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -4286,6 +4286,10 @@ def xhtml_sections_embedimg(self, elmt, id, oimg): img = etree.SubElement(elmt, 'img') + img.set("id", id + "_img") + img.set("imgid", id) + img.text = "" + # Date: Wed, 16 Oct 2024 11:00:05 +1000 Subject: [PATCH 11/35] Put back original report file for 138 Issue #239 --- .../reporter_ubuntu_label_starttime.png | Bin 1287 -> 1264 bytes .../20230928_141103_OCDemo_Requests.report | 276 ++---------------- 2 files changed, 32 insertions(+), 244 deletions(-) diff --git a/Tests/Regression/Reporter/Images/file_method/reporter_ubuntu_label_starttime.png b/Tests/Regression/Reporter/Images/file_method/reporter_ubuntu_label_starttime.png index f8f44dbe5895845112ae5241014691ca6ee30c90..2df731d41f4298ca071ec05c07352bd119a3db3a 100644 GIT binary patch delta 1263 zcmVE!PrxZN`pfD%K1^TR8mTX4pI;zB*Fv557@>;OeA$+6r>g+ z5zz>p(3j>!8y*;)2%8`lA}g_&c(MW&wN@c>sI?B_eRx+he0gV<_&a)@YybPY{?~Ke z58QhsPN&nyE<1*h?KZGWaQUkTf2!B(xpwW^cH8))kOF-A^od)yZZSMO%+k^lN~My+ zhYzFE={S1yC;;W<<;2IwbLrBhpcMX9K99#E*4>E8%1SabGZ6$KD1LSdQh?gpTHd~W zOJidrhYlU$!-o$%fBu|>g@vFOTw7ZsG&J;=8o6AK)oK;*tyU`*i-qp)e{L}r9v)6a zL`2a2{q0C5CntSJjvS%2wUxrc!hoXs`g)!`dEytd*=#r*4!XL!n3Gl-SrFn&p>-ADoQ}fgM$B!SAm6gTl=qT;&?HlF`2EDz#?BBnif1aKmii?YBYHGq@ zFp!XtKyPm^r%#`zuC9*dxQ&=n(PMkOaz`lL^NJ~rGa{vDqDZr^yr?A`YI2;Zf4hMF-ox6AM za^=buii(OhT>S3cJ4_}MuU@^v?RJatxw$#NfyT$jZ($4mefEdb98riGchs2^z=0S{rz-wbdZ~yOGwD~ znX6PPUcP+E?CdOVw;Mqa*t>TxBO@aKxZQ4U+_KSt`Zp;$@%l= z(dl%eu%x7fy1F{foH>Kn>&0fXar5R)T3T8#nM^1Y3aYECdGX@KrV0nj7p#-+f2FFb z3PBKfMfmU`&CSgy6bh1(lF(|kqGoAniHV5`*4Nj!#p7m??0%fzS^U-Ca(DTe-GS~f Zz5%H^!$F2rzvKV_002ovPDHLkV1ktnbkYC- delta 1286 zcmV+h1^N2$35NC7^gN``6Bg$hDMgmj^#!X}2Oh~>ag@J|sD zA&y7`^Zz6pT`1iME)W%wrD!a=nSzF?vxqs=+Itc2;hkx(@5`n&_PILeIp5#&e1GTp z9r&GdBvz}{g&&_KV80Fc@h<)bfBQK82KzXFbb|{E3#qNG-ESMeHBx}jpFi{X@nZ%D z2U%KLLa9^|9UYBMrz1W-9)P^OJR&0_si>&%Na0`Qb2uDg-JK{XC?F{*2|*A%;>TB! z0+f}NF*`d;Wo0E{VPUMStS~w{%Hrap#|v(3Y;fSffnRFmaycfGNjx{1e@qySMmjq? z#aK{K5W&I09{1;KNT#NyTxZUlp`oFHtgNhUMYnI?=H<(mZn2@EAuJXP&z?Qw!-o$9 z1_q+hXsE2LBs4Ts)aB;pa^l1ZR##Uso6Vd(dlscqxoy6XkdSTbx3siiFc=sgA9srv z78Y{s*fI2ay;w`FR^xCue|Yuk6>_h?+`c)j$+}w=OXyoqQyY%<>qt$BB>-7u| z4~v?0_q^YS1gTX*jQW5|vm5S-;65B6yV~;iB9UwxfBXLZJMd%24lpne`zBsrSXjVj zvr$%7MqFGRp`oGTQ?VPi=G!mA!^4rwFn%eVq${#@89#{ z#S5N3eM(wd8UX=6)__W-;_chF%+Jqbx7!f}fkTH5fAQwc8vyKfJNNJ3-*w@w`Tkx= zd(FXv2g%RRr?Ih-j*bp&HXHBWy`!zIjo#i~QD-)r$({TN)9FNEPEHQx<>jQOr{i=w85$bm(W6Jy*Vkh(7*Hq_6c-mWHa51a z!rSHZT+~kbzjEu=Ed)WJy}g~fx;hjJ1u-!(Xti2Vv$V9t#KZ)fo16RM@&6+6|1R`x w{^)Pfe*PVQgMA!-gMA!-gMA!-gMFO80MiJ=OS@TqKmY&$07*qoM6N<$f{XZdP5=M^ diff --git a/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report b/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report index 8eb30163b..d621a25f8 100644 --- a/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report +++ b/Tests/Regression/Reporter/testdata/Issue-#138/20230928_141103_OCDemo_Requests/20230928_141103_OCDemo_Requests.report @@ -1,266 +1,54 @@ [Report] -order = FB9A8F6C3ED,FB9A8F6C406,FB9A8F6C420,FB9A8F6C462,FB9A8F6C48B,FB9A8F6C4F3,FB9A8F6C60E +order = F96CC319A38,F96CC319A3D,F96CC3282EB title = OCDemo Requests - -[FB9A8F6C3ED] -name = Information +showtlogo = -1 +dateformat = yyyy-mm-dd +timeformat = HH:MM +timezone = Australia/Brisbane +showstarttime = -1 +showendtime = -1 +font = Verdana +fontsize = 12 +percentile = 90 + +[F96CC319A38] +name = Template parent = TOP type = note -changed = 1729007811.0718975 -note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12 - Errors, gather error details and screenshots (if applicable) from robot logsx12x12Each section can also have sub sections.x12x12Use the arrows buttons to move sections up and down within the report.x12x12The cover page and overall report settings can be found on the settings pane of the Report item above.x12x12When you have your report how you like it, save it as a report template, so your future test results can use the same report format.x12x12 - -[FB9A8F6C406] -name = Table of Contents -parent = TOP -type = contents -changed = 1729007811.0750935 -mode = Table Of Contents -level = 2 - -[FB9A8F6C420] -name = Scenario Plan -parent = TOP -type = graph -changed = 1729007811.0755727 -order = FB9A8F6C42E - -[FB9A8F6C420L] -datatype = Plan -changed = 1729007817.0380068 -showtotal = 1 -sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' - -[FB9A8F6C420R] -datatype = None -changed = 1729007811.076515 - -[FB9A8F6C42E] -name = Scenario Detail -parent = FB9A8F6C420 -type = table -changed = 1729007818.0096607 -colours = 1 -datatype = Plan -col_index_show = 1 -col_robots_show = 1 -col_delay_show = 1 -col_ramp_up_show = 1 -col_run_show = 1 -col_script_show = 1 -col_script_opt = File -col_test_show = 1 -sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' +changed = 1714034531.3852513 +note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12x12Each section can also have sub sectionsx12x12The cover page and overall report settings can be found on the settings pane of the Report item abovex12 -[FB9A8F6C462] +[F96CC319A3D] name = Test Result Summary parent = TOP type = table -changed = 1729007819.0345929 +changed = 1728516305.4417443 colours = 0 datatype = ResultSummary -col_result_name_show = 1 -col_minimum_show = 0 -col_average_show = 1 -col_90x37ile_show = 1 -col_maximum_show = 1 -col_std_dev_show = 1 -col_pass_show = 1 -col_fail_show = 1 -col_other_show = 0 sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1695874263 AND r.end_time <= 1695877212 GROUP BY r.result_name ORDER BY x91Result Namex93 -[FB9A8F6C48B] -name = Robots vs Response Time -parent = TOP -type = graph -changed = 1729007811.0863962 -order = FB9A8F6C4A9,FB9A8F6C4B7 - -[FB9A8F6C48BL] -resulttype = Response Time -changed = 1729007821.8438196 -datatype = Result -sql = SELECT end_time as 'Time' , elapsed_time as 'Value' , result_name as x91Namex93 FROM Results WHERE x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 - -[FB9A8F6C48BR] -datatype = Metric -changed = 1729007821.8606243 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime - -[FB9A8F6C4A9] -name = Response Times -parent = FB9A8F6C48B -type = table -changed = 1729007823.1129255 -colours = 1 -datatype = Result -resulttype = Response Time -sql = SELECT result_name as x91Result Namex93 , round(min(elapsed_time),3) 'Minimum' , round(avg(elapsed_time),3) 'Average' , round(percentile(elapsed_time, 90),3) '90x37ile' , round(max(elapsed_time),3) 'Maximum' , round(stdev(elapsed_time),3) 'Std. Dev.' , count(result) as 'Count' FROM Results WHERE x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 GROUP by x91Result Namex93 - -[FB9A8F6C4B7] +[F96CC3282EB] name = Robots -parent = FB9A8F6C48B -type = table -changed = 1729007827.998625 -colours = 1 -datatype = Metric -metrictype = Scenario -secondarymetric = total_robots -isnumeric = 1 -showcount = 1 -col_primarymetric_show = 1 -col_minimum_show = 0 -col_average_show = 0 -col_90x37ile_show = 0 -col_maximum_show = 1 -col_std_dev_show = 0 -col_maximum = Robots -sql = SELECT PrimaryMetric , PrimaryMetric as x91Colourx93 , min(CAST(MetricValue AS NUMERIC)) AS 'Minimum' , round(avg(CAST(MetricValue AS NUMERIC)),3) AS 'Average' , round(percentile(CAST(MetricValue AS NUMERIC), 90),3) AS '90x37ile' , max(CAST(MetricValue AS NUMERIC)) AS 'Maximum' , round(stdev(CAST(MetricValue AS NUMERIC)),3) AS 'Std. Dev.' FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 GROUP by PrimaryMetric - -[FB9A8F6C4F3] -name = Agents parent = TOP -type = head -changed = 1729007811.0967772 -order = FB9A8F6C4FA,FB9A8F6C538,FB9A8F6C586,FB9A8F6C5BA - -[FB9A8F6C4FA] -name = Agent CPU Usage -parent = FB9A8F6C4F3 type = graph -changed = 1729007811.0980453 - -[FB9A8F6C4FAL] -metrictype = Agent -changed = 1729007827.4941306 -axisen = 1 -datatype = Metric -secondarymetric = CPU -enablefilteragent = 1 -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime +changed = 1714034594.8325248 -[FB9A8F6C4FAR] -datatype = Metric -changed = 1729007827.4949844 -axisen = 1 -metrictype = Scenario +[F96CC3282EBL] secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime - -[FB9A8F6C538] -name = Agent Memory (RAM) Usage -parent = FB9A8F6C4F3 -type = graph -changed = 1729007811.103636 - -[FB9A8F6C538L] -metrictype = Agent -changed = 1729007831.166079 -axisen = 1 -datatype = Metric -secondarymetric = MEM -enablefilteragent = 1 -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'MEM' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime - -[FB9A8F6C538R] +changed = 1728516306.583407 +filteragent = None +filtertype = None datatype = Metric -changed = 1729007831.1664815 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime - -[FB9A8F6C586] -name = Agent Names -parent = FB9A8F6C4F3 -type = table -changed = 1729007835.3977072 -colours = 1 -datatype = Metric -metrictype = Agent -col_primarymetric_show = 0 -col_metrictype_show = 1 -col_secondarymetric_show = 1 -col_metricvalue_show = 0 -enablefilteragent = 1 -secondarymetric = CPU -col_agent_show = 1 -sql = SELECT PrimaryMetric , DataSource 'Agent' , PrimaryMetric || ' - ' || DataSource as x91Colourx93 , MetricValue FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 GROUP by PrimaryMetric , DataSource - -[FB9A8F6C5BA] -name = Agent Details -parent = FB9A8F6C4F3 -type = table -changed = 1729007836.9755812 -colours = 0 -datatype = Metric -metrictype = Metric -col_primarymetric_show = 1 -col_metrictype_show = 1 -col_secondarymetric_show = 1 -col_metricvalue_show = 1 -enablefilteragent = 1 -col_agent_show = 0 -col_primarymetric = Agent Name -col_secondarymetric = Metric Name -col_metricvalue = Metric Value -sql = SELECT PrimaryMetric , SecondaryMetric , DataSource 'Agent' , MetricValue FROM MetricData WHERE MetricType == 'Metric' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 GROUP by PrimaryMetric , SecondaryMetric , DataSource - -[FB9A8F6C60E] -name = Errors -parent = TOP -type = head -changed = 1729007811.1255562 -order = FB9A8F6C61C,FB9A8F6C670,FB9A8F6C6C6 - -[FB9A8F6C61C] -name = Failed Keywords Graph -parent = FB9A8F6C60E -type = graph -changed = 1729007811.1267478 - -[FB9A8F6C61CL] +metrictype = Scenario axisen = 1 -changed = 1729007827.33468 -resulttype = TPS -filterresult = Fail -datatype = Result -enablefilterresult = 1 -sql = SELECT floor(end_time) as 'Time' , count(result) as 'Value' , result_name as x91Namex93 FROM Results WHERE result == 'FAIL' AND x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 GROUP by floor(end_time) , result_name , result ORDER by floor(end_time), result DESC, count(result) DESC -[FB9A8F6C61CR] +[F96CC3282EBR] datatype = Metric -changed = 1729007827.3359115 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime - -[FB9A8F6C670] -name = Failed Keywords Names -parent = FB9A8F6C60E -type = table -changed = 1729007831.16401 -colours = 1 -datatype = Result -resulttype = TPS -filterresult = Fail -enablefilterresult = 1 -col_result_name_show = 1 -col_result_show = 1 -col_count_show = 1 -sql = SELECT result_name as x91Result Namex93 , result 'Result' , count(result) as 'Count' FROM Results WHERE result == 'FAIL' AND x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1695874263 AND end_time <= 1695877212 GROUP by x91Result Namex93 , result ORDER BY result DESC, count(result) DESC - -[FB9A8F6C6C6] -name = Error Details -parent = FB9A8F6C60E -type = errors -changed = 1729007832.3849218 -images = 1 -grouprn = 1 -groupet = 1 -sql = SELECT r.script_index || '_' || r.robot || '_' || r.iteration || '_' || r.sequence 'id' , r.result_name , r.script_index , r.robot , r.iteration , r.sequence , mt.SecondaryMetric 'script' , mt.MetricValue 'test_name' FROM Results r LEFT JOIN MetricData mt on mt.PrimaryMetric = r.script_index AND mt.MetricType = 'Scenario_Test' WHERE r.result = 'FAIL' AND r.end_time >= 1695874263 AND r.end_time <= 1695877212 ORDER BY x91idx93 ASC - +changed = 1728516306.5845017 +axisen = 0 +metrictype = Agent +filteragent = None +filtertype = None +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'Robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime +secondarymetric = Robots From 8bd99b201b8029322f31f4e915533d8f49cc3284 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 11:07:44 +1000 Subject: [PATCH 12/35] Use old template for issue 140 tests Issue #239 --- .../20230728_130340_Odoo-demo.report | 55 +++++++++++++++++++ .../Reporter/testdata/Issue-#140/old.template | 55 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report create mode 100644 Tests/Regression/Reporter/testdata/Issue-#140/old.template diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report b/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report new file mode 100644 index 000000000..db84d7139 --- /dev/null +++ b/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report @@ -0,0 +1,55 @@ +[Report] +order = F96CC319A38,F96CC319A3D,F96CC3282EB +title = OCDemo Requests +showtlogo = -1 +dateformat = yyyy-mm-dd +timeformat = HH:MM +timezone = Australia/Brisbane +showstarttime = -1 +showendtime = -1 +font = Verdana +fontsize = 12 +percentile = 90 + +[F96CC319A38] +name = Template +parent = TOP +type = note +changed = 1729040753.6470456 +note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12x12Each section can also have sub sectionsx12x12The cover page and overall report settings can be found on the settings pane of the Report item abovex12 + +[F96CC319A3D] +name = Test Result Summary +parent = TOP +type = table +changed = 1729040757.134148 +colours = 0 +datatype = ResultSummary +sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 + +[F96CC3282EB] +name = Robots +parent = TOP +type = graph +changed = 1729040753.6514955 + +[F96CC3282EBL] +secondarymetric = total_robots +changed = 1729040768.8740733 +filteragent = None +filtertype = None +datatype = Metric +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime +metrictype = Scenario +axisen = 1 + +[F96CC3282EBR] +datatype = Metric +changed = 1729040768.8795738 +axisen = 0 +metrictype = Agent +filteragent = None +filtertype = None +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'Robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime +secondarymetric = Robots + diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/old.template b/Tests/Regression/Reporter/testdata/Issue-#140/old.template new file mode 100644 index 000000000..5837a6617 --- /dev/null +++ b/Tests/Regression/Reporter/testdata/Issue-#140/old.template @@ -0,0 +1,55 @@ +[Report] +order = F96CC319A38,F96CC319A3D,F96CC3282EB +title = OCDemo Requests +showtlogo = -1 +dateformat = yyyy-mm-dd +timeformat = HH:MM +timezone = Australia/Brisbane +showstarttime = -1 +showendtime = -1 +font = Verdana +fontsize = 12 +percentile = 90 + +[F96CC319A38] +name = Template +parent = TOP +type = note +changed = 1714034531.3852513 +note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12x12Each section can also have sub sectionsx12x12The cover page and overall report settings can be found on the settings pane of the Report item abovex12 + +[F96CC319A3D] +name = Test Result Summary +parent = TOP +type = table +changed = 1728516305.4417443 +colours = 0 +datatype = ResultSummary +sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1695874263 AND r.end_time <= 1695877212 GROUP BY r.result_name ORDER BY x91Result Namex93 + +[F96CC3282EB] +name = Robots +parent = TOP +type = graph +changed = 1714034594.8325248 + +[F96CC3282EBL] +secondarymetric = total_robots +changed = 1728516306.583407 +filteragent = None +filtertype = None +datatype = Metric +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime +metrictype = Scenario +axisen = 1 + +[F96CC3282EBR] +datatype = Metric +changed = 1728516306.5845017 +axisen = 0 +metrictype = Agent +filteragent = None +filtertype = None +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'Robots' AND MetricTime >= 1695874263 AND MetricTime <= 1695877212 ORDER BY MetricTime +secondarymetric = Robots + From 1854a350d9e66489df3625528648c174a166255a Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 12:09:55 +1000 Subject: [PATCH 13/35] Tuning test data Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 2 +- Tests/Regression/Reporter/GUI_Features.robot | 9 ++- .../20230728_130340_Odoo-demo.report | 55 ------------------- .../testdata/Issue-#140/RFSwarmReporter.ini | 2 +- .../{old.template => original_base.template} | 0 5 files changed, 8 insertions(+), 60 deletions(-) delete mode 100644 Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report rename Tests/Regression/Reporter/testdata/Issue-#140/{old.template => original_base.template} (100%) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index fab4ac4b2..a3829e7f4 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -260,7 +260,7 @@ Template with Start and End Dates Save Template File OS DIALOG ${templatename} Click Button GenerateHTML - Wait For Status GeneratingXHTMLReport + # Wait For Status GeneratingXHTMLReport Wait For Status SavedXHTMLReport Sleep 1 Close GUI diff --git a/Tests/Regression/Reporter/GUI_Features.robot b/Tests/Regression/Reporter/GUI_Features.robot index d9bf03695..dfd418b5b 100644 --- a/Tests/Regression/Reporter/GUI_Features.robot +++ b/Tests/Regression/Reporter/GUI_Features.robot @@ -186,12 +186,13 @@ Verify Plan Graph - No Total Log to console basefolder: ${basefolder} console=True ${resultfolder}= Set Variable ${basefolder}${/}${resultdata} ${resultfile}= Set Variable ${basefolder}${/}${resultdata}${/}${resultdata}.report + ${templatefile}= Set Variable ${basefolder}${/}original_base.template Should Exist ${resultfolder} Log resultfolder: ${resultfolder} console=True Should Not Exist ${resultfile} # pass a default ini file with extended height to ensure that default values are used - Open GUI -d ${resultfolder} -i ${basefolder}${/}RFSwarmReporter.ini + Open GUI -d ${resultfolder} -i ${basefolder}${/}RFSwarmReporter.ini -t ${templatefile} # Run Keyword And Continue On Failure Wait For Status PreviewLoaded 120 Wait For Status PreviewLoaded @@ -249,12 +250,13 @@ Verify Plan Graph - With Total Log to console basefolder: ${basefolder} console=True ${resultfolder}= Set Variable ${basefolder}${/}${resultdata} ${resultfile}= Set Variable ${basefolder}${/}${resultdata}${/}${resultdata}.report + ${templatefile}= Set Variable ${basefolder}${/}original_base.template Should Exist ${resultfolder} Log resultfolder: ${resultfolder} console=True Should Not Exist ${resultfile} # pass a default ini file with extended height to ensure that default values are used - Open GUI -d ${resultfolder} -i ${basefolder}${/}RFSwarmReporter.ini + Open GUI -d ${resultfolder} -i ${basefolder}${/}RFSwarmReporter.ini -t ${templatefile} # Run Keyword And Continue On Failure Wait For Status PreviewLoaded 120 Wait For Status PreviewLoaded @@ -315,12 +317,13 @@ Verify Plan Table Log to console basefolder: ${basefolder} console=True ${resultfolder}= Set Variable ${basefolder}${/}${resultdata} ${resultfile}= Set Variable ${basefolder}${/}${resultdata}${/}${resultdata}.report + ${templatefile}= Set Variable ${basefolder}${/}original_base.template Should Exist ${resultfolder} Log resultfolder: ${resultfolder} console=True Should Not Exist ${resultfile} # pass a default ini file with extended height to ensure that default values are used - Open GUI -d ${resultfolder} -i ${basefolder}${/}RFSwarmReporter.ini + Open GUI -d ${resultfolder} -i ${basefolder}${/}RFSwarmReporter.ini -t ${templatefile} # Run Keyword And Continue On Failure Wait For Status PreviewLoaded 120 Wait For Status PreviewLoaded diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report b/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report deleted file mode 100644 index db84d7139..000000000 --- a/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report +++ /dev/null @@ -1,55 +0,0 @@ -[Report] -order = F96CC319A38,F96CC319A3D,F96CC3282EB -title = OCDemo Requests -showtlogo = -1 -dateformat = yyyy-mm-dd -timeformat = HH:MM -timezone = Australia/Brisbane -showstarttime = -1 -showendtime = -1 -font = Verdana -fontsize = 12 -percentile = 90 - -[F96CC319A38] -name = Template -parent = TOP -type = note -changed = 1729040753.6470456 -note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12x12Each section can also have sub sectionsx12x12The cover page and overall report settings can be found on the settings pane of the Report item abovex12 - -[F96CC319A3D] -name = Test Result Summary -parent = TOP -type = table -changed = 1729040757.134148 -colours = 0 -datatype = ResultSummary -sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 - -[F96CC3282EB] -name = Robots -parent = TOP -type = graph -changed = 1729040753.6514955 - -[F96CC3282EBL] -secondarymetric = total_robots -changed = 1729040768.8740733 -filteragent = None -filtertype = None -datatype = Metric -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime -metrictype = Scenario -axisen = 1 - -[F96CC3282EBR] -datatype = Metric -changed = 1729040768.8795738 -axisen = 0 -metrictype = Agent -filteragent = None -filtertype = None -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'Robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime -secondarymetric = Robots - diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/RFSwarmReporter.ini b/Tests/Regression/Reporter/testdata/Issue-#140/RFSwarmReporter.ini index f1e3f0dba..467fabfa1 100644 --- a/Tests/Regression/Reporter/testdata/Issue-#140/RFSwarmReporter.ini +++ b/Tests/Regression/Reporter/testdata/Issue-#140/RFSwarmReporter.ini @@ -3,7 +3,7 @@ win_width = 1000 win_height = 600 [Reporter] -template = +template = original_base.template resultdir = templatedir = results = diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/old.template b/Tests/Regression/Reporter/testdata/Issue-#140/original_base.template similarity index 100% rename from Tests/Regression/Reporter/testdata/Issue-#140/old.template rename to Tests/Regression/Reporter/testdata/Issue-#140/original_base.template From 0d6adc9c5f16ce227789c97d77ba44d1563a2c47 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 14:12:22 +1000 Subject: [PATCH 14/35] try using etree html parser Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index a3829e7f4..680939220 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -284,7 +284,10 @@ Template with Start and End Dates Copy Files ${resultfolder1}/*.report ${testresultfolder1} Copy Files ${resultfolder1}/*.html ${testresultfolder1} - ${html}= Parse XML ${resultfolder1}${/}${resultdata1}.html + # ${html}= Parse XML ${resultfolder1}${/}${resultdata1}.html + # import lxml.etree + # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) + ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table FOR ${index} ${item} IN ENUMERATE @{expected} From 9d35990592925f187ce5feb92f02a9249e426dfa Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 16:17:36 +1000 Subject: [PATCH 15/35] Missed the other Parse XML call Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index 680939220..93dbf4013 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -268,7 +268,10 @@ Template with Start and End Dates Copy Files ${resultfolder0}/*.report ${testresultfolder0} Copy Files ${resultfolder0}/*.html ${testresultfolder0} - ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html + # ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html + # import lxml.etree + # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) + ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table ${expected}= Get Elements Texts ${table} tr/td[1] @@ -285,8 +288,6 @@ Template with Start and End Dates Copy Files ${resultfolder1}/*.html ${testresultfolder1} # ${html}= Parse XML ${resultfolder1}${/}${resultdata1}.html - # import lxml.etree - # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table From ff3099ea644944559c8f442db1a4aa53b95c7d9e Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 17:18:28 +1000 Subject: [PATCH 16/35] try with from string Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index 93dbf4013..6f4a8c514 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -271,7 +271,9 @@ Template with Start and End Dates # ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html # import lxml.etree # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) - ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree + # ${html}= Evaluate lxml.etree.parse("${resultfolder0}${/}${resultdata0}.html", lxml.etree.HTMLParser()) modules=lxml.etree + ${rawhtml}= Get File ${resultfolder0}${/}${resultdata0}.html + ${html}= Evaluate lxml.etree.fromstring(${rawhtml}, lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table ${expected}= Get Elements Texts ${table} tr/td[1] @@ -288,7 +290,9 @@ Template with Start and End Dates Copy Files ${resultfolder1}/*.html ${testresultfolder1} # ${html}= Parse XML ${resultfolder1}${/}${resultdata1}.html - ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree + # ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree + ${rawhtml}= Get File ${resultfolder1}${/}${resultdata1}.html + ${html}= Evaluate lxml.etree.fromstring(${rawhtml}, lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table FOR ${index} ${item} IN ENUMERATE @{expected} From cc7b0675ad8126eafa5997c7a3cddc528a06ee67 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 18:14:35 +1000 Subject: [PATCH 17/35] Try quotes around html data Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index 6f4a8c514..b6c8ae999 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -273,7 +273,7 @@ Template with Start and End Dates # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) # ${html}= Evaluate lxml.etree.parse("${resultfolder0}${/}${resultdata0}.html", lxml.etree.HTMLParser()) modules=lxml.etree ${rawhtml}= Get File ${resultfolder0}${/}${resultdata0}.html - ${html}= Evaluate lxml.etree.fromstring(${rawhtml}, lxml.etree.HTMLParser()) modules=lxml.etree + ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table ${expected}= Get Elements Texts ${table} tr/td[1] @@ -292,7 +292,7 @@ Template with Start and End Dates # ${html}= Parse XML ${resultfolder1}${/}${resultdata1}.html # ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree ${rawhtml}= Get File ${resultfolder1}${/}${resultdata1}.html - ${html}= Evaluate lxml.etree.fromstring(${rawhtml}, lxml.etree.HTMLParser()) modules=lxml.etree + ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table FOR ${index} ${item} IN ENUMERATE @{expected} From 30d1af8300a0e20830f9223c968186954d0447b3 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 19:48:21 +1000 Subject: [PATCH 18/35] try this way --- Tests/Regression/Reporter/GUI_Bugs.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index b6c8ae999..dd6f2802b 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -271,9 +271,9 @@ Template with Start and End Dates # ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html # import lxml.etree # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) - # ${html}= Evaluate lxml.etree.parse("${resultfolder0}${/}${resultdata0}.html", lxml.etree.HTMLParser()) modules=lxml.etree - ${rawhtml}= Get File ${resultfolder0}${/}${resultdata0}.html - ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree + ${html}= Evaluate lxml.etree.parse("${resultfolder0}${/}${resultdata0}.html", lxml.etree.HTMLParser()) modules=lxml.etree + # ${rawhtml}= Get File ${resultfolder0}${/}${resultdata0}.html + # ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table ${expected}= Get Elements Texts ${table} tr/td[1] From 79822ef6b2f0850763757ab7941464407c01f9b5 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 20:45:03 +1000 Subject: [PATCH 19/35] try a raw string --- Tests/Regression/Reporter/GUI_Bugs.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index dd6f2802b..0885be165 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -271,7 +271,7 @@ Template with Start and End Dates # ${html}= Parse XML ${resultfolder0}${/}${resultdata0}.html # import lxml.etree # tree = lxml.etree.parse("/home/dave/Downloads/Reporter-windows-latest-3.11/Issue-#250/20240626_130059_jpetstore-nomon-quick/20240626_130059_jpetstore-nomon-quick.html", lxml.etree.HTMLParser()) - ${html}= Evaluate lxml.etree.parse("${resultfolder0}${/}${resultdata0}.html", lxml.etree.HTMLParser()) modules=lxml.etree + ${html}= Evaluate lxml.etree.parse(r'${resultfolder0}${/}${resultdata0}.html', lxml.etree.HTMLParser()) modules=lxml.etree # ${rawhtml}= Get File ${resultfolder0}${/}${resultdata0}.html # ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. From a22abd38e7243e3dc8ec602226cb581071f0ae94 Mon Sep 17 00:00:00 2001 From: damies13 Date: Wed, 16 Oct 2024 23:34:38 +1000 Subject: [PATCH 20/35] Hopefully this fixes test case Template with Start and End Dates Issue #239 --- Tests/Regression/Reporter/GUI_Bugs.robot | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Bugs.robot b/Tests/Regression/Reporter/GUI_Bugs.robot index 0885be165..617c254b6 100644 --- a/Tests/Regression/Reporter/GUI_Bugs.robot +++ b/Tests/Regression/Reporter/GUI_Bugs.robot @@ -274,8 +274,11 @@ Template with Start and End Dates ${html}= Evaluate lxml.etree.parse(r'${resultfolder0}${/}${resultdata0}.html', lxml.etree.HTMLParser()) modules=lxml.etree # ${rawhtml}= Get File ${resultfolder0}${/}${resultdata0}.html # ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree - ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. - ${table}= Get Element ${html} .//div[@id='${sectionid}']//table + # ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. + # ${sectionid}= Get Element Attribute ${html} id .//h1[text()='4 Test Result Summary']/.. + ${sectionid}= Get Element Attribute ${html} id //h1[contains(text(), 'Test Result Summary')]/.. + # FB9D1A0486F //div[@id='FB9D1A0486F']//table + ${table}= Get Element ${html} //div[@id='${sectionid}']//table ${expected}= Get Elements Texts ${table} tr/td[1] Log To Console Open Reporter with resultfolder1 and check template works @@ -291,9 +294,11 @@ Template with Start and End Dates # ${html}= Parse XML ${resultfolder1}${/}${resultdata1}.html # ${html}= Evaluate lxml.etree.parse("${resultfolder1}${/}${resultdata1}.html", lxml.etree.HTMLParser()) modules=lxml.etree - ${rawhtml}= Get File ${resultfolder1}${/}${resultdata1}.html - ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree - ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. + ${html}= Evaluate lxml.etree.parse(r'${resultfolder1}${/}${resultdata1}.html', lxml.etree.HTMLParser()) modules=lxml.etree + # ${rawhtml}= Get File ${resultfolder1}${/}${resultdata1}.html + # ${html}= Evaluate lxml.etree.fromstring('${rawhtml}', lxml.etree.HTMLParser()) modules=lxml.etree + # ${sectionid}= Get Element Attribute ${html} id .//h1[text()='2 Test Result Summary']/.. + ${sectionid}= Get Element Attribute ${html} id //h1[contains(text(), 'Test Result Summary')]/.. ${table}= Get Element ${html} .//div[@id='${sectionid}']//table FOR ${index} ${item} IN ENUMERATE @{expected} ${row}= Evaluate ${index} + 2 From 59d378c5750e3877488b3b878611785c0a1dfe63 Mon Sep 17 00:00:00 2001 From: damies13 Date: Thu, 17 Oct 2024 18:23:30 +1000 Subject: [PATCH 21/35] try lower confidence for now Issue #239 --- Tests/Regression/Reporter/GUI_Features.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Regression/Reporter/GUI_Features.robot b/Tests/Regression/Reporter/GUI_Features.robot index dfd418b5b..75ee1c0ef 100644 --- a/Tests/Regression/Reporter/GUI_Features.robot +++ b/Tests/Regression/Reporter/GUI_Features.robot @@ -228,7 +228,7 @@ Verify Plan Graph - No Total # Take A Screenshot - Set Confidence 0.7 + Set Confidence 0.5 Locate reporter_${platform}_graph_plannototal.png Set Confidence 0.9 @@ -297,7 +297,7 @@ Verify Plan Graph - With Total # Take A Screenshot - Set Confidence 0.7 + Set Confidence 0.5 Locate reporter_${platform}_graph_plantotal.png Set Confidence 0.9 @@ -364,7 +364,7 @@ Verify Plan Table Take A Screenshot - Set Confidence 0.7 + Set Confidence 0.5 Locate reporter_${platform}_table_plan.png Set Confidence 0.9 From ee80365bf019662d4b9cb90a5f64b5e98231d794 Mon Sep 17 00:00:00 2001 From: damies13 Date: Thu, 17 Oct 2024 18:40:29 +1000 Subject: [PATCH 22/35] ensure utf-8 display's correctly on html files --- rfswarm_reporter/rfswarm_reporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 00f4d9837..ad0e66c8d 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -4161,7 +4161,7 @@ def xhtml_base_doc(self): M = ElementMaker(namespace=None, nsmap={None: "http://www.w3.org/1999/xhtml"}) # html = M.html(E.head(E.title("Test page")), E.body(E.p("Hello world"))) - html = M.html(E.head(E.title("Test page")), E.body()) + html = M.html(E.head(E.title("Test page"), E.meta(charset="utf-8")), E.body()) return html From 7973bb17209c9171f090063d2695badd7741f013 Mon Sep 17 00:00:00 2001 From: damies13 Date: Fri, 18 Oct 2024 09:57:49 +1000 Subject: [PATCH 23/35] back to 0.7 with some different images Issue #239 Hopefully less fails on macos --- Tests/Regression/Reporter/GUI_Features.robot | 6 +- .../reporter_macos_graph_plannototal.png | Bin 12835 -> 12607 bytes .../file_method/reporter_macos_table_plan.png | Bin 10341 -> 10239 bytes .../20230728_130340_Odoo-demo.report | 322 ++++++++++++++++++ 4 files changed, 325 insertions(+), 3 deletions(-) create mode 100644 Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report diff --git a/Tests/Regression/Reporter/GUI_Features.robot b/Tests/Regression/Reporter/GUI_Features.robot index 75ee1c0ef..dfd418b5b 100644 --- a/Tests/Regression/Reporter/GUI_Features.robot +++ b/Tests/Regression/Reporter/GUI_Features.robot @@ -228,7 +228,7 @@ Verify Plan Graph - No Total # Take A Screenshot - Set Confidence 0.5 + Set Confidence 0.7 Locate reporter_${platform}_graph_plannototal.png Set Confidence 0.9 @@ -297,7 +297,7 @@ Verify Plan Graph - With Total # Take A Screenshot - Set Confidence 0.5 + Set Confidence 0.7 Locate reporter_${platform}_graph_plantotal.png Set Confidence 0.9 @@ -364,7 +364,7 @@ Verify Plan Table Take A Screenshot - Set Confidence 0.5 + Set Confidence 0.7 Locate reporter_${platform}_table_plan.png Set Confidence 0.9 diff --git a/Tests/Regression/Reporter/Images/file_method/reporter_macos_graph_plannototal.png b/Tests/Regression/Reporter/Images/file_method/reporter_macos_graph_plannototal.png index c64d53afcc0060fafa3032b166df39808fb09094..5b995610025007568f55a2408014df593c387458 100644 GIT binary patch literal 12607 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 Of<>|N(vSV0s;a`4RzRK0)k6z;8&20 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 diff --git a/Tests/Regression/Reporter/Images/file_method/reporter_macos_table_plan.png b/Tests/Regression/Reporter/Images/file_method/reporter_macos_table_plan.png index 55638792f51dcb29a0f9cce214c976a119dd13e2..2eab03c8f240bedc7c15f855c189adc4fe9c3f3f 100644 GIT binary patch literal 10239 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 HzW4tC%hB)V diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report b/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report new file mode 100644 index 000000000..f037c6f08 --- /dev/null +++ b/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report @@ -0,0 +1,322 @@ +[Report] +order = FBA1FC42589,FBA1FC425B1,FBA1FC425CF,FBA1FC425F2,FBA1FC4260B,FBA1FC42643,FBA1FC4270C,FBA1FC9F068 +title = Odoo-demo + +[FBA1FC42589] +name = Information +parent = TOP +type = note +changed = 1729207128.2095497 +note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12 - Errors, gather error details and screenshots (if applicable) from robot logsx12x12Each section can also have sub sections.x12x12Use the arrows buttons to move sections up and down within the report.x12x12The cover page and overall report settings can be found on the settings pane of the Report item above.x12x12When you have your report how you like it, save it as a report template, so your future test results can use the same report format.x12x12 + +[FBA1FC425B1] +name = Table of Contents +parent = TOP +type = contents +changed = 1729207128.212583 +mode = Table Of Contents +level = 2 + +[FBA1FC425CF] +name = Scenario Plan +parent = TOP +type = graph +changed = 1729207128.2129602 +order = FBA1FC425DA + +[FBA1FC425CFL] +datatype = Plan +changed = 1729207133.3159962 +showtotal = 1 +sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' + +[FBA1FC425CFR] +datatype = None +changed = 1729207128.213741 + +[FBA1FC425DA] +name = Scenario Detail +parent = FBA1FC425CF +type = table +changed = 1729207134.1116896 +colours = 1 +datatype = Plan +col_index_show = 1 +col_robots_show = 1 +col_delay_show = 1 +col_ramp_up_show = 1 +col_run_show = 1 +col_script_show = 1 +col_script_opt = File +col_test_show = 1 +sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' + +[FBA1FC425F2] +name = Test Result Summary +parent = TOP +type = table +changed = 1729207135.1513717 +colours = 0 +datatype = ResultSummary +col_result_name_show = 1 +col_minimum_show = 0 +col_average_show = 1 +col_90x37ile_show = 1 +col_maximum_show = 1 +col_std_dev_show = 1 +col_pass_show = 1 +col_fail_show = 1 +col_other_show = 0 +sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 + +[FBA1FC4260B] +name = Robots vs Response Time +parent = TOP +type = graph +changed = 1729207128.2190537 +order = FBA1FC42620,FBA1FC42629 + +[FBA1FC4260BL] +resulttype = Response Time +changed = 1729207140.9593716 +datatype = Result +sql = SELECT end_time as 'Time' , elapsed_time as 'Value' , result_name as x91Namex93 FROM Results WHERE x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 + +[FBA1FC4260BR] +datatype = Metric +changed = 1729207140.9600563 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime + +[FBA1FC42620] +name = Response Times +parent = FBA1FC4260B +type = table +changed = 1729207142.4149766 +colours = 1 +datatype = Result +resulttype = Response Time +sql = SELECT result_name as x91Result Namex93 , round(min(elapsed_time),3) 'Minimum' , round(avg(elapsed_time),3) 'Average' , round(percentile(elapsed_time, 90),3) '90x37ile' , round(max(elapsed_time),3) 'Maximum' , round(stdev(elapsed_time),3) 'Std. Dev.' , count(result) as 'Count' FROM Results WHERE x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 GROUP by x91Result Namex93 + +[FBA1FC42629] +name = Robots +parent = FBA1FC4260B +type = table +changed = 1729207149.0225883 +colours = 1 +datatype = Metric +metrictype = Scenario +secondarymetric = total_robots +isnumeric = 1 +showcount = 1 +col_primarymetric_show = 1 +col_minimum_show = 0 +col_average_show = 0 +col_90x37ile_show = 0 +col_maximum_show = 1 +col_std_dev_show = 0 +col_maximum = Robots +sql = SELECT PrimaryMetric , PrimaryMetric as x91Colourx93 , min(CAST(MetricValue AS NUMERIC)) AS 'Minimum' , round(avg(CAST(MetricValue AS NUMERIC)),3) AS 'Average' , round(percentile(CAST(MetricValue AS NUMERIC), 90),3) AS '90x37ile' , max(CAST(MetricValue AS NUMERIC)) AS 'Maximum' , round(stdev(CAST(MetricValue AS NUMERIC)),3) AS 'Std. Dev.' FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 GROUP by PrimaryMetric + +[FBA1FC42643] +name = Agents +parent = TOP +type = head +changed = 1729207128.2245998 +order = FBA1FC42648,FBA1FC42673,FBA1FC426A0,FBA1FC426E0 + +[FBA1FC42648] +name = Agent CPU Usage +parent = FBA1FC42643 +type = graph +changed = 1729207128.2251222 + +[FBA1FC42648L] +metrictype = Agent +changed = 1729207150.4900742 +axisen = 1 +datatype = Metric +secondarymetric = CPU +enablefilteragent = 1 +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime + +[FBA1FC42648R] +datatype = Metric +changed = 1729207150.4907668 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime + +[FBA1FC42673] +name = Agent Memory (RAM) Usage +parent = FBA1FC42643 +type = graph +changed = 1729207128.2294397 + +[FBA1FC42673L] +metrictype = Agent +changed = 1729207151.736342 +axisen = 1 +datatype = Metric +secondarymetric = MEM +enablefilteragent = 1 +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'MEM' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime + +[FBA1FC42673R] +datatype = Metric +changed = 1729207151.7370005 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime + +[FBA1FC426A0] +name = Agent Names +parent = FBA1FC42643 +type = table +changed = 1729207153.1845224 +colours = 1 +datatype = Metric +metrictype = Agent +col_primarymetric_show = 0 +col_metrictype_show = 1 +col_secondarymetric_show = 1 +col_metricvalue_show = 0 +enablefilteragent = 1 +secondarymetric = CPU +col_agent_show = 1 +sql = SELECT PrimaryMetric , DataSource 'Agent' , PrimaryMetric || ' - ' || DataSource as x91Colourx93 , MetricValue FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 GROUP by PrimaryMetric , DataSource + +[FBA1FC426E0] +name = Agent Details +parent = FBA1FC42643 +type = table +changed = 1729207153.8578005 +colours = 0 +datatype = Metric +metrictype = Metric +col_primarymetric_show = 1 +col_metrictype_show = 1 +col_secondarymetric_show = 1 +col_metricvalue_show = 1 +enablefilteragent = 1 +col_agent_show = 0 +col_primarymetric = Agent Name +col_secondarymetric = Metric Name +col_metricvalue = Metric Value +sql = SELECT PrimaryMetric , SecondaryMetric , DataSource 'Agent' , MetricValue FROM MetricData WHERE MetricType == 'Metric' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 GROUP by PrimaryMetric , SecondaryMetric , DataSource + +[FBA1FC4270C] +name = Errors +parent = TOP +type = head +changed = 1729207128.2447739 +order = FBA1FC42712,FBA1FC42740,FBA1FC42760 + +[FBA1FC42712] +name = Failed Keywords Graph +parent = FBA1FC4270C +type = graph +changed = 1729207128.245397 + +[FBA1FC42712L] +axisen = 1 +changed = 1729207154.973766 +resulttype = TPS +filterresult = Fail +datatype = Result +enablefilterresult = 1 +sql = SELECT floor(end_time) as 'Time' , count(result) as 'Value' , result_name as x91Namex93 FROM Results WHERE result == 'FAIL' AND x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 GROUP by floor(end_time) , result_name , result ORDER by floor(end_time), result DESC, count(result) DESC + +[FBA1FC42712R] +datatype = Metric +changed = 1729207154.9744375 +axisen = 1 +metrictype = Scenario +secondarymetric = total_robots +sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime + +[FBA1FC42740] +name = Failed Keywords Names +parent = FBA1FC4270C +type = table +changed = 1729207156.2536037 +colours = 1 +datatype = Result +resulttype = TPS +filterresult = Fail +enablefilterresult = 1 +col_result_name_show = 1 +col_result_show = 1 +col_count_show = 1 +sql = SELECT result_name as x91Result Namex93 , result 'Result' , count(result) as 'Count' FROM Results WHERE result == 'FAIL' AND x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 GROUP by x91Result Namex93 , result ORDER BY result DESC, count(result) DESC + +[FBA1FC42760] +name = Error Details +parent = FBA1FC4270C +type = errors +changed = 1729207156.7935834 +images = 1 +grouprn = 1 +groupet = 1 +sql = SELECT r.script_index || '_' || r.robot || '_' || r.iteration || '_' || r.sequence 'id' , r.result_name , r.script_index , r.robot , r.iteration , r.sequence , mt.SecondaryMetric 'script' , mt.MetricValue 'test_name' FROM Results r LEFT JOIN MetricData mt on mt.PrimaryMetric = r.script_index AND mt.MetricType = 'Scenario_Test' WHERE r.result = 'FAIL' AND r.end_time >= 1690513420 AND r.end_time <= 1690513632 ORDER BY x91idx93 ASC + +[FBA1FC9F068] +name = Test Summary Checks +parent = TOP +type = head +changed = 1729207173.1830115 +order = FBA1FCDCF80,FBA1FCF4C51,FBA1FD18720 + +[FBA1FCDCF80] +name = All no colours +parent = FBA1FC9F068 +type = table +changed = 1729207224.6629734 +colours = 0 +datatype = ResultSummary +sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 + +[FBA1FCF4C51] +name = All + colours +parent = FBA1FC9F068 +type = table +changed = 1729207280.5828955 +colours = 1 +datatype = ResultSummary +sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 +filteragent = +filtertype = None +col_result_name_show = 1 +col_minimum_show = 1 +col_average_show = 1 +col_90x37ile_show = 1 +col_maximum_show = 1 +col_std_dev_show = 1 +col_pass_show = 1 +col_fail_show = 1 +col_other_show = 1 + +[FBA1FD18720] +name = Some Cols +parent = FBA1FC9F068 +type = table +changed = 1729207310.6341364 +colours = 0 +datatype = ResultSummary +sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 +filteragent = +filtertype = None +col_result_name_show = 1 +col_minimum_show = 0 +col_average_show = 1 +col_90x37ile_show = 1 +col_maximum_show = 1 +col_std_dev_show = 1 +col_pass_show = 1 +col_fail_show = 1 +col_other_show = 0 + From 546ccc6ba869d9c2cadc95ee244610db1e2d2f0f Mon Sep 17 00:00:00 2001 From: damies13 Date: Fri, 18 Oct 2024 10:12:52 +1000 Subject: [PATCH 24/35] remove report file, shouldn't be there --- .../20230728_130340_Odoo-demo.report | 322 ------------------ 1 file changed, 322 deletions(-) delete mode 100644 Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report diff --git a/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report b/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report deleted file mode 100644 index f037c6f08..000000000 --- a/Tests/Regression/Reporter/testdata/Issue-#140/20230728_130340_Odoo-demo/20230728_130340_Odoo-demo.report +++ /dev/null @@ -1,322 +0,0 @@ -[Report] -order = FBA1FC42589,FBA1FC425B1,FBA1FC425CF,FBA1FC425F2,FBA1FC4260B,FBA1FC42643,FBA1FC4270C,FBA1FC9F068 -title = Odoo-demo - -[FBA1FC42589] -name = Information -parent = TOP -type = note -changed = 1729207128.2095497 -note = Define your template by adding sections and configuring the section settingsx12Each section can be:x12 - Note (like this) section, free textx12 - Heading, usefull for grouping sectionsx12 - Contents like a table of contents or figuresx12 - Data Table, with data from test resultsx12 - Data Graph, for graphical representation of test resultsx12 - Errors, gather error details and screenshots (if applicable) from robot logsx12x12Each section can also have sub sections.x12x12Use the arrows buttons to move sections up and down within the report.x12x12The cover page and overall report settings can be found on the settings pane of the Report item above.x12x12When you have your report how you like it, save it as a report template, so your future test results can use the same report format.x12x12 - -[FBA1FC425B1] -name = Table of Contents -parent = TOP -type = contents -changed = 1729207128.212583 -mode = Table Of Contents -level = 2 - -[FBA1FC425CF] -name = Scenario Plan -parent = TOP -type = graph -changed = 1729207128.2129602 -order = FBA1FC425DA - -[FBA1FC425CFL] -datatype = Plan -changed = 1729207133.3159962 -showtotal = 1 -sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' - -[FBA1FC425CFR] -datatype = None -changed = 1729207128.213741 - -[FBA1FC425DA] -name = Scenario Detail -parent = FBA1FC425CF -type = table -changed = 1729207134.1116896 -colours = 1 -datatype = Plan -col_index_show = 1 -col_robots_show = 1 -col_delay_show = 1 -col_ramp_up_show = 1 -col_run_show = 1 -col_script_show = 1 -col_script_opt = File -col_test_show = 1 -sql = SELECT md1.* , md0.SecondaryMetric as x91Filex93 , fp0.SecondaryMetric as x91FilePathx93 FROM MetricData as md0 LEFT JOIN MetricData as fp0 ON fp0.MetricValue = md0.MetricValue AND fp0.MetricType = 'Scenario' AND fp0.PrimaryMetric like 'Local_Path_x37' LEFT JOIN MetricData as md1 ON md1.SecondaryMetric = md0.MetricValue AND md1.MetricType = 'Scenario' WHERE md0.MetricType = 'Scenario' AND md0.PrimaryMetric like 'Test_x37' - -[FBA1FC425F2] -name = Test Result Summary -parent = TOP -type = table -changed = 1729207135.1513717 -colours = 0 -datatype = ResultSummary -col_result_name_show = 1 -col_minimum_show = 0 -col_average_show = 1 -col_90x37ile_show = 1 -col_maximum_show = 1 -col_std_dev_show = 1 -col_pass_show = 1 -col_fail_show = 1 -col_other_show = 0 -sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 - -[FBA1FC4260B] -name = Robots vs Response Time -parent = TOP -type = graph -changed = 1729207128.2190537 -order = FBA1FC42620,FBA1FC42629 - -[FBA1FC4260BL] -resulttype = Response Time -changed = 1729207140.9593716 -datatype = Result -sql = SELECT end_time as 'Time' , elapsed_time as 'Value' , result_name as x91Namex93 FROM Results WHERE x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 - -[FBA1FC4260BR] -datatype = Metric -changed = 1729207140.9600563 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime - -[FBA1FC42620] -name = Response Times -parent = FBA1FC4260B -type = table -changed = 1729207142.4149766 -colours = 1 -datatype = Result -resulttype = Response Time -sql = SELECT result_name as x91Result Namex93 , round(min(elapsed_time),3) 'Minimum' , round(avg(elapsed_time),3) 'Average' , round(percentile(elapsed_time, 90),3) '90x37ile' , round(max(elapsed_time),3) 'Maximum' , round(stdev(elapsed_time),3) 'Std. Dev.' , count(result) as 'Count' FROM Results WHERE x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 GROUP by x91Result Namex93 - -[FBA1FC42629] -name = Robots -parent = FBA1FC4260B -type = table -changed = 1729207149.0225883 -colours = 1 -datatype = Metric -metrictype = Scenario -secondarymetric = total_robots -isnumeric = 1 -showcount = 1 -col_primarymetric_show = 1 -col_minimum_show = 0 -col_average_show = 0 -col_90x37ile_show = 0 -col_maximum_show = 1 -col_std_dev_show = 0 -col_maximum = Robots -sql = SELECT PrimaryMetric , PrimaryMetric as x91Colourx93 , min(CAST(MetricValue AS NUMERIC)) AS 'Minimum' , round(avg(CAST(MetricValue AS NUMERIC)),3) AS 'Average' , round(percentile(CAST(MetricValue AS NUMERIC), 90),3) AS '90x37ile' , max(CAST(MetricValue AS NUMERIC)) AS 'Maximum' , round(stdev(CAST(MetricValue AS NUMERIC)),3) AS 'Std. Dev.' FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 GROUP by PrimaryMetric - -[FBA1FC42643] -name = Agents -parent = TOP -type = head -changed = 1729207128.2245998 -order = FBA1FC42648,FBA1FC42673,FBA1FC426A0,FBA1FC426E0 - -[FBA1FC42648] -name = Agent CPU Usage -parent = FBA1FC42643 -type = graph -changed = 1729207128.2251222 - -[FBA1FC42648L] -metrictype = Agent -changed = 1729207150.4900742 -axisen = 1 -datatype = Metric -secondarymetric = CPU -enablefilteragent = 1 -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime - -[FBA1FC42648R] -datatype = Metric -changed = 1729207150.4907668 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime - -[FBA1FC42673] -name = Agent Memory (RAM) Usage -parent = FBA1FC42643 -type = graph -changed = 1729207128.2294397 - -[FBA1FC42673L] -metrictype = Agent -changed = 1729207151.736342 -axisen = 1 -datatype = Metric -secondarymetric = MEM -enablefilteragent = 1 -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric || ' - ' || DataSource as x91Namex93 FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'MEM' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime - -[FBA1FC42673R] -datatype = Metric -changed = 1729207151.7370005 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime - -[FBA1FC426A0] -name = Agent Names -parent = FBA1FC42643 -type = table -changed = 1729207153.1845224 -colours = 1 -datatype = Metric -metrictype = Agent -col_primarymetric_show = 0 -col_metrictype_show = 1 -col_secondarymetric_show = 1 -col_metricvalue_show = 0 -enablefilteragent = 1 -secondarymetric = CPU -col_agent_show = 1 -sql = SELECT PrimaryMetric , DataSource 'Agent' , PrimaryMetric || ' - ' || DataSource as x91Colourx93 , MetricValue FROM MetricData WHERE MetricType == 'Agent' AND SecondaryMetric == 'CPU' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 GROUP by PrimaryMetric , DataSource - -[FBA1FC426E0] -name = Agent Details -parent = FBA1FC42643 -type = table -changed = 1729207153.8578005 -colours = 0 -datatype = Metric -metrictype = Metric -col_primarymetric_show = 1 -col_metrictype_show = 1 -col_secondarymetric_show = 1 -col_metricvalue_show = 1 -enablefilteragent = 1 -col_agent_show = 0 -col_primarymetric = Agent Name -col_secondarymetric = Metric Name -col_metricvalue = Metric Value -sql = SELECT PrimaryMetric , SecondaryMetric , DataSource 'Agent' , MetricValue FROM MetricData WHERE MetricType == 'Metric' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 GROUP by PrimaryMetric , SecondaryMetric , DataSource - -[FBA1FC4270C] -name = Errors -parent = TOP -type = head -changed = 1729207128.2447739 -order = FBA1FC42712,FBA1FC42740,FBA1FC42760 - -[FBA1FC42712] -name = Failed Keywords Graph -parent = FBA1FC4270C -type = graph -changed = 1729207128.245397 - -[FBA1FC42712L] -axisen = 1 -changed = 1729207154.973766 -resulttype = TPS -filterresult = Fail -datatype = Result -enablefilterresult = 1 -sql = SELECT floor(end_time) as 'Time' , count(result) as 'Value' , result_name as x91Namex93 FROM Results WHERE result == 'FAIL' AND x91Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 GROUP by floor(end_time) , result_name , result ORDER by floor(end_time), result DESC, count(result) DESC - -[FBA1FC42712R] -datatype = Metric -changed = 1729207154.9744375 -axisen = 1 -metrictype = Scenario -secondarymetric = total_robots -sql = SELECT MetricTime as 'Time' , MetricValue as 'Value' , PrimaryMetric as x91Namex93 FROM MetricData WHERE MetricType == 'Scenario' AND SecondaryMetric == 'total_robots' AND MetricTime >= 1690513420 AND MetricTime <= 1690513632 ORDER BY MetricTime - -[FBA1FC42740] -name = Failed Keywords Names -parent = FBA1FC4270C -type = table -changed = 1729207156.2536037 -colours = 1 -datatype = Result -resulttype = TPS -filterresult = Fail -enablefilterresult = 1 -col_result_name_show = 1 -col_result_show = 1 -col_count_show = 1 -sql = SELECT result_name as x91Result Namex93 , result 'Result' , count(result) as 'Count' FROM Results WHERE result == 'FAIL' AND x91Result Namex93 NOT LIKE 'Exception in threadx37' AND end_time >= 1690513420 AND end_time <= 1690513632 GROUP by x91Result Namex93 , result ORDER BY result DESC, count(result) DESC - -[FBA1FC42760] -name = Error Details -parent = FBA1FC4270C -type = errors -changed = 1729207156.7935834 -images = 1 -grouprn = 1 -groupet = 1 -sql = SELECT r.script_index || '_' || r.robot || '_' || r.iteration || '_' || r.sequence 'id' , r.result_name , r.script_index , r.robot , r.iteration , r.sequence , mt.SecondaryMetric 'script' , mt.MetricValue 'test_name' FROM Results r LEFT JOIN MetricData mt on mt.PrimaryMetric = r.script_index AND mt.MetricType = 'Scenario_Test' WHERE r.result = 'FAIL' AND r.end_time >= 1690513420 AND r.end_time <= 1690513632 ORDER BY x91idx93 ASC - -[FBA1FC9F068] -name = Test Summary Checks -parent = TOP -type = head -changed = 1729207173.1830115 -order = FBA1FCDCF80,FBA1FCF4C51,FBA1FD18720 - -[FBA1FCDCF80] -name = All no colours -parent = FBA1FC9F068 -type = table -changed = 1729207224.6629734 -colours = 0 -datatype = ResultSummary -sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 - -[FBA1FCF4C51] -name = All + colours -parent = FBA1FC9F068 -type = table -changed = 1729207280.5828955 -colours = 1 -datatype = ResultSummary -sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 -filteragent = -filtertype = None -col_result_name_show = 1 -col_minimum_show = 1 -col_average_show = 1 -col_90x37ile_show = 1 -col_maximum_show = 1 -col_std_dev_show = 1 -col_pass_show = 1 -col_fail_show = 1 -col_other_show = 1 - -[FBA1FD18720] -name = Some Cols -parent = FBA1FC9F068 -type = table -changed = 1729207310.6341364 -colours = 0 -datatype = ResultSummary -sql = SELECT r.result_name as x91Result Namex93 , round(min(rp.elapsed_time),3) 'Minimum', round(avg(rp.elapsed_time),3) 'Average', round(percentile(rp.elapsed_time, 90),3) '90x37ile', round(max(rp.elapsed_time),3) 'Maximum', round(stdev(rp.elapsed_time),3) 'Std. Dev.', count(rp.result) as 'Pass', count(rf.result) as 'Fail', count(ro.result) as 'Other' FROM Results as r LEFT JOIN Results as rp ON r.rowid == rp.rowid AND rp.result == 'PASS' LEFT JOIN Results as rf ON r.rowid == rf.rowid AND rf.result == 'FAIL' LEFT JOIN Results as ro ON r.rowid == ro.rowid AND ro.result <> 'PASS' AND ro.result <> 'FAIL' WHERE r.end_time >= 1690513420 AND r.end_time <= 1690513632 GROUP BY r.result_name ORDER BY x91Result Namex93 -filteragent = -filtertype = None -col_result_name_show = 1 -col_minimum_show = 0 -col_average_show = 1 -col_90x37ile_show = 1 -col_maximum_show = 1 -col_std_dev_show = 1 -col_pass_show = 1 -col_fail_show = 1 -col_other_show = 0 - From 10f64097862e9a2e4f554393ca616857892ec6f0 Mon Sep 17 00:00:00 2001 From: damies13 Date: Fri, 18 Oct 2024 10:20:12 +1000 Subject: [PATCH 25/35] more mid colours Issue #239 --- .../reporter_macos_graph_plantotal.png | Bin 16019 -> 18064 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/Regression/Reporter/Images/file_method/reporter_macos_graph_plantotal.png b/Tests/Regression/Reporter/Images/file_method/reporter_macos_graph_plantotal.png index 95b2afb0a94b419ed46a3cf14d5f738367c38fb8..8a8fee8086ecf0dfbfdab7ecc45bd678d42b29a5 100644 GIT binary patch literal 18064 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⬷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 EAF&tFzW@LL literal 16019 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 Date: Fri, 18 Oct 2024 10:28:31 +1000 Subject: [PATCH 26/35] test case tuning for Ubuntu Issue #239 --- Tests/Regression/Reporter/GUI_Common.robot | 2 +- .../reporter_ubuntu_label_starttime.png | Bin 1264 -> 1255 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Regression/Reporter/GUI_Common.robot b/Tests/Regression/Reporter/GUI_Common.robot index 522f3e157..bd0640ad8 100644 --- a/Tests/Regression/Reporter/GUI_Common.robot +++ b/Tests/Regression/Reporter/GUI_Common.robot @@ -149,7 +149,7 @@ Get Text Value To Right Of ${value}= Copy From The Right Of ${img} ${offsetx} # Take A Screenshot WHILE $b4value == $value limit=10 - Sleep 10 ms + Wait For ${img} timeout=${default_image_timeout} ${offsetx}= Evaluate ${offsetx}+10 ${value}= Copy From The Right Of ${img} ${offsetx} # Take A Screenshot diff --git a/Tests/Regression/Reporter/Images/file_method/reporter_ubuntu_label_starttime.png b/Tests/Regression/Reporter/Images/file_method/reporter_ubuntu_label_starttime.png index 2df731d41f4298ca071ec05c07352bd119a3db3a..f56a401a0e07521ee47bcd783e642372f60f6b29 100644 GIT binary patch delta 1233 zcmV;?1TOpV3Firr7YYst1^@s6{v$Ymks%X*o=HSOR9J=Wm~BW?Z5YRYlQ|c{*eOND zfg-+?^R1XB8oq%aG7uyp!VgL+Y@&#XR1Oq{)FL869FhvYq&d+>ABw&RE|7|lsi;i+ zG6jt^S0Qt#wdX@Thi9hYLo-YIeLCkl|NFZB*SYTl_qiojtJTF{jtpLhZQy4pEiL7L z)~#EIZR58>3h?RECmuX_z{to5tE;Ohl}b*XI)zTB~Y%jK9%Ch^{6GGR0t>FetgV}5>re)#+Qd)(ijj$~?T%9W6iKy!05xw*N!if-Jv z!ILLX++w4nqgX5!Iy*a=pP$Fa#|Mo@LrqN$K|w*HuCTC>@bGXxe*B2pZ05|FGbokH zUGoJ72JTwFqoV_Z!NA+MZ{6ahrKJQ12cy^P#ae2$8i&Kd)2C07%jHy7R&wEg!UY-{ z8hG*I1%e=;*Xzm3$`bRqTrN5~I_U53XJuuDkdP2`IvqJVIs1Q;zX@J4nGA(O!K+uV z*xcOQRn*+v%(-*txO(*}R;v}O)kJU( z$BB=RKXCs)ixeO|Jsq>zjKyNXVzFR0n`vunqrSeLOP4O~Ie2k#5re_N2!*X%VaXXeEA|iUtV6uX0uUMRYhD}96>=r;;P>dJM$eDVPRp&<#I+wMh@GGNATL% z*x=&Di}dyNF+M)d+}s>PLqj}#_>j!ZOuW3l&ACdYVq#)~rKKh8b~}O~;Opzl%a<yDwD}bOG{&Tco>__#^&ZG0RaJAzI+*-PA3Wr3JR#MuIBvt^EjPOMn^}vfB!yB zO-&dK1{4Yf6%`e{dGlspg?G#6sh#fsrM$cxK@jNe?WM6iu@QwrL3DI9TCG;ptgfyy vK0eO&_V%H8+%J;9XSqjVIM%u$YC&a3 z6#i8{kH;g{-H6J{N-{Gu5dBR-#YGMtJcv%GBR@ZX^H1^*Aw(vVp-?Co z8yjPFbv2-}<-)%5XZJIGs+SqM}$?SwXASVzpZ7?Ciwr^-@z)^V9mrj~|nj zmBr}jDDCa-8|DiJy}iBc-@l)Ko}M0xi;HP$YQkVJkdTl-Z*MQBPoJi)u8!s9WpPbs zXD1emh0B*OGc+`WR;$HmG%`9mDryD>21rOq;PdCtLGig&NCB>2zfMC#1L^7MBqt|x z{P=P5^Ye*|i~Hr`vuDrx-M6%~kd>9i{QSJ%fHE>NM6FaR4R#NHq@<*OU@#Z}h>MHk z-o1MWfhOH12w|Nj>$z^PNGu-ol891a`~2X?!iyLaz$<;oR`ii$Q|{O;X5OePbrUcJKY zc8l@3xjDaq#>dBRVGI6$Bqb$@*Aj_@@bGXF6BEUlOeRCARPz4)d*FKy9*>8Tl9Hct zsnu%nIwvQGoSdAkGae+w?Ix8<(P%ViG#V-@DrjnIqOGlM!-4vIKFZ6>QLEK7H#ZXz z5rNO=BR4mfwY4=rZCF^?)^_nPemrnVB$9x!uV23c-%r#4PoF-2B_<~3_n6#5HvAu| zQmOEIy<+1snT#)AzKFli&CTI*xu~tJB{emb=;&y1*KdX&^KBO~F)_&Ha)yV8x7$ik z2w7QK;oP}%ba!_%F)_jP^fdkb{d9D6kei!JNXYk@t5hmpzI@5->@04#8$l4*yLT@m zBO?H~-EMB&xUuPf!awHwXXE^C_Uze1MMVX-Z{Oz8qer-0F5bL(!-EG8=2#v7q@;wpx;oCBIfK{h#b&c{ z^X5%jT3RrfOehozs;jGc@#4j%3J1y;tds74rK+k5K@fOF`0ydk&CMtj3X+nN&}y}! zW@%}OiHQl;*Vnhj<7ScUew^P~{MFxbclnv!f$lKA0jWB}L55Vn Date: Fri, 18 Oct 2024 14:43:50 +1000 Subject: [PATCH 27/35] python 3.9 on Windows not finishing in 10 min, increased timeout to 30 min for wait for status Issue #239 --- Tests/Regression/Reporter/GUI_Common.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Regression/Reporter/GUI_Common.robot b/Tests/Regression/Reporter/GUI_Common.robot index bd0640ad8..a11dd69f3 100644 --- a/Tests/Regression/Reporter/GUI_Common.robot +++ b/Tests/Regression/Reporter/GUI_Common.robot @@ -257,7 +257,7 @@ Click Dialog Button # Take A Screenshot Wait For Status - [Arguments] ${status} ${timeout}=600 + [Arguments] ${status} ${timeout}=1800 ${statusl}= Convert To Lower Case ${status} ${img}= Set Variable reporter_${platform}_status_${statusl}.png Log ${CURDIR} From 5e1cf3ea8bb95f2ac2501cd1d66716a700ac5064 Mon Sep 17 00:00:00 2001 From: damies13 Date: Fri, 18 Oct 2024 23:30:49 +1000 Subject: [PATCH 28/35] Prevent extra empty 0px column Issue #239 --- rfswarm_reporter/rfswarm_reporter.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index ad0e66c8d..4ee096a1d 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -5486,10 +5486,10 @@ def docx_sections_table(self, id): cellcol = 0 cellrow = 0 if colours: - numcols += 1 + # numcols += 1 cellcol += 1 - if "Colour" in cols: - numcols -= 1 + # if "Colour" in cols: + # numcols -= 1 table = document.add_table(rows=1, cols=numcols) # Table Grid Light From a26f8bc304c7852d938954d0a6a80d0f084d48b0 Mon Sep 17 00:00:00 2001 From: damies13 Date: Sat, 19 Oct 2024 20:47:27 +1000 Subject: [PATCH 29/35] new line for the linter --- rfswarm_reporter/rfswarm_reporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfswarm_reporter/rfswarm_reporter.py b/rfswarm_reporter/rfswarm_reporter.py index 6e07c1996..2a0421b39 100644 --- a/rfswarm_reporter/rfswarm_reporter.py +++ b/rfswarm_reporter/rfswarm_reporter.py @@ -11466,4 +11466,4 @@ def __init__(self): core.mainloop() -# r = RFSwarm_Reporter() \ No newline at end of file +# r = RFSwarm_Reporter() From 25c38c63817ce7bdce671b105b3964ede178add7 Mon Sep 17 00:00:00 2001 From: damies13 Date: Sat, 19 Oct 2024 21:59:51 +1000 Subject: [PATCH 30/35] Tuning finder image Issue #239 --- .../Images/file_method/macos_finder.png | Bin 4587 -> 4373 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Tests/Regression/Reporter/Images/file_method/macos_finder.png b/Tests/Regression/Reporter/Images/file_method/macos_finder.png index cb839fd9a0f912a3bd7966f499685d6545b58d82..cff6db65abb01ea148ee2e6cd08eddc7a1b3e8d1 100644 GIT binary patch literal 4373 zcmV+w5$f)VP)eR-&=?&@=|Eai;uoIc&PecS*0*HJFW<-`;U_EH;5(zovRGrvt!QK9xrRbHO-ilQ7WvCDL^g8 zD@E1cK$?|hDA%mv&#o(ZaHHg6spLk8%k_&CB=i#j5kHi34(BY(s-j#hu-3k=GCG2( zf{I{J&MY$?D-ZH5yGFg1Ll3Ax9p0QPLPf2{A1bY|DqsXEg@b+NHxFi%wnx9GWKnJr zL=4{MfCz$Mj3CBP2T1z}oCCH)iOmSstF<;(~Nw-0jQz!vAvUtl_& z>~YhMUwsU5zMt3tKdXBrjfY* zeeSh!(h3!y8eryxQzOegqnh1PF=6Poy+K4nFTrVmp%7=N1ov)dQ&n~+Qw|?KL~Uy( zySvT0Ocd$|vy8{8!?0_yPEhqxD^9`rRkZP?Ey^fJxUVkUccDqR7KNpS4{Tc2aV%Ze zk;5{ZK2f~pxARs+wNa#oIZ&8RXB<6p3}Z6iQv?$={iSjn*UJ%`tjYypf`Fn5&fgao zg;qK%N`&)$pmwljl=p2~rj^^{$$owD|Mp*es3@vRoUZ8?U|9nKAKc!iswz~KT!7QN zmS>h@SlGt>8nKZ7IW{%p&f!O3;bj{>io%(w=C?Ht1 zs^LAGmXRt|Gqxl#7GqZ%muy{8lPR@rr{F>x)LV2k?9(fHKmd=kcG$XIbc@tFlCX&; z1`-Q3j}j;epkRRwqr7vYW>$Ocd#$&LBO<304;;R)12HWOsRr;!tm;4wIF$zO^P-?E z7vz)4gbVdHEQ8h?xMECRbD#WL>kRQKoZOO76=Nx(MpmfHY)rR&d z^hm2w?-G6zb+reF0I~5|a4h05eUy9F6&p}3QmDq@`$;I^tVPw4Av|sX+t^*=Mq597VDWv(ZBs9YRRn&S_x$4&%2U;*)F4L6!yyn?D7t0tNQct6crU zqs*WB3PuWlziI2o5mlBJ-aM>1(u2|_$#pezg=saQTT%4*%Hxmo$Y&qs)e9HM^W1Nf z)B^=g+qNI7xPX2lLauoLz)_N@e@k{g{`%~-7f-^$r16CMKlEcst+dD)(ci$I_@h*sVd>7p`(Yxs*(l7XkAYeUue-s^ZA#eeQlK2` zJF1XE_NrTlXdta52z^W1TkTg8Km}h@kO49j6tw4Ov*gEN^V??M!;@d zq*`+*Jp-Es)UJiZRy^6m;5+6^wnrTiHSj|vM7DGm*+s?ZCV}Uz3e$AhqtBIwj;1iG z4srwI9Pf(A3b$6@p2o90)~)#A3WmmpVWPcZ5cwk-EoRj>be(Y%aik+?_tUzRh@Vp} zm|Q3fxJo^{({@}DX#;3Nt0E7|RULWs-L}5G2L^pz-O%g} znoZ?C(Jwx?WGGvkTX5h|Gfr;6&4u22iF3O&KA|mZPf=W*VvK1l66;Jc^+c~y+0PXN z%tut*Bb5TiK;Uqg0_v)J+?i-31u|=EAUVS_P%nh}qH1+M3vM`2_Wm({n ziN|O{ic`Tv5)5_i1YNFU(5l9M`FAm*n2$aN`4DUc(vhx3t_}=_@8Ca1g|g}jM5m8G z!OV+-x~llpCmsUeFTe0t zkvMz7oPw2P@!`f=Q(`GJ9*>f|6uX>ClM7W#!%N_U7HI#{nJ17F{3ak z14WHB{9vWp)(l5uj2Iq$!K{Z!Es}Vcg6AjSM!x^gV;AZ7AQZ3Yc0<*_r$DfvUsS z7UvxOexI$a1N`rgPxFa~KE~Id`YLaE>nR@mgFocXlXo$n&-_kW+Y)YTENx135GrCu zZF|;57wb|TWaWg#b-%&s-X^#8|C;S{-{kp!`W+@We~9AL?_&<#3MNDA3S5n7C@(h$ z3L#>h;mRCTGWvZ(e=wx3D$f4&Cp`WSU*@a-{v^Zkn0LSDeSG*MzsDUX?_x5Yl9?De z$?7`sDLChWA~yn=bHr22eI!c8Fl5UKi-T|F^xzS0+IoVw-|!TdfBrB0{GXp-a^UUg z@%zcIzYkr116gm36uk~8h(J-p<;9%c*;QVC=|%qQnP>R+)8F7nKm0yfo^!{kySeXI z-o<<0`+l~!x0y~RWLefl%t!{Bdm)dh^Qipvx4x^N`udH$Vh2n;PeUpPb-(zy_S*Ft&FJ3M&o5z_JN2q(-$Y2X~fk=y@i>vhOOWf2u&-s_m z(HjgH3`g94=Sfc9b&9v$eJ{7X=~k?@RMpZS!A1!hgk^<+DZPH5*<_b;=T-7NgHcvN zok1)^Ye>G5a)8Kq)I)q-Q&2G-pWyWHHU{hO=h(65*_xl>)btE%GUdWAo?|)r5j~|j z6SfLft@OtSICSG}oVfEOH{bFmj^A_($8WreqeqV+A}q=U0vMA8nit$T3KVl?WJIBD zU02=}N23u(2TRT_11-_E3?QLG9Bm&D1lt5`Fx3JBEPF>et8YYl@1VD_pkKen+M#O< zm{Dtqq4F^xInE3?Hy`lccMbW-eOp{D3r52}byZQ8OBDYuM+60Lt8`-;@3p)Z!Poe0 z&0sJfFN%WWYjd8y>IG@6jn_oeF(rcCp?!X@D|)&FV{p=ER@}%g@kG*e+&MRnE0uCy zXN(3*F3&4w)2V+mM@&;FYFsUqptHM322~Ids&c{R*4S5q@7lh`-~VI>OV-p3Qm)&O z?iKfLSO&D*(SnFW)HY%%t-C0KaWFBA^TgP95a*C3LO|DCQ*47rr7)%z{`SzRp zJaEGqBp;DMQzlT?UZa{+jf3#vIxa#K#A?&FJ=zW53RopmWil7eyqYoW8EjIB>6Rhl z_}USuX{E~M)&VZQ^b3Z4Uz-vMT(MW=ln$&P;id;nvrPN3X!ih z!beMLv~1$K@ubGJ3q&)1{EAPi?aL@#+=~&fohOke3R?#c@r$!(SWGT?G|c>&xaW!@ z^m~2QH#T|bo+~_X_}gS!B%VGp|HGliyj9ZTyuFYNha#!3<8~<`jW-_uo zCo>t-$u2wBE_3PpImUy6t*tF@t-O7&wDX2(mSv2FBaAWJd!omQH@w7|m!9YJrGvaU z-Q@CO$ZkELv^iD{Htc#<7rat1XdGy@Qj!_CS}IRJx8&ACFr8N9S)g9{k~QK`>!|CB zdReku%$ZKEkQ+F>y-mO0XE+>o-c^JZi^Y$sQd>t^mekeKTXHsIGMP{=EtT`37hiNq zPZC$sOe5Utv$TCCFer5O^^)deg4G6t0UH||6h%RnW%T<4@;uuk6u|!h)IjpN|KXQE P00000NkvXXu0mjfB4Kj0 literal 4587 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 VK5kuk0=fVI002ovPDHLkV1k}s*wFw0 From e384c72bc87bc38bde60498311e21939d40421d7 Mon Sep 17 00:00:00 2001 From: damies13 Date: Sun, 20 Oct 2024 19:14:06 +1000 Subject: [PATCH 31/35] FAQ Updates for Issue #291 --- Doc/FAQ.md | 18 ++++++++++++++++++ Doc/Images/WindowsDefenderFirewall.png | Bin 0 -> 88272 bytes 2 files changed, 18 insertions(+) create mode 100644 Doc/Images/WindowsDefenderFirewall.png diff --git a/Doc/FAQ.md b/Doc/FAQ.md index aea0ce424..30fb37639 100644 --- a/Doc/FAQ.md +++ b/Doc/FAQ.md @@ -10,6 +10,8 @@ - [Do we have any sample test cases?](#do-we-have-any-sample-test-cases) - [Is there a tutorial on how to use rfswarm?](#is-there-a-tutorial-on-how-to-use-rfswarm) - [does rfswarm support IPv6?](#does-rfswarm-support-ipv6) +- [Errors mentioning Matplotlib, Numpy or Kiwisolver](#errors-mentioning-matplotlib,-numpy-or-kiwisolver) +- [Windows Defender Prompt](#windows-defender-prompt) ## How are issues prioritised? @@ -109,3 +111,19 @@ As far as I know all components of rfswarm work with IPv6, what I can confirm wo - configuring the agent ini file with a manager name that only resolves to an IPv6 address rfswarm works in IPv4 only networks as well. + +## Errors mentioning Matplotlib, Numpy or Kiwisolver + +If you are using Windows OS and getting these types of errors try installing `msvc-runtime` as this is a common issue on Windows +``` +pip install msvc-runtime +``` +If this doesn't solve the problem or you are not using Windows (i.e. Mac / Linux) then please create a bug report + +## Windows Defender Prompt + +On Windows computers you may receive the following dialogue the first time you run RFSwarm Manager: + +![Image](Images/WindowsDefenderFirewall.png "Windows Defender Prompt") + +For best results it's suggested you make sure both check boxes are checked and then click allow, so that your agent machines can connect to your manager diff --git a/Doc/Images/WindowsDefenderFirewall.png b/Doc/Images/WindowsDefenderFirewall.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2b996dfa1d5c7392e581d9da96d46ec0afce80 GIT binary patch literal 88272 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 Date: Sun, 20 Oct 2024 19:40:22 +1000 Subject: [PATCH 32/35] fix doclink Issue #291 --- Doc/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/FAQ.md b/Doc/FAQ.md index 30fb37639..45cc670d4 100644 --- a/Doc/FAQ.md +++ b/Doc/FAQ.md @@ -10,7 +10,7 @@ - [Do we have any sample test cases?](#do-we-have-any-sample-test-cases) - [Is there a tutorial on how to use rfswarm?](#is-there-a-tutorial-on-how-to-use-rfswarm) - [does rfswarm support IPv6?](#does-rfswarm-support-ipv6) -- [Errors mentioning Matplotlib, Numpy or Kiwisolver](#errors-mentioning-matplotlib,-numpy-or-kiwisolver) +- [Errors mentioning Matplotlib, Numpy or Kiwisolver](#errors-mentioning-matplotlib-numpy-or-kiwisolver) - [Windows Defender Prompt](#windows-defender-prompt) ## How are issues prioritised? From c1101069aaf558c8525835481ff69c2eb1cdbcb1 Mon Sep 17 00:00:00 2001 From: damies13 Date: Sun, 20 Oct 2024 19:43:48 +1000 Subject: [PATCH 33/35] Linter fixes Issue #291 --- Doc/FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/FAQ.md b/Doc/FAQ.md index 30fb37639..8f3a7de79 100644 --- a/Doc/FAQ.md +++ b/Doc/FAQ.md @@ -115,7 +115,7 @@ rfswarm works in IPv4 only networks as well. ## Errors mentioning Matplotlib, Numpy or Kiwisolver If you are using Windows OS and getting these types of errors try installing `msvc-runtime` as this is a common issue on Windows -``` +```console pip install msvc-runtime ``` If this doesn't solve the problem or you are not using Windows (i.e. Mac / Linux) then please create a bug report @@ -126,4 +126,4 @@ On Windows computers you may receive the following dialogue the first time you r ![Image](Images/WindowsDefenderFirewall.png "Windows Defender Prompt") -For best results it's suggested you make sure both check boxes are checked and then click allow, so that your agent machines can connect to your manager +For best results it's suggested you make sure both checkboxes are checked and then click allow, so that your agent machines can connect to your manager From dcf1efa62924b90b504f301a2683199239a949e2 Mon Sep 17 00:00:00 2001 From: damies13 Date: Sun, 20 Oct 2024 19:44:50 +1000 Subject: [PATCH 34/35] Linter fixes Issue #291 --- Doc/FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/FAQ.md b/Doc/FAQ.md index 45cc670d4..09bac97e7 100644 --- a/Doc/FAQ.md +++ b/Doc/FAQ.md @@ -115,7 +115,7 @@ rfswarm works in IPv4 only networks as well. ## Errors mentioning Matplotlib, Numpy or Kiwisolver If you are using Windows OS and getting these types of errors try installing `msvc-runtime` as this is a common issue on Windows -``` +```console pip install msvc-runtime ``` If this doesn't solve the problem or you are not using Windows (i.e. Mac / Linux) then please create a bug report @@ -126,4 +126,4 @@ On Windows computers you may receive the following dialogue the first time you r ![Image](Images/WindowsDefenderFirewall.png "Windows Defender Prompt") -For best results it's suggested you make sure both check boxes are checked and then click allow, so that your agent machines can connect to your manager +For best results it's suggested you make sure both checkboxes are checked and then click allow, so that your agent machines can connect to your manager From e0a6a896c9b1a168b55d6b0bda917d029209be46 Mon Sep 17 00:00:00 2001 From: damies13 Date: Sun, 20 Oct 2024 19:49:40 +1000 Subject: [PATCH 35/35] Update version to 1.4.0