开源一个爬取redmine数据的测试报告系统

背景

软件测试的最后有一道比较繁琐的工作,就是编写测试报告。手写测试报告在数据统计和分析上面要耗费比较大的事件和精力。之前工作室使用mantis管理bug缺陷。公司有内部有个系统,可以直接从mantis上面获取数据并进行统计,生成一份测试报告。后来换了一个工作室,bug缺陷管理平台也从原来的mantis 换成了redmine (http://www.redmine.org/ )。 然后走上了一条手写测试报告的不归路(测试人员前期还是推荐手写测试报告的)。搞游戏的都知道,平时加班加点压力就够大的。急需一个接redmine的测试报告系统。

至此,交代完毕为啥要写这么一个简单的测试报告系统。

要求或者需求:

  • 操作要足够简单
  • 尽量独立系统

开发技术:java/jsp

设计思路

数据来源:

照理来说,由于工作室内部自己搭的redmine,所以数据获取应该可以直接读取redmine 的数据库就好了。我觉得这样系统的依赖性较高,不够独立。而且问过接mantis 的测试报告系统的开发,他们是直接从mantis 上面爬取数据的。所以最终,我也是直接从redmine上爬取数据的。

数据存储:

由于测试报告系统一般就测试人员使用(特别是动态网页),其他人顶多也就查看静态的测试报告也没而已。所以系统对性能要求不高。所以没有使用数据库软件,我是直接用文本文件来记录数据。有一个原因是因为我觉得用了数据库,需要配置、部署数据库,万事都相对比较麻烦。反正没啥性能要求,直接就用文本吧。

简单架构

架构

系统从远端redmine爬取数据,根据用户选择爬取某一个版本的数据。并且读取测试报告模板和数据生成一份测试报告。并将测试报告发送给相应的人员和保存测试报告的静态文件(用户查看历史测试报告)。

 

几个核心问题和技术

  • http请求——HttpClient
  • 数据统计及图片生成——JFreeChart
  • 前端展示数据统计结果——Charts.js
  • mail库——mail
  • 数据存储——gson

爬取和过滤

爬取回来的是一个html文件,需要从html文件里面提取出需要的数据,这里使用正则表达式提取。

数据统计

数据统计前端主要用Charts.js 来即时展示数据的结果。由于邮件里面的js是无效的。所以最终的统计结果用JFreeChart第三方库转换成图片。

数据存储

其实用的是文本存储,所以用的就是java的文件的读写操作而已。使用到了gson是因为存储的数据用了json格式。gson很好用。

mail

发送邮件用的是mail.jar这个库。至于这个库为啥我不用密码就能够发生出去,我也不太清楚。这可能跟邮件供应商有关系。

另外由于发生邮件需要发送图片,这里纠结了一番。如果图片存储在服务器,一旦服务器不正常(停电、断网什么的),测试报告就显示不了图片了。那么可以考虑使用附件发送出去。但发送附件可能会被定为垃圾邮件。最后选择将图片转换成数据,直接写入到html里面,解决噻~。下面是将图片转换成数据的源代码。

复制代码
 /** Convert PNG to Base64* path the PNG path* */public static String getBase64Png(String path) throws Exception {String msg=”";try{ BufferedImage image = ImageIO.read(new File(path));ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(image, ”png”, baos);msg = Base64.encode(baos.toByteArray());}catch(IOException e){e.printStackTrace();} return msg;}
复制代码

 

一个小问题

我直接将redmine 地址改成redmine官方地址http://www.redmine.org ,结果爬取数据的时候报错了。是因为我爬取一个表的时候,表结构不一样。官方的remine 比我们工作室使用的redmine 在某个表少了一个字段。如果你也遇到了,可能需要改一下源代码才能正常允许了。

例子

项目和版本选择界面

版本选择界面

测试报告编写页面

编写测试报告

一个静态的测试报告例子。直接点击:http://www.veiyn.com/study/TestReport.html 可以查看。(点击查看源代码可以发现图片是保存在html里面的)

题外

源代码:https://github.com/rondsny/TestReport/

记得使用的时候一定要先配置config.properties 文件:

复制代码
PT_URL =http://www.redmine.org                              #redmine平台地址    必需
MAIL_HOST =mail.test.com                                         #邮件服务器地址      必需
MAIL_FROM =name1@test.com                                  #默认发件人   非必需
MAIL_TOS =name2@test.com|name3@test.com        #默认收件人   非必需
复制代码

 

共勉之!

个人小博客原文地址:http://www.veiyn.com/?p=66

本文转自 Ron Ngai 博客园博客,原文链接:http://www.cnblogs.com/rond/p/3878505.html  ,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java cxf 双向通讯_CXF 在spring boot 2 发布多个服务

0. 问题来源之前配置cxf服务端都是在spring 3以下,后来使用spring mvc 还都是基于xml的配置文件模式,在springboot模式下,实现起来更为简单了。此次记录下spring boot 2下的实现方式。1. 准备工作项目中,直接拉入spring boot cxf相…

小程序 坚屏_如何构建坚如磐石的应用程序

小程序 坚屏不同的应用程序设计选项概述 (An overview of different app design options) When we design software, we constantly think about error cases. Errors have a huge impact on the way we design and architecture a solution. So much so, in fact, that there …

C# 分层

三层架构分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上实体类库(Model) 转载请注明出自朱朱家园http://blog.csdn.net/zhgl7688 1、实体类库(Mod…

leetcode1177. 构建回文串检测(前缀和)

给你一个字符串 s,请你对 s 的子串进行检测。 每次检测,待检子串都可以表示为 queries[i] [left, right, k]。我们可以 重新排列 子串 s[left], …, s[right],并从中选择 最多 k 项替换成任何小写英文字母。 如果在上述检测过程中&#xf…

java界面化二叉排序树_层次序创建二叉树(图形界面和控制台输入实现)

1 2018.11.72 XT34 /**5 * 功能:构造二叉树6 * 说明:7 * 1.主函数输入模式有两种,BT参数 true 图形界面,false 控制台输入8 * 2.构造树是按层次遍历结果输入的 如:ABCDE*F**GH9 */1011 import javax.swing.*;12 import…

web开发环境_Web开发人员的开发环境

web开发环境With all the tools and programs available, it can be challenging to figure out the best way to set up your development environment on your computer.使用所有可用的工具和程序,寻找在计算机上设置开发环境的最佳方法可能是一项挑战。 In this…

使用.net Stopwatch class 来分析你的代码

当我们在调试,优化我们的代码的时候,想知道某段代码的真正的执行时间,或者我们怀疑某段代码,或是某几段代码执行比较慢, 需要得到具体的某段代码的具体执行时间的时候。有一个很好用的类Stopwatch。 Stopwatch 类在 Sy…

Docker 部署 postgresql 与 pgadmin4

Docker快速部署PostgreSQL服务 快速开始 请新建一个目录postgresql,进入目录postgresql,将以下文件保存为docker-compose.yml,然后执行docker-compose up version: 3 services:mydb:image: postgres:11volumes:- db-data:/var/lib/postgresql…

leetcode151. 翻转字符串里的单词

给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1&#xff1a; 输入: “the sky is blue” 输出: “blue is sky the” 代码 class Solution {public String reverseWords(String s) {int ns.length(),i0;ArrayList<String> arrayListnew ArrayList<…

java衍生作用_java-如何从AffineTransform衍生的形状对象中“...

您可以使用AffineTransform.transform(Point2D, Point2D)变换多边形上的单个点.如果您不使用旋转变换来移动船,而是将船的位置保持在一个(x,y)位置,那么事情就简单得多.您可以在move()中移动飞船的位置,而不是尝试平移多边形.然后,当您想给船上油漆时,例如做&#xff1a;// Opt…

初学者设计数据库_面向初学者的完整数据库设计课程

初学者设计数据库This database design course will give you a deeper grasp of database design. Caleb Curry teaches the equivalent of an entire college course during this eight hour video.本数据库设计课程将使您更深入地了解数据库设计。 在这8个小时的视频中&…

Qt QTcpSocket使用总结

socket的连接是异步的&#xff0c;所以必须等连接建立完成才能使用&#xff0c;所以分别加入waitForConnected()和waitForBytesWritten()后调试通过1&#xff09;只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器&#xff0c;并返回是否连接的结果2&#xff09;避…

[bzoj1303][CQOI2009]中位数图

来自FallDream的博客&#xff0c;未经允许&#xff0c;请勿转载&#xff0c;谢谢。 给定一个n个数排列&#xff0c;求有多少段长度为奇数的区间&#xff0c;中位数是b. n<100000 时间限制0.1s 我一开始没看到排列&#xff0c;想着怎么还能O(n)做的啊&#xff1f;&#xff1f…

falsk 请求没有返回值报错

线上报警 5xx 错误&#xff0c;查看日志发现报这个错&#xff0c; TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement. 这个方法没有有效的返回结果 页面报这个错误 Internal Server Err…

java的iterator接口_java Iterator接口和LIstIterator接口分析_java_脚本之家

java Iterator接口和LIstIterator接口分析目录1.Iterator接口2.ListIterator3.Iterator和ListIterator的区别正文在继续看ArrayList源码之前&#xff0c;先了解Iterator接口和ListIterator接口&#xff0c;下篇文章详细讲解ArrayList是如何实现它们的。我们知道&#xff0c;接…

leetcode468. 验证IP地址

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。 IPv4 地址由十进制数和点来表示&#xff0c;每个地址包含4个十进制数&#xff0c;其范围为 0 - 255&#xff0c; 用(".")分割。比如&#xff0c;172.16.254.1&#xff1b; 同时&#xff0c;IPv4 地…

播客#45:迪伦·以色列

On todays episode, I interview Dylan Israel. Dylan is a software engineer, a YouTuber, and the creator of several programming courses.在今天的一集中&#xff0c;我采访了迪伦以色列。 迪伦(Dylan)是一位软件工程师&#xff0c;一名YouTuber&#xff0c;并且是几门编…

PHPstorm快捷键

当前文件搜索类&#xff1a;ctrln 全文检索文件&#xff1a;ctrlshiftn 收起侧边栏&#xff1a;alt1&#xff08;自定义&#xff09; 个人学习记录&#xff0c;持续更新中。。。 转载于:https://www.cnblogs.com/zaijiang/p/7806260.html

JS基础_强制类型转换-Number

https://www.cnblogs.com/ZHOUVIP/p/7225267.html转载于:https://www.cnblogs.com/robinunix/p/11011188.html

JavaScript变量和作用域

JavaScript有两种变量&#xff0c;全局变量和局部变量 如果在任何函数定义之外声明了一个变量&#xff0c;则该变量是全局变量&#xff0c;且该变量的值在整个持续范围内都可以访问和修改 如果在函数定义内声明来了一个变量&#xff0c;则该变量为局部变量。每次执行该函数时都…