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页面的功能进行自动化测试的目的. 其一 ...
随机推荐
- Java并发包中常用类小结(一)
从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来简单看一下相关的一些常见类的使用情况. 1.ConcurrentHashMap Concurre ...
- Android 程序运行之后,禁止休眠
在程序中添加 // 禁止休眠功能 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager. ...
- 【Linux高频命令专题(8)】五大查询命令
find 格式 find 路径 -命令参数 [输出形式] 路径:告诉find在哪儿去找你要的东西 命令参数:参考下面 输出形式:输出形式很多,-print,-printf,-print,-exec,- ...
- http怎样保持有状态?
HTTP协议的特点 HTTP协议是无状态的协议,发送的请求不记录用户的状态,不记录用户的信息.就相当于它被访问了2次,不知道是哪两人访问的,或者是一个人访问两次. 正是因为HTTP协议的这一特点,用户 ...
- SQLite数据插入异常
对比两条SQL语句 1.insert into MemberInfo(MTypeId,MName,MPhone,MMoney,MIsDelete) values(@tid,@name,@phone,@ ...
- 72. Edit Distance
题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to w ...
- 基于SMB协议的共享文件读写 博客分类: Java
基于SMB协议的共享文件读写 博客分类: Java 一.SMB协议 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445. 服务器信息块(SMB)协议是一种IBM协议,用于在计 ...
- php命令行用法简介
Php是一个非常流行的web服务端脚本语言.其实,php不仅仅可以在web服务器中充当重要角色.在命令行一样可以执行. 本文中,笔者为各位介绍下php在命令行中的使用方法. 1. 查看php的版本. ...
- myeclipse快速开发配置
1,打开MyEclipse 2013然后“window”→“Preferences” 2. 选择“java”,展开,“Editor”,选择“Content Assist”. 3. 选择“Content ...
- Camel、Pastal、匈牙利标记法区别及联系
在英语中,依靠单词的大小写拼写复合词的做法,叫做"骆驼拼写法"(CamelCase).比如,backColor这个复合词,color的第一个字母采用大写. 这种拼写法在正规的英语中 ...