[libvirt] [test-API][PATCH] Add display of cases result to log.xml

The original log.xml only display the testrun result, the patch add display of case result to log.xml. modified: src/generator.py -Perserver case result list and pass it to log_generator class. modified: src/log.xsl -Read from xml and display case result modified: src/log_generator.py -Create case result xml and add it to log.xml --- src/generator.py | 5 +++-- src/log.xsl | 23 ++++++++++++++++++++--- src/log_generator.py | 16 ++++++++++++++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/generator.py b/src/generator.py index 0cdc9de..208fa7b 100644 --- a/src/generator.py +++ b/src/generator.py @@ -87,7 +87,6 @@ class FuncGen(object): env_logger = envlog.env_log() casenumber = len(self.case_name_list) start_time = time.strftime("%Y-%m-%d %H:%M:%S") - env_logger.info("Checking Testing Environment... ") envck = env_inspect.EnvInspect(self.env, env_logger) @@ -103,6 +102,7 @@ class FuncGen(object): # retflag: [pass, fail, skip] retflag = [0, 0, 0] + case_retlist = [] for i in range(casenumber): clean_flag = False @@ -165,7 +165,7 @@ class FuncGen(object): retflag[2] += 1 self.fmt.print_end(mod_case, ret, env_logger) - + case_retlist.append(ret) # close hypervisor connection envck.close_hypervisor_connection() end_time = time.strftime("%Y-%m-%d %H:%M:%S") @@ -179,6 +179,7 @@ class FuncGen(object): self.log_xml_parser.add_test_summary(self.testrunid, self.testid, result, + case_retlist, start_time, end_time, self.logfile) diff --git a/src/log.xsl b/src/log.xsl index 577a0a5..0ca6afe 100644 --- a/src/log.xsl +++ b/src/log.xsl @@ -119,9 +119,10 @@ <tr> <th width="5%">No.</th> <th width="5%">Result</th> - <th width="12%">Start</th> - <th width="12%">End</th> - <th width="66%">Test Procedure</th> + <th width="10%">Start</th> + <th width="10%">End</th> + <th width="65%">Test Procedure</th> + <th width="5%">Case Result</th> </tr> </thead> <tbody> @@ -164,6 +165,22 @@ </xsl:for-each> </table> </td> + <td> + <table class="pro" cellspacing="1" cellspan="0" > + <xsl:for-each select="caseresult/case"> + <tr> + <td> + <xsl:if test="self::node()[text()='FAIL']"> + <tr class="fail"><xsl:value-of select="current()"/></tr> + </xsl:if> + <xsl:if test="self::node()[text()='PASS']"> + <tr class="pass"><xsl:value-of select="current()"/></tr> + </xsl:if> + </td> + </tr> + </xsl:for-each> + </table> + </td> </tr> </xsl:for-each> </tbody> diff --git a/src/log_generator.py b/src/log_generator.py index be483d6..de18654 100644 --- a/src/log_generator.py +++ b/src/log_generator.py @@ -93,7 +93,7 @@ class LogGenerator(object): self. __write_to_file(xmldoc, self.logxml) - def add_test_summary(self, testrunid, testid, result, + def add_test_summary(self, testrunid, testid, result, case_retlist, start_time, end_time, path): """ add a test summary xml block into log xml file """ xmldoc = minidom.parse(self.logxml) @@ -101,6 +101,8 @@ class LogGenerator(object): resulttext = self.doc.createTextNode(result) testresult.appendChild(resulttext) + caseresult = self.doc.createElement('caseresult') + teststarttime = self.doc.createElement('start_time') starttimetext = self.doc.createTextNode(start_time) teststarttime.appendChild(starttimetext) @@ -126,10 +128,20 @@ class LogGenerator(object): test.childNodes.insert(0, testendtime) test.childNodes.insert(0, teststarttime) test.childNodes.insert(0, testresult) + test.childNodes.insert(0, caseresult) + for ret in reversed(case_retlist): + retstr = '' + if ret == 0: + retstr = 'PASS' + else: + retstr = 'FAIL' + itemresult = self.doc.createElement('case') + caseresulttext = self.doc.createTextNode(retstr) + itemresult.appendChild(caseresulttext) + caseresult.childNodes.insert(0,itemresult) self. __write_to_file(xmldoc, self.logxml) - def add_testrun_summary(self, testrunid, passnum, failnum, totalnum, start_time, end_time): """ add a testrun summary xml block into log xml file """ -- 1.7.1

