1. 前言

最近为Taffy自动化测试框架写了个页面,主要实现了用例管理、执行,测试报告查看管理、发送邮件及配置等功能。
 
本页面适用所有基于taffy/nose框架编写的自动化测试脚本,或基于unittest等其他单元测试框架编写的自动化测试脚本亦可(只需进行小小的改动)。

2. 实现细节

页面使用Python Flask +Bootstrap开发,还有部分JS。

2.1 安装相关lib

pip install flask
pip install flask-bootstrap
pip install flask-wtf
pip install nose
pip install nose-html-reporting
其中nose-html-reporting是nose框架生成html报告插件,需要修改__init__.py编码方式为utf-8 (示例路径为C:\Python27\Lib\site-packages\nose_html_reporting\__init__.py),在文件最上方import中添加
reload(sys)
sys.setdefaultencoding("utf-8")

在文件最下方_format_output方法中修改return o.decode('latin-1')为return o.decode('utf-8')

 

2.2 下载Bootstrap

1) 从官网http://v3.bootcss.com/,下载最新Bootstrap版本
 

3) 解压下载的bootstrap-3.3.7.zip,其中dashboard模板目录为bootstrap-3.3.7\docs\examples\dashboard

2.3 Taffy_Web项目基本结构

 
1) app文件夹存放的有static静态文件,templates模版文件 (Bootstrap dashboard模版及css等文件就分别放在这2个目录下)
2) forms.py为表单文件,这里主要是配置文件用到
3) views.py为视图文件,主要存放视图函数
4) config.yml是配置文件
5) run.py是启动文件,使用python run.py即可启动整个项目
 

2.4 核心代码讲解

我们以核心的运行测试用例为例,详细讲解下整体的实现思路。

2.4.1 “运行测试”按钮通过onclick绑定了一个runCase()的js方法

<button type="button" id="run-case" class="btn btn-success" onclick="runCase()">运行测试</button>

2.4.2 runCase() js方法

实现思路如下:
1) 首先调用getSelect()方法获取当前选中的测试用例,未选中任何用例时会弹出警告消息
2) 通过Http Post方法调用views.py中定义的runcCase视图函数(传入参数为选中文件列表)
3) 最后根据返回结果判断测试执行成功或失败
function runCase() {
var params = {};
var selects=getSelect();
var button=$("#run-case"); if(selects == "") {
alertMessage('未选中任何文件!','warning');
}
else {
button.attr("disabled", true);
params["caseFiles"]=selects;
alertMessage("后台运行测试中,请稍候...");
$.post("/runCase",params,function(result){
if (result['desc']=='0' || result['desc']) {
alertMessage('测试运行完成,返回码:<strong>'+result['desc']+'</strong>.\t<a href="report" class="alert-link">点击查看报告!</a>');
//刷新用例列表
getCase();}
else {
alertMessage(result['desc'],'danger');}
button.removeAttr("disabled");
});
}
}

2.4.3 views.py中定义的runcCase视图函数

实现思路如下:
1) 首先从Post请求参数中获取需要运行的caseFiles列表,进行格式化处理(文件包含在双引号“”中,且以空格分隔)
2) 读取配置文件,生成测试报告路径及名称
3) 拼接生成nosetests运行测试用例并导出测试报告命令,使用os.system()运行
4) 最后判断配置项是否需要测试完成自动发送报告邮件,调用封装好的sendReportMail()方法
@app.route("/runCase", methods=["GET", "POST"])
def runCase():
if request.method == "POST":
# 获取数组参数
caseFiles = request.form.getlist("caseFiles[]")
result = {}
try:
caseFiles = ' '.join(map(lambda i: '"' + i + '"', caseFiles)).encode('gbk')
config = yaml.load(file(CONFIG_FILE, 'r'))
# Taffy路径
taffy_dir = config['taffy_dir']
# 测试报告名称
report_name = config['report_name'] + '_{0}.html'.format(dt.now().strftime('%Y%m%d_%H%M%S'))
# 先判断文件夹是否存在,不存在则新建
reportDir = os.path.join(taffy_dir, 'Results')
if not os.path.exists(reportDir):
os.makedirs(reportDir)
# 测试报告路径
report_file = os.path.join(reportDir, report_name)
command = 'nosetests -v {0} --with-html --html-report="{1}"'.format(caseFiles, report_file.encode('gbk'))
result['desc'] = os.system(command) # 判断是否自动发送结果邮件
if config['auto_send']:
result = sendReportMail(report_file)
except Exception as e:
result['exception'] = u'用例运行失败:{0}'.format(e)
return jsonify(result)

