思路:

1.使用xslt样式,这样可以很好的和xml结合,做出漂亮的报告

2.生成xml结构

xslt样式是个很有意思,也很强大的,现在用的很多,很方便就能做出一个漂亮的报告,可以百度一下,语法相当简单,跟写html差不多的.

在这里可以定制好,我们要生成报告,是什么样子的,然后在从xml获取数据.

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<Head>
<style type="text/css"> body {
background:#fff;
margin:0;
padding:40px 20px;
font-family: "Arial", Arial, Sans-serif;
font-size: 16px;
color:#000;
} table {
margin:5px 5px 0;
border:0px solid #222;
font-size: 0.8em;
} td {
margin:5px 5px 0;
padding:10px 10px 10px 10px;
vertical-align:text-top;
border:1px solid #222;
border-width:1px 1px 1px 1px;
} td.light {
border:0px solid #222;
} td.number {
text-align:right;
} td.status {
text-align:right;
vertical-align:text-bottom;
} </style> </Head>
<body>
<!--OVER RESULT -->
<xsl:variable name="OVER_STATUS" select="REPORT/OVER_STATUS"/>
<xsl:variable name="STATUS" select="REPORT/LOG_ENTRY/STATUS"/> <h2>自动化测试执行报告</h2>
<!--table -->
<table border="1">
<!--all result value-->
<tr bgcolor="white" height = "35">
<td>Overall Test Result</td>
<td><xsl:value-of select="$OVER_STATUS"/></td>
<td colspan="2"> </td>
</tr> <tr bgcolor="#D8BFD8" height = "35">
<th>执行时间</th>
<th>单步结果</th>
<th>响应CODE</th>
<th>Response信息</th>
</tr> <!--select font color -->
<xsl:variable name="fontColor">
<xsl:choose>
<xsl:when test="$STATUS = FAILED or $STATUS = PASSED">
<xsl:text>white</xsl:text>
</xsl:when>
<xsl:otherwise>black</xsl:otherwise>
</xsl:choose>
</xsl:variable> <!--background color-->
<xsl:variable name="backgroundColor">
<xsl:choose>
<xsl:when test="$STATUS = 'FAILED'">
<xsl:text>rgb(255,0,0)</xsl:text>
</xsl:when>
<xsl:when test="$STATUS = 'PASSED'">
<xsl:text>rgb(60,179,113)</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>white</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> <!--log entry-->
<xsl:for-each select = "REPORT/LOG_ENTRY"> <tr>
<td><xsl:value-of select="EXECUTION_TIME"/></td>
<td bgcolor="{$backgroundColor}"><xsl:value-of select="STEP_RESULT"/></td>
<td><xsl:value-of select="COMPONENT_NAME"/></td>
<td><xsl:value-of select="STEP_DESCRIPTION"/></td>
</tr>
</xsl:for-each> <tr bgcolor="white">
<font color="{$fontColor}">
<td colspan="4">Overall Test Result:<xsl:value-of select="$OVER_STATUS"/></td>
</font>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

xml是要按照,xslt定制的结构进行生成,或者换句话说,xslt样式要按照xml结构去做

xml结构

REPORT/LOG_ENTRY

REPORT下OVER_STATUS节点,这个是整个报告的结果,只有当所有条目为passed时才会为passed

每个LOG_ENTRY节点,代表一行数据

包括:

STATUS单行数据执行状态

EXECUTION_TIME执行时间

STEP_RESULT单步执行结果

COMPONENT_NAME组件名称,

STEP_DESCRIPTION步骤描述

当然这些都可以自已定义,可以自己增加或减少,但是xslt表中也要相对应的增加或减少

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="LOG.XSLT" type="text/xsl"?>
<REPORT>
<OVER_STATUS>PASSED</OVER_STATUS>
<LOG_ENTRY>
<STATUS>FAILED</STATUS>
<EXECUTION_TIME>2017.06.15 15:57:16</EXECUTION_TIME>
<STEP_RESULT>FAILED</STEP_RESULT>
<COMPONENT_NAME>704</COMPONENT_NAME>
<STEP_DESCRIPTION>{u'nextUrl': u'http://www.elong.com', u'message': u'\u9a8c\u8bc1\u7801\u9519\u8bef', u'code': u'704', u'success': False, u'isShowVerifyCode': True}</STEP_DESCRIPTION>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>FAILED</STATUS>
<EXECUTION_TIME>2017.06.15 15:57:16</EXECUTION_TIME>
<STEP_RESULT>FAILED</STEP_RESULT>
<COMPONENT_NAME>704</COMPONENT_NAME>
<STEP_DESCRIPTION>{u'nextUrl': u'http://www.elong.com', u'message': u'\u9a8c\u8bc1\u7801\u9519\u8bef', u'code': u'704', u'success': False, u'isShowVerifyCode': True}</STEP_DESCRIPTION>
</LOG_ENTRY>
</REPORT>