Hi Guannan You can see the new test report from the following url. http://fileshare.englab.nay.redhat.com/pub/section3/libvirtauto/libvirt-test... Thanks Hongming On 08/15/2013 11:32 AM, Hongming Zhang wrote:
The original log.xml only display the testrun result, the patch add display of case result to log.xml. modified: src/generator.py -Perserver case result list and pass it to log_generator class. modified: src/log.xsl -Read from xml and display case result modified: src/log_generator.py -Create case result xml and add it to log.xml --- src/generator.py | 5 +++-- src/log.xsl | 23 ++++++++++++++++++++--- src/log_generator.py | 16 ++++++++++++++-- 3 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/src/generator.py b/src/generator.py index 0cdc9de..208fa7b 100644 --- a/src/generator.py +++ b/src/generator.py @@ -87,7 +87,6 @@ class FuncGen(object): env_logger = envlog.env_log() casenumber = len(self.case_name_list) start_time = time.strftime("%Y-%m-%d %H:%M:%S") - env_logger.info("Checking Testing Environment... ") envck = env_inspect.EnvInspect(self.env, env_logger)
@@ -103,6 +102,7 @@ class FuncGen(object):
# retflag: [pass, fail, skip] retflag = [0, 0, 0] + case_retlist = [] for i in range(casenumber):
clean_flag = False @@ -165,7 +165,7 @@ class FuncGen(object): retflag[2] += 1
self.fmt.print_end(mod_case, ret, env_logger) - + case_retlist.append(ret) # close hypervisor connection envck.close_hypervisor_connection() end_time = time.strftime("%Y-%m-%d %H:%M:%S") @@ -179,6 +179,7 @@ class FuncGen(object): self.log_xml_parser.add_test_summary(self.testrunid, self.testid, result, + case_retlist, start_time, end_time, self.logfile) diff --git a/src/log.xsl b/src/log.xsl index 577a0a5..0ca6afe 100644 --- a/src/log.xsl +++ b/src/log.xsl @@ -119,9 +119,10 @@ <tr> <th width="5%">No.</th> <th width="5%">Result</th> - <th width="12%">Start</th> - <th width="12%">End</th> - <th width="66%">Test Procedure</th> + <th width="10%">Start</th> + <th width="10%">End</th> + <th width="65%">Test Procedure</th> + <th width="5%">Case Result</th> </tr> </thead> <tbody> @@ -164,6 +165,22 @@ </xsl:for-each> </table> </td> + <td> + <table class="pro" cellspacing="1" cellspan="0" > + <xsl:for-each select="caseresult/case"> + <tr> + <td> + <xsl:if test="self::node()[text()='FAIL']"> + <tr class="fail"><xsl:value-of select="current()"/></tr> + </xsl:if> + <xsl:if test="self::node()[text()='PASS']"> + <tr class="pass"><xsl:value-of select="current()"/></tr> + </xsl:if> + </td> + </tr> + </xsl:for-each> + </table> + </td> </tr> </xsl:for-each> </tbody> diff --git a/src/log_generator.py b/src/log_generator.py index be483d6..de18654 100644 --- a/src/log_generator.py +++ b/src/log_generator.py @@ -93,7 +93,7 @@ class LogGenerator(object):
self. __write_to_file(xmldoc, self.logxml)
- def add_test_summary(self, testrunid, testid, result, + def add_test_summary(self, testrunid, testid, result, case_retlist, start_time, end_time, path): """ add a test summary xml block into log xml file """ xmldoc = minidom.parse(self.logxml) @@ -101,6 +101,8 @@ class LogGenerator(object): resulttext = self.doc.createTextNode(result) testresult.appendChild(resulttext)
+ caseresult = self.doc.createElement('caseresult') + teststarttime = self.doc.createElement('start_time') starttimetext = self.doc.createTextNode(start_time) teststarttime.appendChild(starttimetext) @@ -126,10 +128,20 @@ class LogGenerator(object): test.childNodes.insert(0, testendtime) test.childNodes.insert(0, teststarttime) test.childNodes.insert(0, testresult) + test.childNodes.insert(0, caseresult) + for ret in reversed(case_retlist): + retstr = '' + if ret == 0: + retstr = 'PASS' + else: + retstr = 'FAIL' + itemresult = self.doc.createElement('case') + caseresulttext = self.doc.createTextNode(retstr) + itemresult.appendChild(caseresulttext) + caseresult.childNodes.insert(0,itemresult)
self. __write_to_file(xmldoc, self.logxml)
- def add_testrun_summary(self, testrunid, passnum, failnum, totalnum, start_time, end_time): """ add a testrun summary xml block into log xml file """

On 08/15/2013 01:47 PM, hongming wrote:
Hi Guannan
You can see the new test report from the following url.
http://fileshare.englab.nay.redhat.com/pub/section3/libvirtauto/libvirt-test...
Thanks Hongming
Hi hongming, Patch looks good, ACK. Next time, please don't send non-public website to upstream which will confuse others. Guannan

Hi hongming, BTW, could we ignore module or function name in "Test Procedure" section, because the module and entry function are the same name, it's a deliberately design, but the "Test Procedure" looks like a duplicate naming for others. <slice> network:define:define network:network_list:network_list network:start:start network:network_list:network_list network:autostart:autostart network:update:update </slice> -- Regards, Alex ----- Original Message ----- From: "hongming" <honzhang@redhat.com> To: gren@redhat.com Cc: libvir-list@redhat.com Sent: Thursday, August 15, 2013 1:47:05 PM Subject: Re: [libvirt] [test-API][PATCH] Add display of cases result to log.xml Hi Guannan You can see the new test report from the following url. http://fileshare.englab.nay.redhat.com/pub/section3/libvirtauto/libvirt-test... Thanks Hongming On 08/15/2013 11:32 AM, Hongming Zhang wrote:
The original log.xml only display the testrun result, the patch add display of case result to log.xml. modified: src/generator.py -Perserver case result list and pass it to log_generator class. modified: src/log.xsl -Read from xml and display case result modified: src/log_generator.py -Create case result xml and add it to log.xml --- src/generator.py | 5 +++-- src/log.xsl | 23 ++++++++++++++++++++--- src/log_generator.py | 16 ++++++++++++++-- 3 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/src/generator.py b/src/generator.py index 0cdc9de..208fa7b 100644 --- a/src/generator.py +++ b/src/generator.py @@ -87,7 +87,6 @@ class FuncGen(object): env_logger = envlog.env_log() casenumber = len(self.case_name_list) start_time = time.strftime("%Y-%m-%d %H:%M:%S") - env_logger.info("Checking Testing Environment... ") envck = env_inspect.EnvInspect(self.env, env_logger)
@@ -103,6 +102,7 @@ class FuncGen(object):
# retflag: [pass, fail, skip] retflag = [0, 0, 0] + case_retlist = [] for i in range(casenumber):
clean_flag = False @@ -165,7 +165,7 @@ class FuncGen(object): retflag[2] += 1
self.fmt.print_end(mod_case, ret, env_logger) - + case_retlist.append(ret) # close hypervisor connection envck.close_hypervisor_connection() end_time = time.strftime("%Y-%m-%d %H:%M:%S") @@ -179,6 +179,7 @@ class FuncGen(object): self.log_xml_parser.add_test_summary(self.testrunid, self.testid, result, + case_retlist, start_time, end_time, self.logfile) diff --git a/src/log.xsl b/src/log.xsl index 577a0a5..0ca6afe 100644 --- a/src/log.xsl +++ b/src/log.xsl @@ -119,9 +119,10 @@ <tr> <th width="5%">No.</th> <th width="5%">Result</th> - <th width="12%">Start</th> - <th width="12%">End</th> - <th width="66%">Test Procedure</th> + <th width="10%">Start</th> + <th width="10%">End</th> + <th width="65%">Test Procedure</th> + <th width="5%">Case Result</th> </tr> </thead> <tbody> @@ -164,6 +165,22 @@ </xsl:for-each> </table> </td> + <td> + <table class="pro" cellspacing="1" cellspan="0" > + <xsl:for-each select="caseresult/case"> + <tr> + <td> + <xsl:if test="self::node()[text()='FAIL']"> + <tr class="fail"><xsl:value-of select="current()"/></tr> + </xsl:if> + <xsl:if test="self::node()[text()='PASS']"> + <tr class="pass"><xsl:value-of select="current()"/></tr> + </xsl:if> + </td> + </tr> + </xsl:for-each> + </table> + </td> </tr> </xsl:for-each> </tbody> diff --git a/src/log_generator.py b/src/log_generator.py index be483d6..de18654 100644 --- a/src/log_generator.py +++ b/src/log_generator.py @@ -93,7 +93,7 @@ class LogGenerator(object):
self. __write_to_file(xmldoc, self.logxml)
- def add_test_summary(self, testrunid, testid, result, + def add_test_summary(self, testrunid, testid, result, case_retlist, start_time, end_time, path): """ add a test summary xml block into log xml file """ xmldoc = minidom.parse(self.logxml) @@ -101,6 +101,8 @@ class LogGenerator(object): resulttext = self.doc.createTextNode(result) testresult.appendChild(resulttext)
+ caseresult = self.doc.createElement('caseresult') + teststarttime = self.doc.createElement('start_time') starttimetext = self.doc.createTextNode(start_time) teststarttime.appendChild(starttimetext) @@ -126,10 +128,20 @@ class LogGenerator(object): test.childNodes.insert(0, testendtime) test.childNodes.insert(0, teststarttime) test.childNodes.insert(0, testresult) + test.childNodes.insert(0, caseresult) + for ret in reversed(case_retlist): + retstr = '' + if ret == 0: + retstr = 'PASS' + else: + retstr = 'FAIL' + itemresult = self.doc.createElement('case') + caseresulttext = self.doc.createTextNode(retstr) + itemresult.appendChild(caseresulttext) + caseresult.childNodes.insert(0,itemresult)
self. __write_to_file(xmldoc, self.logxml)
- def add_testrun_summary(self, testrunid, passnum, failnum, totalnum, start_time, end_time): """ add a testrun summary xml block into log xml file """
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On 08/15/2013 02:00 PM, Alex Jia wrote:
Hi hongming, BTW, could we ignore module or function name in "Test Procedure" section, because the module and entry function are the same name, it's a deliberately design, but the "Test Procedure" looks like a duplicate naming for others.
I agree with you. There are three pre-defined functions for each $testcase.py $testcase_check (optional) which is used to check if the testcase is runnable. $testcase which is the testing body for actual test work. $testcase_clean (optional) is used to clean testing environment after test. we can only list the names of $testcase_check and $testcase_clean in the third column and ignore the $testcase, do you think it is good idea?
<slice>
network:define:define network:network_list:network_list network:start:start network:network_list:network_list network:autostart:autostart network:update:update
</slice>

Gren, I think it should be enough if we can know which test cases is run, and should hide some details such as checkpoint and clean function. -- Regards, Alex ----- Original Message ----- From: "Guannan Ren" <gren@redhat.com> To: "Alex Jia" <ajia@redhat.com> Cc: "hongming" <honzhang@redhat.com>, libvir-list@redhat.com Sent: Thursday, August 15, 2013 2:18:26 PM Subject: Re: [libvirt] [test-API][PATCH] Add display of cases result to log.xml On 08/15/2013 02:00 PM, Alex Jia wrote:
Hi hongming, BTW, could we ignore module or function name in "Test Procedure" section, because the module and entry function are the same name, it's a deliberately design, but the "Test Procedure" looks like a duplicate naming for others.
I agree with you. There are three pre-defined functions for each $testcase.py $testcase_check (optional) which is used to check if the testcase is runnable. $testcase which is the testing body for actual test work. $testcase_clean (optional) is used to clean testing environment after test. we can only list the names of $testcase_check and $testcase_clean in the third column and ignore the $testcase, do you think it is good idea?
<slice>
network:define:define network:network_list:network_list network:start:start network:network_list:network_list network:autostart:autostart network:update:update
</slice>

On 08/15/2013 02:31 PM, Alex Jia wrote:
Gren, I think it should be enough if we can know which test cases is run, and should hide some details such as checkpoint and clean function.
Okay, anyway, we have detailed log to check. without the function name, the UI could become more concise.
participants (4)
-
Alex Jia
-
Guannan Ren
-
hongming
-
Hongming Zhang