#!/usr/bin/env python
# -*- coding=utf-8 -*- __CreateAt__ = '2020/4/19-17:34' import shutil
from airtest.cli.runner import AirtestCase, run_script
from argparse import *
from air_case.report import report
import jinja2
import io
from util.send_email import SendEmail
from util.compress_file import copy_and_zip from util.android_util import attached_devices
from util.common import * PATH = lambda p: os.path.abspath(
os.path.join(os.path.dirname(__file__), p)
) def run_case(data):
devices = attached_devices()
if not devices:
print("无可用设备")
return
test = CustomAirtestCase(data["root_path"])
device = ["Android://127.0.0.1:5037/%s?touch_method=ADBTOUCH" % data["dev"]]
# "android:///%s" % data["dev"]
test.run_air(device, data) def run(root_path, test_case, device, log_date):
script = os.path.join(root_path, test_case["module"], test_case["case"])
log = os.path.join(root_path, 'log', test_case["module"], log_date, test_case["case"].replace('.air', ''))
if os.path.isdir(log):
shutil.rmtree(log)
else:
os.makedirs(log)
print(str(log) + 'is created')
output_file = os.path.join(log, 'log.html')
args = Namespace(device=device, log=log, compress=None, recording=None, script=script, no_image=None)
try:
run_script(args, AirtestCase)
is_success = True
except:
is_success = False
return {"is_success": is_success, "output_file": output_file, "script": script, "log": log} class CustomAirtestCase(AirtestCase):
@classmethod
def setUpClass(cls):
super(CustomAirtestCase, cls).setUpClass() def __init__(self, root_dir):
self.fail_data = []
self.results = {"dev": "", "modules": [], "total_time": "", "data": []}
self.log_list = []
super().__init__() def setUp(self):
super(CustomAirtestCase, self).setUp() def tearDown(self):
print("custom tearDown")
super(CustomAirtestCase, self).setUp() def run_air(self, device, data):
root_log = os.path.join(data["root_path"], "log")
# remove_log表示如果传值就会删除整个log文件夹,删除后无法查看历史报告
if os.path.isdir(root_log):
if data.get("remove_log"):
shutil.rmtree(root_log, ignore_errors=True)
print("删除log文件夹")
else:
os.makedirs(root_log)
get_data_list = get_test_case(data)
if not get_data_list:
print("无可用用例")
return
# 整个用例开始执行时间
start_time = datetime.now().strftime("%H:%M:%S")
modules = []
# 日志按照日期格式生成
log_date = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
for j in get_data_list:
# 日志按照日期格式生成
# log_date = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
# 用例开始执行日期
st_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 用例开始执行时间
s_time = datetime.now().strftime("%H:%M:%S")
# 循环运行用例
get_run = run(data["root_path"], j, device, log_date)
# 用例结束执行日期
end_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 用例结束执行时间
e_time = datetime.now().strftime("%H:%M:%S")
# 用例耗时时间
sum_time = get_case_total_time(s_time, e_time)
# 生成测试用例的详情报告
rpt = report.LogToHtml(get_run["script"], get_run["log"], "../../../../report")
# rpt = report.LogToHtml(get_run["script"], get_run["log"])
rpt.report("log_template.html", output_file=get_run["output_file"])
# 记录测试结果
result = {"name": j["case"].replace(".air", ""), "result": get_run["is_success"], "start_date": st_date,
"end_date": end_date, "sum_time": sum_time, "module": j["module"], "log_date": log_date}
modules.append(j["module"])
self.results["data"].append(result)
self.log_list.append(get_run["log"])
# 记录失败用例
if not get_run["is_success"]:
self.fail_data.append({"module": j["module"], "case": j["case"]})
# 整个用例结束执行时间
end_time = datetime.now().strftime("%H:%M:%S")
# 以小时,分钟,秒钟的方式记录所有用例耗时时间
total_time = get_case_total_time(start_time, end_time)
self.results["total_time"] = total_time
# 记录测试模块
self.results["modules"] = get_test_modules(modules)
# 记录设备名字
self.results["phone"] = data["phone"]
# 打印失败用例
if self.fail_data:
print("存在失败用例")
print(self.fail_data) # 生成测试报告
env = jinja2.Environment(
loader=jinja2.FileSystemLoader(data["root_path"]),
extensions=(),
autoescape=True
)
print("用例结果为:%s" % self.results)
t = os.path.join(data["root_path"], "summary_template.html")
if not os.path.exists(t):
shutil.copy(PATH("util/summary_template.html"), data["root_path"])
template = env.get_template("summary_template.html", data["root_path"])
html = template.render({"results": self.results})
output_file = os.path.join(data["root_path"], "summary_%s.html" % datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
with io.open(output_file, 'w', encoding="utf-8") as f:
f.write(html)
# 按日期生成测试报告,方便对比历史报告,但是程序入口字段需要设置为"remove_log": False
print("测试报告为:%s" % output_file) # 固定输出给CI
output_file = os.path.join(data["root_path"], "summary.html")
with io.open(output_file, 'w', encoding="utf-8") as f:
f.write(html)
# 当发送邮件参数为真,就对文件进行压缩并发送测试报告到指定邮箱
if data.get("send_email"):
# 压缩测试报告
report_file = os.path.join(data["root_path"], "report")
case_log = os.path.join(data["root_path"], "log")
case_html = output_file
zip_list = [report_file, case_log, case_html]
zip_path = copy_and_zip(zip_list, "report")
# 发送测试报告邮件
to_addr = ["284772894@qq.com"]
SendEmail.send(zip_path, to_addr) if __name__ == '__main__':
"""
python E:/project/trade-auto/runner1.py
"""
root_path = PATH("air_case")
# test_plan=1 表示调试用例需要配合test_module使用,0表示全部用例,比如:"test_plan": 0, "test_module": ["我的"]
# remove_log为真 表示是否运行用例之前,删除log文件夹,删除后会影响查看历史报告
# send_email为真,表示发送邮件,否则就不发送
# dev参数使用adb devices 获取到设备udid,填进去,若想多台并行,这里的dev必须填正确,不能是同一台手机
# data = {"root_path": root_path, "test_plan": 0, "test_module": [], "dev": "TPG5T18130013404", "phone": "Nova2s"}
data = {"root_path": root_path, "remove_log": True, "send_email": True,
"test_plan": 0, "test_module": [], "dev": "TPG5T18130013404", "phone": "Nova2s"}
run_case(data)

aritest发送测试报告到邮件的更多相关文章

  1. Java+Selenium3框架设计篇5-如何实现邮件发送测试报告

    https://blog.csdn.net/u011541946/article/details/77278837 本篇继续回答网友的问题,这个主题是如何通过邮件发送测试报告.通过邮件发送测试报告,这 ...

  2. python3 邮件方式发送测试报告

    以邮件方式发送测试报告 import smtplib from email.mime.text import MIMEText class SendEmail: """邮 ...

  3. Python+unittest发送测试报告

    案例:将E:\Python_script\unittest\Test_Baidu生成的最新测试报告发送到指定邮箱. 我们将之前的unittest的报告生成和Python自动发送邮件结合在一起,就可以完 ...

  4. python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)

    简介 上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件.发送带附件的需要导入另外一个模块 ...

  5. python接口自动化(二十九)--html测试报告通过邮件发出去——上(详解)

    简介 前边几篇,已经教小伙伴们掌握了如何生成HTML的测试报告,那么生成测试报告,我们也不能放在那里不管了,这样即使你报告在漂亮,领导也看不到.因此如果想向领导汇报工作,不仅需要提供更直观的测试报告. ...

  6. Jenkins发送测试报告

    邮件全局配置 邮件插件:Email Extension Plugin 功能:发送邮件 邮件全局配置:jenkins--系统管理--系统配置:截图: 配置说明: 系统管理员邮件地址:必须配置,配置后邮件 ...

  7. ORACLE发送带附件邮件的二三事之一

    在oracle使用过程中,我们可以通过pl/sql生成数据文件,也可以通过spool on spool off生成,但某些环境下,我们需要通过存储过程处理数据,数据处理完,需要自动生成数据文件,手工导 ...

  8. linux 安装wordpress 无故往外发送大量垃圾邮件

    linux 安装wordpress 无故往外发送大量垃圾邮件 始末 表现出来的现象就是, 网站运行没多久,mysql服务就挂了,重启也无法启动起来,提示 No such file or dicrion ...

  9. EBS中使用JAVA方式发送HTML格式邮件

    转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...

随机推荐

  1. 110_SSM框架

    目录 需求分析->功能设计->数据库设计 环境要求 环境 要求 数据库环境 基本环境搭建 创建maven项目 pom.xml添加依赖,添加资源导出 idea连接数据库 提交项目到Git 创 ...

  2. AgileConfig轻量级配置中心1.4.0发布,重构了发布功能

    加入 NCC 先说一个事,AgileConfig 在 7 月底终于通过了 NCC 社区的审核,正式成为了 NCC 大家庭的一员.这对 AgileConfig 来说是一个里程碑,希望加入 NCC 后能更 ...

  3. .Net性能调优-MemoryPool

    简单用法 //获取MemoryPool实例,实际返回了一个ArrayMemoryPool<T> MemoryPool<char> Pool = MemoryPool<ch ...

  4. POJ1426——Find The Multiple (简单搜索+取余)

    题意: 给一个数n,让你找出一个只有1,0,组成的十进制数,要求是找到的数可以被n整除. 用DFS是搜索 当前位数字 (除最高位固定为1),因为每一位都只有0或1两种选择,换而言之是一个双入口BFS. ...

  5. Django学习day10随堂笔记

    每日测验 """ 今日考题 1.默写ajax基本语法,及提交json数据和文件都需要添加哪些额外参数 2.什么是序列化,截止目前为止你所接触过的序列化有哪些 3.批量插入 ...

  6. webpack learn1-webpack-dev-server的配置和使用3

    首先输入命令来安装webpack-dev-server npm i webpack-dev-server 在package.json文件中添加代码: "scripts": { &q ...

  7. 带你掌握Vue过滤器filters及时间戳转换

    摘要:Vue的filters过滤器是比较常见的一个知识点,下面我将结合时间戳转换的例子带你快速了解filters的用法. 本文分享自华为云社区<三分钟掌握Vue过滤器filters及时间戳转换& ...

  8. Linux系列(40) - 自动同步时间chrony

    前言 Centos8开始取消了ntp同步时间,改为chrony同步 chrony工具安装 yum -y install chrony 修改配置文件 将配置文件中的同步服务器修改为国内的时间服务器(推荐 ...

  9. shell脚本中 /dev/null 的用途

    /dev/null 是一个特殊的设备文件,它丢弃一切写入其中的数据 可以将它 视为一个黑洞, 它等效于只写文件, 写入其中的所有内容都会消失, 尝试从中读取或输出不会有任何结果,同样,/dev/nul ...

  10. cmake入门:01 构建一个简单的可执行程序

    一.目录结构 CMakeLists.txt:cmake 工程入口文件,包含当前目录下的工程组织信息.cmake 指令根据此文件生成相应的 MakeFile 文件. Hello.c: 源代码文件 bui ...