用DCG做单元测试报表
最近因为工作需要写了个将NUnit的XML结果输出转成报表的动态模板,我制作的样式虽然不太好看不过倒瞒实用的,有兴趣的朋友也可以去下载DCG来生成自己的报表哦!
下面是报表的示例。
D:\Visual Studio Projects\PWF-Framework\Framework\bin\Debug-UnitTests\PWF.Framework.exe |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
用例数量 | 27 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
失败个数 | 0 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
没运行个数 | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
日期 | 2005-4-15 9:38 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
准备人 | Seth Yuan | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
下面是相关的两个模板文件的内容:
UnitTestReport.dt
<%@ Template Name="" Language="C#" %>
<%@ Assembly Location="system.xml.dll" %>
<%@ Import Namespace="System.Xml" %>
<%@ Parameter Name="title" DataType="String" %>
<%@ Parameter Name="preparedBy" DataType="String" %>
<%@ Parameter Name="reportFileName" DataType="String" %>
<%
if (reportFileName == null || reportFileName.Length == 0) {
throw new ArgumentNullException("reportFileName");
}
XmlDocument doc = new XmlDocument();
doc.Load(reportFileName);
%>
<html>
<head>
<title><%=title%></title>
</head>
<body>
<TABLE cellSpacing="0" cellPadding="1" width="90%" align="center" border="0">
<!--DWLayoutTable-->
<TR>
<TD height="50" colspan="2" valign="top">
<P align="center"><FONT color="navy" size="5" face="黑体"><STRONG><%=doc.DocumentElement.Attributes["name"].Value%></STRONG></FONT></P></TD>
</TR>
<TR bgcolor="#FFFF99">
<TD width="97"><font size="2"><strong>用例数量</strong></font></TD>
<TD width="538" bgcolor="#FFFFCC"><font size="2"><%=doc.DocumentElement.Attributes["total"].Value%></font></TD>
</TR>
<TR bgcolor="#FFFF99">
<TD><font size="2"><strong>失败个数</strong></font></TD>
<TD bgcolor="#FFFFCC"><font color="#FF0000" size="2"><%=doc.DocumentElement.Attributes["failures"].Value%></font></TD>
</TR>
<TR bgcolor="#FFFF99">
<TD><font size="2"><strong>没运行个数</strong></font></TD>
<TD bgcolor="#FFFFCC"><font color="#FF9900" size="2"><%=doc.DocumentElement.Attributes["not-run"].Value%></font></TD>
</TR>
<TR bgcolor="#FFFF99">
<TD><font size="2"><strong>日期</strong></font></TD>
<TD bgcolor="#FFFFCC"><font size="2"><%=doc.DocumentElement.Attributes["date"].Value + " " + doc.DocumentElement.Attributes["time"].Value%></font></TD>
</TR>
<TR bgcolor="#FFFF99">
<TD><font size="2"><strong>准备人</strong></font></TD>
<TD bgcolor="#FFFFCC"><font size="2"><%=preparedBy%></font></TD>
</TR>
<TR>
<TD height="144" colspan="2" valign="top">
<% XmlNodeList testSuites = doc.DocumentElement.SelectNodes("/descendant::test-suite[./results/test-case]"); %>
<% foreach (XmlNode testSuiteNode in testSuites) { %>
<%= DCG.CallTemplate(DCG.FileInfo.Directory + "\\UnitTestReport-TestSuite.dt", new object[] {testSuiteNode}) %>
<% } %>
</TD>
</TR>
</TABLE>
</body>
</html>
UnitTestReport-TestSuite.dt
<%@ Template Name="" Language="C#" %>
<%@ Assembly Location="system.xml.dll" %>
<%@ Import Namespace="System.Xml" %>
<%@ Parameter Name="testSuiteNode" DataType="XmlNode" %>
<TABLE cellSpacing="0" cellPadding="1" width="100%" border="0">
<TR>
<TD colSpan="5" height="40">
<P align="center"><STRONG><FONT color="navy" size="4" face="黑体"><%=testSuiteNode.Attributes["name"].Value%></FONT></STRONG></P>
</TD>
</TR>
<TR>
<TD valign="top">
<P align="left"><FONT size="2"><STRONG>描述</STRONG></FONT></P>
</TD>
<TD colspan="4" valign="top">
<% if (testSuiteNode.Attributes["description"] != null) { %>
<P align="left"><font size="2"><%=testSuiteNode.Attributes["description"].Value%></font></P>
<% } %>
</TD>
</TR>
<TR>
<TD width="15%" valign="top">
<P align="left"><FONT size="2"><STRONG>结果</STRONG></FONT></P>
</TD>
<TD colspan="4" valign="top" width=".">
<% if (testSuiteNode.Attributes["success"] != null) { %>
<%-- 如果成功就用绿色,如果失败就用红色 --%>
<% bool success = bool.Parse(testSuiteNode.Attributes["success"].Value); %>
<% if (success) { %>
<P align="left"><FONT color="#009900" size="2">成功</FONT></P>
<% } else { %>
<P align="left"><FONT color="#FF0000" size="2">失败</FONT></P>
<% } %>
<% } %>
</TD>
</TR>
<TR>
<TD valign="top">
<P align="left"><FONT size="2"><STRONG>所用时间</STRONG></FONT></P>
</TD>
<TD colspan="4" valign="top">
<% if (testSuiteNode.Attributes["time"] != null) { %>
<P align="left"><FONT size="2"><%=testSuiteNode.Attributes["time"].Value%></FONT></P>
<% } %>
</TD>
</TR>
<TR>
<TD height="30" colspan="2">
<P align="center"><font size="2"><strong>描述</strong></font></P>
</TD>
<TD width="61">
<P align="center"><font size="2"><strong>已运行</strong></font></P>
</TD>
<TD width="55">
<P align="center"><font size="2"><strong>结果</strong></font></P>
</TD>
<TD width="78">
<P align="center"><font size="2"><strong>所用时间</strong></font></P>
</TD>
</TR>
<% bool firstLine = true; %>
<% XmlNodeList testCases = testSuiteNode.SelectNodes("results/test-case"); %>
<% foreach (XmlNode testCaseNode in testCases) { %>
<% if (firstLine) { %>
<TR bgcolor="gainsboro">
<TD colspan="2">
<% if (testCaseNode.Attributes["description"] != null) { %>
<P align="left"><FONT size="2"><%=testCaseNode.Attributes["description"].Value%></FONT></P>
<% } %>
</TD>
<TD>
<P align="center"><FONT size="2"><%=(bool.Parse(testCaseNode.Attributes["executed"].Value) ? "是" : "否")%></FONT></P>
</TD>
<TD>
<% if (testCaseNode.Attributes["success"] != null) { %>
<%-- 如果成功就用绿色,如果失败就用红色 --%>
<% bool success2 = bool.Parse(testCaseNode.Attributes["success"].Value); %>
<% if (success2) { %>
<P align="left"><FONT color="#009900" size="2">成功</FONT></P>
<% } else { %>
<P align="left"><FONT color="#FF0000" size="2">失败</FONT></P>
<% } %>
<% } %>
</TD>
<TD>
<% if (testCaseNode.Attributes["time"] != null) { %>
<P align="center"><FONT size="2"><%=testCaseNode.Attributes["time"].Value%></FONT></P>
<% } %>
</TD>
</TR>
<% } else { %>
<TR bgcolor="beige">
<TD colspan="2">
<% if (testCaseNode.Attributes["description"] != null) { %>
<P align="left"><FONT size="2"><%=testCaseNode.Attributes["description"].Value%></FONT></P>
<% } %>
</TD>
<TD>
<P align="center"><FONT size="2"><%=(bool.Parse(testCaseNode.Attributes["executed"].Value) ? "是" : "否")%></FONT></P>
</TD>
<TD>
<% if (testCaseNode.Attributes["success"] != null) { %>
<%-- 如果成功就用绿色,如果失败就用红色 --%>
<% bool success3 = bool.Parse(testCaseNode.Attributes["success"].Value); %>
<% if (success3) { %>
<P align="left"><FONT color="#009900" size="2">成功</FONT></P>
<% } else { %>
<P align="left"><FONT color="#FF0000" size="2">失败</FONT></P>
<% } %>
<% } %>
</TD>
<TD>
<% if (testCaseNode.Attributes["time"] != null) { %>
<P align="center"><FONT size="2"><%=testCaseNode.Attributes["time"].Value%></FONT></P>
<% } %>
</TD>
</TR>
<% } %>
<% firstLine = ! firstLine; %>
<% } %>
</TABLE>
还不知道的DCG的朋友,它是我做的一个动态代码生成器,其目的与CodeSmith一样,就是一个动态模板,更多关于DCG请看我Blog中的文章部分。
其实我也完全可以用XSLT来做这个转换,可是我很清楚XSLT的限制,而且它的语法布局不是特别的清晰,而且函数有限,总之做起来不直观,很慢。我更喜欢ASP的语法,这也是为什么我选择并制作了DCG。你问我为什么不用CodeSmith?因为我不太喜欢它的扩展方法,因为它不够开放,因为它的功能不够达到我的目的,很多的原因使我选择了自己制作。
转载于:https://www.cnblogs.com/cavingdeep/archive/2005/04/15/186832.html
用DCG做单元测试报表相关推荐
- statpot:使用mongo+bootstrap+highcharts做统计报表
最近做了一个统计项目,这个统计项目大致的需求是统计接口的访问速度.客户端会调用一个接口来记录接口的访问情况,我的需求就需要分析这些数据,然后做出个统计报表. 需求实现 最初的时候想着每天把这些接口访问 ...
- bi导入数据失败 power_会商业智能BI的人,做的报表都比别人好看
同样是做数据分析的,会商业智能BI的人做的报表都比别人好看.这是两种意义上的好看,一种是排版.色彩搭配等,颜值上的好看,另一种则是把数据分析结果展现地直观易懂上的"好看". 下面将 ...
- html如何与py_Web项目如何做单元测试?
你可能会用单元测试框架,python的unittest.pytest,Java的Junit.testNG等. 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x ...
- xcode 5 使用 XCTest 做单元测试
xcode 5 使用 XCTest 做单元测试 什么是单元测试,请看 百度百科 单元测试 一:在xcode5 之前,我们新建项目时,可以选择是否集成单元测试:如今在xcode5,我们新建立的项目默认就 ...
- 前端抢饭碗系列之Vue项目如何做单元测试
大家好,我是若川.今天分享一篇vue项目如何做单元测试的好文,文章比较长,建议先收藏,需要时用电脑看. 点击下方卡片关注我.加个星标 学习源码系列.年度总结.JS基础系列 关于单元测试,最常见的问题应 ...
- 使用MS Test做单元测试
声明:本篇博客翻译自:http://www.c-sharpcorner.com/article/unit-testing-with-ms-tests-in-c-sharp/ 写在翻译之前: 依然清晰的 ...
- python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...
使用Jython对Java做单元测试,当然,为了测试开发java代码.这涉及到引入第三包的问题,如何导入第三方的包? 您可以使用http://blog.csdn.net/powerccna/artic ...
- 使用NUnit做单元测试(总结版)
使用NUnit做单元测试(总结版) [按:有关于NUnit的详细介绍请见:<NUnit2.0详细使用方法 >http://confach.cnblogs.com/archive/2005/ ...
- 使用DBUnit做单元测试
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! DBUn ...
最新文章
- Upwork 发布最赚钱的编程语言 Top 15
- 日记-致我那易逝的时光
- MYsql:net start mysql 失败 发生系统错误5
- MySQL Workbench导出数据库
- Kafka(六)Kafka基本客户端命令操作
- SLAM GMapping(5)运动模型
- attachEvent中this指向(转)
- string类的函数
- Delphi Form Designer (窗体设计器)之一
- android imagebutton 设置边框,【Android技巧】ImageButton 去边框 添加按下效果
- excel两个表格数据对比_Excel表格中数据比对和查找的几种技巧
- 品优购06——运营商后台(商品管理)
- 大数据平台开发公司有哪些?
- 3DMAX场景渲染失败怎么办?
- python程序设计课程标准_《Python程序设计》课程标准
- SphereEx 创始人张亮荣获『2021 年度海纳奖——分布式数据库十佳实践人物』
- 手把手教你---猿如意之八大高效利器使用
- JVM:垃圾收集器与内存分配策略
- 美团即时零售的优势不止“快”
- TensorFlow实现多层感知机
热门文章
- 为什么DC不会将对应的DFF换成scan DFF 的原因
- 用c语言写的跟踪算法,浅谈STC跟踪算法
- 关于校园一卡通的便携化及Mifare M1卡的内部结构
- 银行卡列表之背景颜色自动识别
- windows10墙纸_如何在Windows 7中的多台显示器上使用不同的墙纸
- openwrt上opkg更新报错opkg_download: Failed to download .............
- Ollydbg使用指南
- IDEA插件之代码质量检查利器 - Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint
- 单相逆变器及基于STM32 SPWM生成代码
- 聚焦IT业:I与T分道扬镳==来自 techtarget中文网站