Taffy自动化测试框架Web开发,Python Flask实践详解
1. 前言
2. 实现细节
2.1 安装相关lib
pip install flask
pip install flask-bootstrap
pip install flask-wtf
pip install nose
pip install nose-html-reporting
reload(sys)
sys.setdefaultencoding("utf-8")

在文件最下方_format_output方法中修改return o.decode('latin-1')为return o.decode('utf-8')
2.2 下载Bootstrap
3) 解压下载的bootstrap-3.3.7.zip,其中dashboard模板目录为bootstrap-3.3.7\docs\examples\dashboard
2.3 Taffy_Web项目基本结构

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方法
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视图函数
@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 示例视频
3.2 示例图片
3.2.1 首页

3.2.2 用例



3.2.3 报告



3.2.4 配置

4. 源码下载
5. 参考资料
Taffy自动化测试框架Web开发,Python Flask实践详解的更多相关文章
- Taffy Web开发,Python Flask实践详解
1. 前言 最近为Taffy自动化测试框架写了个页面,主要实现了用例管理.执行,测试报告查看管理.发送邮件及配置等功能. 2. 实现细节 页面使用Python Flask +Bootstrap开发,还 ...
- 《手把手教你》系列基础篇(八十三)-java+ selenium自动化测试-框架设计基础-TestNG测试报告-下篇(详解教程)
1.简介 其实前边好像简单的提到过测试报告,宏哥觉得这部分比较重要,就着重讲解和介绍一下.报告是任何测试执行中最重要的部分,因为它可以帮助用户了解测试执行的结果.失败点和失败原因.另一方面,日志记录对 ...
- 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...
- 《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程)
1.简介 TestNG还为我们提供了测试的记录功能-日志.例如,在运行测试用例期间,用户希望在控制台中记录一些信息.信息可以是任何细节取决于目的.牢记我们正在使用Selenium进行测试,我们需要有助 ...
- Java自动化测试框架-12 - TestNG之xml文件详解篇 (详细教程)
1.简介 现在这篇,我们来学习TestNG.xml文件,前面我们已经知道,TestNG就是运行这个文件来执行测试用例的.通过本篇,你可以进一步了解到:这个文件是配置测试用例,测试套件.简单来说,利用这 ...
- web开发工具flask中文英文书籍-持续更新
web开发工具flask中文英文书籍-持续更新 python测试开发_AI命理关注 0.9222018.11.10 07:48:43字数 625阅读 885 python测试开发项目实战-目录 pyt ...
- Android安卓书籍推荐《Android驱动开发与移植实战详解》下载
百度云下载地址:点我 Android凭借其开源性.优异的用户体验和极为方便的开发方式,赢得了广大用户和开发者的青睐,目前已经发展成为市场占有率很高的智能手机操作系统. <Android驱动开发与 ...
- Python基础知识详解 从入门到精通(七)类与对象
本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...
- VirtualBox开发环境的搭建详解(转)
VirtualBox开发环境的搭建详解 有关VirtualBox的介绍请参考:VirtualBox_百度百科 由于VirtualBox官网提供的搭建方法不够详细,而且本人在它指导下,从下载所需的开 ...
随机推荐
- 权限管理,pymysql模块
权限管理 权限管理重点 MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL ...
- ReentrantReadWriteLock分析
ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁 线程进入读锁的前提条件: 没有其他线程的写锁, 没有写请求或者有读请求,但调用线程和持有锁的线程是同一个 线程进 ...
- POJ 1740 A New Stone Game(博弈)题解
题意:有n个石子堆,每一个都可以轮流做如下操作:选一个石堆,移除至少1个石子,然后可以把这堆石子随便拿几次,随便放到任意的其他石子数不为0的石子堆,也可以不拿.不能操作败. 思路:我们先来证明,如果某 ...
- 解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]
MyEclipse出现下面两条报错: The project cannot be built until build path errors are resolved HelloWord Unknow ...
- Unity3D学习笔记(十五):寻路系统
动画生硬切换:animation.play();//极少使用,常用融合方法 动画融合淡入:animation.CrossFade(“Idle”, 0.2f);//0.2f为与前一动画的融合百分比为20 ...
- undefined!=false之解 及==比较的规则
JS中有一个基本概念就是: JavaScript中undefined==null 但undefined!==null undefined与null转换成布尔值都是false 如果按照常规想法,比如下面 ...
- 12_Python操作MySQL(basic)
""" Test connection to MySQL using mysql-client conn = MySQLdb.connect(host,port,user ...
- Kafka 及 PyKafka 的使用
1. Kafka 1. 简介 Kafka 是一种分布式的.分区的.多副本的基于发布/订阅的消息系统.它是通过 zookeeper 进行协调,常见可以用于 web/nginx 日志.访问日志.消息服务等 ...
- HDU 2089 不要62(数位dp模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...
- Android本地广播
Android中使用的广播一般是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播.这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数 ...