web自动化框架之四测试报告的搭建
现状:
看过前面的文章,楼主用的是python,所以在搭建测试报告这块的时候使用的是unittest+htmlTestRunner;然后发现生成出来的报告,总是有那么不完美的地方,比如想增加图片,比如显示风格改变下;然后尝试性的去修改了一个htmlTestRunner源码,虽然图片出来了,显示风格修改不了...so...萌生的弃意...
问题:
1.unittest
unittest当案例异常或脚本执行异常时,无法继续执行下个案例~,比如登录时,后台服务异常、登录用户无菜单权限异常、新增用户状态导致无法登录异常等等;
unittest.assertEqual、assertRaises等断言方法对复杂的功能逻辑难以处理~~,比如需要if/else、or、and组合用的逻辑判断。
2.htmlTestrunner
case测试数据输出信息不全,关键不能做一些炫酷的事,自动对接缺陷管理系统、自动验证缺陷(重点);
历史数据信息无法保存;
样式总有那么不满意的地方。
方案:
a.结果验证、测试参数输出、测试参数输出自己封装;
b.测试数据信息保存在mysql;
c.界面,jsp读取mysql数据展示。
技术实现:
a.略,后面专题介绍
b.数据库数据的插入与相关初始化
MySQLdb.py
#coding=utf-8
import MySQLdb
from com.iapppay.test.loginfo.loginfoobject import *
# reload(sys)
# reload(sys).setdefaultencoding('gbk')
# def printStr(**kwargs):
# return kwargs[0][3]
'''
runTime CREATE TABLE `runTime` (
`startTime` datetime DEFAULT NULL,
`endTime` datetime DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
casedata CREATE TABLE `casedata` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`casedata` varchar(2000) DEFAULT NULL COMMENT '案例参数',
`caseinfo` varchar(2000) DEFAULT NULL COMMENT '案例输出信息',
`status` varchar(6) DEFAULT NULL COMMENT '验证结果',
`casebank` varchar(2000) DEFAULT NULL COMMENT '备注',
`casetime` datetime DEFAULT NULL COMMENT '执行时间',
`system` varchar(12) DEFAULT NULL COMMENT '系统',
`action` varchar(12) DEFAULT NULL COMMENT '功能',
`imageinfo` varchar(2000) DEFAULT NULL COMMENT '图片信息',
`caseR` int(11) DEFAULT NULL COMMENT '案例点',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1159 DEFAULT CHARSET=utf8;
'''
insert = "insert into `casedata` (`casedata`, `caseinfo`, `status`, `casebank`, `casetime`, `system`, `action`) values('sasdasd','sadasd','fase','sdasd',NULL,'admin','login','caseR');"
#访问数据库
try:
conn =MySQLdb.connect(host="192.168.0.157",port=3306,user="root",passwd="123456",db="webTest",charset="utf8") #v35test_iapppay,webTest
except MySQLdb.Error as e:
logging.ERROR(e)
pass
#插入数据公共方法
def insertData(str):
cursor = conn.cursor()
try:
cursor.execute(str)
conn.commit()
except Exception as e:
logging.ERROR(e)
pass
conn.close
insertData.py
#coding=utf-8
'''
Created on 2014��7��17��
@author: Ф肖彬
'''
import time
#获取当前时间
def dateTime():
return time.strftime('%Y-%m-%d %H:%S',time.localtime(time.time()))
#初始化生成insert sql
def data(casedata,caseinfo,status,casebank,casetime,system,action,imageinfo):
data ="insert into `casedata`(`casedata`, `caseinfo`, `status`, `casebank`, `casetime`, `system`, `action`,`imageinfo`)values('"+casedata+"','"+caseinfo+"','"+status+"','"+casebank+"','"+casetime+"','"+system+"','"+action+"','"+imageinfo+"');"
return data
#对特殊字符处理
def returnargs(*args):
data =""
for i in (range(len(args))):
data += str(args[i])
data = data.replace("'","\\'")
return str(data)
#初始化时间插入sql
def runtimeData(startTime,endTime):
data = "insert into runTime(startTime,endTime) values ('"+startTime+"','"+endTime+"');"
return data
3.jsp页面访问
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%
String par = request.getParameter("pay");
%>
<style media="screen" type="text/css">
body { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
table { font-size: 100%; }
pre { }
/* -- heading ---------------------------------------------------------------------- */
h1 {
font-size: 16pt;
color: gray;
}
.heading {
margin-top: 0ex;
margin-bottom: 1ex;
}
.heading .attribute {
margin-top: 1ex;
margin-bottom: 0;
}
.heading .description {
margin-top: 4ex;
margin-bottom: 6ex;
}
.overflow{
overflow:auto;
}
#show_detail_line {
margin-top: 3ex;
margin-bottom: 1ex;
}
</style>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>爱贝自动化监控界面</title>
</head>
<body>
<script language="javascript" type="text/javascript">
alert(<%=par%>);
/* level - 0:pass; 1:false; 2:error 3:all */
function showCase(level){
if (level == 0){
par = "hello1";
alert(<%=par%>);
}
if (level == 1){
par = "hello2";
alert(<%=par%>);
}
if (level == 2){
par = "hello3";
alert(<%=par%>);
}
if (level == 3){
par = "hello4";
alert(<%=par%>);
}
}
</script>
<div class='heading'>
<h1>爱贝自动化测试监控</h1>
<p class='attribute'><strong>Start Time:</strong> 2014-07-16 16:17:45</p>
<p class='attribute'><strong>Duration:</strong> 0:00:00.027000</p>
<p class='attribute'><strong>Status:</strong> pass 1 false 1 error 1</p>
</div>
<p id='show_detail_line'>测试结果:
<a href='javascript:showCase(0)'>Pass</a>
<a href='javascript:showCase(1)'>false</a>
<a href='javascript:showCase(2)'>Error</a>
<a href='javascript:showCase(3)'>All</a>
</p>
<div class = 'heading'>
<table border=1 style="table-layout:fixed;word-wrap:break-word;" width="100%" id = 'overflow' >
<tr>
<td width ="3%">ID</td>
<td width ="20%">测试数据</td>
<td width ="20%">测试输出</td>
<td width ="5%">测试结果</td>
<td width ="10%">测试备注</td>
<td width ="10%">执行时间</td>
<td width ="5%">系统</td>
<td width ="5%">action</td>
<td width ="5%">图片</td>
</tr>
<%
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection con=java.sql.DriverManager.getConnection("jdbc:mysql://192.168.0.157/webTest?useUnicode=true&characterEncoding=utf-8","root","123456");
Statement stmt=con.createStatement();
ResultSet rst=stmt.executeQuery("select id,casedata,caseinfo,status,casebank,casetime,system,action,imageinfo from casedata order by id desc");
while(rst.next())
{
out.println("<tr>");
out.println("<td>"+rst.getString("id")+"</td>");
out.println("<td>"+rst.getString("casedata")+"</td>");
out.println("<td>"+rst.getString("caseinfo")+"</td>");
out.println("<td>"+rst.getString("status")+"</td>");
out.println("<td>"+rst.getString("casebank")+"</td>");
out.println("<td>"+rst.getString("casetime")+"</td>");
out.println("<td>"+rst.getString("system")+"</td>");
out.println("<td>"+rst.getString("action")+"</td>");
//out.println("<td>"+rst.getString("imageinfo")+"</td>");
out.println("<td>"+"<img src="+"/data/201407212947_1.jpg"+">"+"</img>"+"</td>");
out.println("</tr>");
}
//关闭连接、释放资源
rst.close();
stmt.close();
con.close();
%>
</table>
</div>
</body>
</html>
注意:需要导入com.mysql.jdbc.Driver lib包
最后:到这里,一套测试报告搭建完毕,最后是往数据表里面插入测试的相关数据就哦了
web自动化框架之四测试报告的搭建的更多相关文章
- 基于Selenium的web自动化框架
转自 : https://www.cnblogs.com/AlwinXu/p/5836709.html 1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台. ...
- 【转】基于Selenium的web自动化框架(python)
1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Sel ...
- Web自动化框架LazyUI使用手册(2)--先跑起来再说(第一个测试用例-百度搜索)
作者:cryanimal QQ:164166060 上篇文章中,简要介绍了LazyUI框架,本文便来演示,如何从无到有快速搭建基于lazyUI的工程,并成功运行第一个测试用例. 本文以百度搜索为例,选 ...
- Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)
概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...
- web自动化框架如何设计
web自动化框架如何设计po模式总结: 1. 页面对象模型:当页面特别多的时候,代码更好的维护 2. Po是pageObject设计模式,用来管理和维护一组web元素的对象库 3. 每一个page c ...
- 基于Selenium的Web自动化框架增强篇
在写完上一篇“基于Selenium的Web自动化框架”(http://www.cnblogs.com/AlwinXu/p/5836709.html)之后一直没有时间重新审视该框架,正好趁着给同事分享的 ...
- Web自动化框架搭建——前言
1.web测试功能特性 a.功能逻辑测试(功能测试),这一块所有系统都是一致的,比如数据的添加.删除.修改:功能测试案例设计感兴趣和有时间的话可以另外专题探讨: b.浏览器兼容性测试,更重要的是体验这 ...
- Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)
标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力 ...
- Web自动化框架LazyUI使用手册(1)--框架简介
作者:cryanimal QQ:164166060 web端自动化简介 web端自动化,即通过自动化的方式,对Web页面施行一系列的仿鼠标键盘操作,以达到对Web页面的功能进行自动化测试的目的. 其一 ...
随机推荐
- *[codility]CartesianSequence
https://codility.com/programmers/challenges/upsilon2012 求笛卡尔树的高度,可以用单调栈来做. 维持一个单调递减的栈,每次进栈的时候记录下它之后有 ...
- MVC下基于DotNetOpenAuth 实现SSO单点登录
具体官网可以查看:http://dotnetopenauth.net/,托管地址:https://github.com/DotNetOpenAuth/DotNetOpenAuth 可能需要FQ 博客园 ...
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) { return i1 + i2;//如果不写return返回 ...
- Maven Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean Failed to delete access_log
I'm trying to run simple struts project using maven and tomcat. When I'm trying to exucute next goal ...
- ServletContentLIstener接口演示ServletContext的启动和初始化
ServletContextListener接口中包含两个方法,一个是contextInitialized()方法, 用来监听ServletContext的启动和初始化:一个是contextDestr ...
- 【原创】Kmeans算法 优缺点分析
优点: 原理简单(靠近中心点),实现容易(1.2 天),聚类效果中上(依赖K的选择) 缺点: 1. 无法确定K的个数 (根据什么指标确定K) 2. 对离群点敏感 (容易导致中心点偏移) 3. 算法复杂 ...
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
在部署的时候出现Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server ...
- IIS发布报错
IIS发布报错一般原因 ISAPI和CGI限制作为IIS与ASP.NET的连接桥梁
- How to upgrade boost libary using apt-get ?
apt-get install libboost1.55-all-dev using version number between boost and all, but the preconditio ...
- java中四种操作(dom、sax、jdom、dom4j)xml方式详解与比较
1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特 ...