3. 成果展示

3.1 示例视频

我录制一个简短的操作示例视频:http://v.youku.com/v_show/id_XMzIzMzg5MDcwNA==.html

3.2 示例图片

3.2.1 首页

3.2.2 用例

3.2.3 报告

3.2.4 配置

 

4. 源码下载

5. 参考资料

1) PDF 《FlaskWeb开发:基于Python的Web应用开发实战》
2) Bootstrap: http://v3.bootcss.com/
6) 代码高亮插件:http://prismjs.com/

Taffy Web开发,Python Flask实践详解的更多相关文章

  1. Taffy自动化测试框架Web开发,Python Flask实践详解

    1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能.   本页面适用所有基于taffy/nose框架编写的自动化测试脚本,或基于un ...

  2. python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pi ...

  3. Python基础知识详解 从入门到精通(七)类与对象

    本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...

  4. VirtualBox开发环境的搭建详解(转)

    VirtualBox开发环境的搭建详解   有关VirtualBox的介绍请参考:VirtualBox_百度百科 由于VirtualBox官网提供的搭建方法不够详细,而且本人在它指导下,从下载所需的开 ...

  5. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

  6. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  7. iOS 开发之照片框架详解

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

  8. nginx高性能WEB服务器系列之四配置文件详解

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  9. Python之print详解

    Python之print详解 http://www.jb51.net/article/55768.htm   print的一些基本用法,在前面的讲述中也涉及一些,本讲是在复习的基础上,尽量再多点内容. ...

随机推荐

  1. Fibonacci Numbers

    Fibonacci Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  2. KMP (next数组的性质及证明)

    性质:如果len%(len-next[len-1])==0,则字符串中必存在最小循环节,且循环次数即为len/(len-next[len-1]); 证明:在前len个字符组成的字符串,存在最小循环节k ...

  3. Elasticsearch集群调优

    系统调优 禁用swap 使用swapoff命令可以暂时关闭swap.永久关闭需要编辑/etc/fstab,注释掉swap设备的挂载项. swapoff -a 如果完全关闭swap不可行,可以试着降低s ...

  4. AngularJS学习篇(十三)

    AngularJS HTML DOM ng-disabled 指令 ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性. <!DOCTYPE html> ...

  5. HTML学习笔记 基础标签及css引用案例 第一节 (原创)参考使用表

    <!DOCTYPE html><!--头文件 不是标签 也没有结束,这是声明该文件为HTML5--><html lang="en"><!- ...

  6. for循环中执行setTimeout问题

    代码片段: for(var i=0;i<8;i++){ setTimeout(function () { console.log(i) },0) } 输出了8次8,这跟js的执行顺序和作用域链有 ...

  7. MVC页面静态化

    MVC 页面静态化   最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...

  8. C#中抽象类与接口的区别

    1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象 ...

  9. .Net中各种不同的对象创建方式的速度差异

    在.Net中,微软给我们提供了很多不同的创建对象实例的方法,它们的速度又各有不同,以下一一列举. 使用new关键字 这在.Net中是最常见,也是速度最快的方式:                     ...

  10. selenium3.7+ python3 添加cookie模拟登陆

    一.背景介绍 最近做一个爬虫项目,用selenium调用浏览器去获取渲染后的源码,但是每次登陆都需要手机验证,这真的是头痛啊,这种验证方式不要想着去破解,还是老老实实用手机收验证码去吧!反正我是不知道 ...