下面上,生成xml的python代码,这个创建xml结构就很简单了.

使用xml.dom.minidom就可以了,掌握几个要点很容易就创建一个xml

1,创建一个xml文档

import xml.dom.minidom as xmlDoc  #xmlDoc起的别名

xmldoc = xmlDoc.Document

2.因为我们要使用xslt样式,所以呢.

创建的xml第一行是xml头    <?xml version="1.0" encoding="utf-8"?> 这样python默认已经有了,就不用我们创建了,那么

第二行,我们要写样式头 <?xml-stylesheet href="LOG.XSLT" type="text/xsl"?>   头中写了引用相同目录下的LOG.XSLT ,类型TEXT/XSL

要注意一点href属性不要写成这样D:\demo\LOG.XSLT 这样写会有问题,只要把这个文件和xml放在同一目录就好了.

            #xml样式
xlstNode = xmlD.createProcessingInstruction("xml-stylesheet","href=\"LOG.XSLT\" type=\"text/xsl\"")
xmlD.appendChild(xlstNode)

3.创建一个REPORT根节点,你也可以起名ROOT,叫什么名字看你自己了

创建节点用,createElement,之后用appendChild增加节点到xml对象

            report = xmlD.createElement('REPORT')
xmlD.appendChild(report)

4.之后创建其它节点,一样用createElement,但是如果节点下要增加内容要用xmlDoc.createTextNode('passed')

以下代码意思是:创建一个over_status的节点,节点文本为passed,然后,将此节点增加到根节点REPORT下

            overStatus = xmlD.createElement('OVER_STATUS')
overStatus.appendChild(xmlD.createTextNode('PASSED'))
report.appendChild(overStatus)

有以上4点,基本创建一个xml没有问题了.

生成xml具体python代码:

以下代码创建根节点做为了一个单独的函数,之所以这么做因为要生成的报告,只创建一个根节点,和over_status 结果状态

其它累加的行放在了节点LOG_ENTRY下,一个根节点下可以有多个LOG_ENTRY节点........一个LOG_ENTRY节点代码一行数据执行结果

#*_*coding:utf-8*_*

import xml.dom.minidom as xmlDoc
import os
import gl
import sys class cREPORTXML(object):
def __init__(self):
self.__struct = self.createReportNode() #创建report节点
def createReportNode(self):
try:
xmlD = xmlDoc.Document() #xml样式
xlstNode = xmlD.createProcessingInstruction("xml-stylesheet","href=\"LOG.XSLT\" type=\"text/xsl\"")
xmlD.appendChild(xlstNode) report = xmlD.createElement('REPORT')
xmlD.appendChild(report) overStatus = xmlD.createElement('OVER_STATUS')
overStatus.appendChild(xmlD.createTextNode('PASSED'))
report.appendChild(overStatus) returnResult = []
returnResult.append(xmlD)
returnResult.append(report)
except Exception,ex:
return ex.message
return returnResult def writeReport(self,execTime,stepResult,comName,stepDisc):
#reportNodeList = self.createReportNode() entry = self.createLogEntry(self.__struct[0],execTime,stepResult,comName,stepDisc)
self.__struct[1].appendChild(entry)
self.writeXml(self.__struct[0],gl.reporterPath+'reportxml.xml')
#self.writeXml(self.__struct[0],gl.reporterPath+'reportxml_%s.xml'%(gl.curTimeStr))
#-------------创建xml格式-有多个相同的节点,并且该节点下有4个名称相同的子节点----------------
def createLogEntry(self,docObj,executeTime,stepResult,componentName,stepDiscription):
entry = docObj.createElement("LOG_ENTRY") status = docObj.createElement("STATUS")
nodeExecuteTime = docObj.createElement("EXECUTION_TIME")
nodeStepResult = docObj.createElement("STEP_RESULT")
nodeComponentName = docObj.createElement("COMPONENT_NAME")
nodeStepDiscription = docObj.createElement("STEP_DESCRIPTION") status.appendChild(docObj.createTextNode(stepResult))
nodeExecuteTime.appendChild(docObj.createTextNode(executeTime))
nodeStepResult.appendChild(docObj.createTextNode(stepResult))
nodeComponentName.appendChild(docObj.createTextNode(componentName))
nodeStepDiscription.appendChild(docObj.createTextNode(stepDiscription)) entry.appendChild(status)
entry.appendChild(nodeExecuteTime)
entry.appendChild(nodeStepResult)
entry.appendChild(nodeComponentName)
entry.appendChild(nodeStepDiscription)
return entry #参数,xml对象,准备存储xml文件路径,文件模式:读 and 写 (r and w)
def writeXml(self,xmlDoc,xmlPath):
f = open(xmlPath,"w")
xmlDoc.writexml(f,indent='\t', addindent='\t', newl='\n', encoding="utf-8") #中间的加了一些格式符,这样生成的xml自动对齐格式
f.close() if __name__=='__main__':
reportx =cREPORTXML()
print reportx.writeReport('','PASSED','1-SETTEXT','AUTOMATION TEST')
print reportx.writeReport('','FIELD','2-SETTEXT','AUTOMATION TEST')

用ie打开xml报告,当然可以看出总结果显示有点问题,这个不影响报告展示,代码中处理一下就好.

简单的报告就完成了,追求完美的可以在细化一下,增加一些其它信息,调整一下颜色.

Python基础(六) python生成xml测试报告的更多相关文章

  1. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  2. python学习笔记(生成xml)

    想着给框架加些功能 首先想到的是生成测试报告 这里就涉及到了生成什么格式的文件 我这边就准备生成 xml 格式的文件 自己先学习了整理了下 代码如下: #!/usr/bin/env python # ...

  3. Python&Selenium借助HTMLTestRunner生成自动化测试报告

    一.摘要 本篇博文介绍Python和Selenium进行自动化测试时,借助著名的HTMLTestRunner生成自动化测试报告 HTMLTestRunner.py百度很多,版本也很多,自行搜索下载放到 ...

  4. Python&Selenium借助html-testRunner生成自动化测试报告

    一.摘要 本博文将介绍Python和Selenium进行自动化测试时,借助html-testRunner 生成自动化测试报告 安装命令:pip install html-testRunner 二.测试 ...

  5. Python基础+Pythonweb+Python扩展+Python选修四大专题 超强麦子学院Python35G视频教程

    [保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -- ...

  6. python基础1 ---python简介

    python基础 一.python前言 1.什么是编程语言 编程语言是程序员与计算机之间沟通的介质. 2.编程语言的分类 机器语言:机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集 ...

  7. Python基础-1 python由来 Python安装入门 注释 pyc文件 python变量 获取用户输入 流程控制if while

    1.Python由来 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚 ...

  8. python基础实践 -python是一门动态解释性的强类型定义语言

    python是一门动态解释性的强类型定义语言 Python能做什么? Python是一门综合性的语言,你几乎能在计算机上通过Python做任何事情,以下是Python应该最广泛的几个方面: 1.网络应 ...

  9. python基础-初识Python和不同语言之间的区别

    一.Python的创始人谁? Python之父:吉多·范罗苏姆GuidovanRossum 吉多·范罗苏姆是一名荷兰计算机程序员,他作为Python程序设计语言的作者而为人们熟知.在Python社区, ...

随机推荐

  1. 使用Redis构建全局并发锁

    谈起Redis的用途,小伙伴们都会说使用它作为缓存,目前很多公司都用Redis作为缓存,但是使用Redis仅仅作为缓存未免太大材小用了.深究Redis的原理后你会发现它有很多用途,在很多场景下能够使用 ...

  2. xss的一般防护措施(及CreateDefaultBuilder源码)

    从上个礼拜开始,公司的安全小组就开始排查公司项目的安全性,首屈一指的就是xss问题,为此我总结了下我的经验. 1.对后台程序的输出数据做html编码处理,前端做简单的替换处理 2.如果业务需要,后台可 ...

  3. Linux基础系统优化

    Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和ip等参数 ifup,ifdown    脚本命 ...

  4. java线程系列之三(线程协作)

    本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7433673,转载请注明. 上一篇讲述了线程的互斥(同步),但是在很多情况 ...

  5. EL表达式与标签的使用

  6. python学习笔记1-python相关应用套件

    完整的数据分析套件 统计科学计算 Numpy,Scipy,statsmodels 深度学习 TensorFlow,MXNET 结构化数据处理与分析 Pandas 大数据处理 PySpark 数据探索编 ...

  7. C++调用C语言的库函数

    在项目中,使用C语言编写了一个socket后台程序tkcofferd,并且为方便客户端的使用,提供了动态库,其中包含socket接口. 现在的需求是使用qt做一个前端界面,用来展示tkcofferd的 ...

  8. Centos7 Nagios 搭建

    Nagios 是一款自动化运维工具,可以协助运维人员监控服务器的运行状况,并且拥有报警功能.本文章将介绍其安装方法和详细的配置方法. 总结 可以做资源,网络,应用服务的监控 配置上需要配置被监控的,服 ...

  9. VS2015中使用报表控件(ReportViewer)的方法

    没有报表,一般默认安装之后会出现这种情况,在安装的时候选择自定义安装,把Microsoft Office 开发人员工具.Microsoft SQL Server Data Tools勾选上,安装之后就 ...

  10. css----transition的应用,产生动画效果。

    应用transition属性产生动画效果 css中的transition属性设置元素的变化过程所需的时间. <!DOCTYPE html> <html> <head> ...