3行python代码帮你轻松实现”自动发送测试报告“到指定邮箱

简介: 3行python代码帮你轻松实现”自动发送测试报告“到指定邮箱

前言



大多数情况下,跑完用例脚本之后,我们需要把测试报告打包,之后再发送给不同的同事查看。其实,python有很多好用的库和模块,可以帮助我们实现这个需求,解放我们的双手。


所以今天的推文,我们主要来看一看如何 自动把导出的测试报告打包成zip压缩包之后,再发送到指定的邮箱


1.在IDE中设置本地python环境



因为在实现压缩文件和发送邮件的脚本中,我们会用到python的一些第三方库和模块,所以我们在IDE中需要先设置好本地的python环境,方便我们后续做一些安装第三方库的工作。


设置的方法也很简单,在IDE的顶部菜单栏中,找到 选项--设置--自定义python.exe的路径 ,选择自己本地的python环境即可,另外python3.8不兼容 airtest ,请同学们选择3.8以下的版本。


网络异常,图片无法展示
|


设置好本地python环境之后,可以在命令行中检查该环境是否已经安装了 airtestpocoui 库,如未安装,请使用下述命令把这两个做自动化测试的框架安装上:


pip install airtest
pip install pocoui
复制代码


2.用脚本导出运行报告



在上周的推文 Airtest报告“全攻略”,看完直接用脚本生成、导出报告,真香! 中,我们有详细介绍如何用脚本生成/导出报告,编写完用例脚本后,我们可以使用 LogToHtml 类导出我们的测试报告,方便发送给其他同事查看:


from airtest.report.report import LogToHtml
h1 = LogToHtml(script_root=r'D:\test\nolog_test.air', log_root=r"D:\test\nolog_test.air\log", export_dir=r"D:\test\report02" ,logfile=r'D:\test\nolog_test.air\log\log.txt', lang='zh', plugins=None)
h1.report()
复制代码


注意不要忘记在脚本的开头导入 LogToHtml 类。各参数的详细含义我们也可以查看上周的推文,里面有详细的介绍。


3.将导出的报告文件压缩成zip包



在指定目录中导出的报告包含非常多的文件,比如脚本、图片、静态资源文件、log文件和html报告等等:


网络异常,图片无法展示
|


而这些文件最终都将以邮件附件的形式发送出去,如果不对这个导出的报告进行压缩操作,我们将需要填写非常多的附件,为了简化操作,在导出报告之后,我们可以用 zipfile 模块将导出的报告压缩成1个zip包,这样我们只需要发送1个压缩包附件即可。


zipfile 是python的一个内置模块,专门用于压缩文件和解压文件。这里我们仅需要用到模块里面压缩文件的内容。


网络异常,图片无法展示
|


示例代码帮助我们在Airtest报告的相同路径下压缩出来了1个zip文档。其中, ZipFile() 用于创建1个 zip 文件对象,示例中的三个参数分别表示:


  • filename:压缩成的zip包的路径(含压缩包名称);例如:xxx.zip
  • mode:可选 r,w,a ,代表不同的打开文件的方式;r只读;w重写;a添加
  • compression:指出这个 zipfile 的压缩方法,默认是 ZIP_STORED ,另一种是 ZIP_DEFLATED

ZipFile.write() 用于将指定文件添加到zip文档中,示例中的两个参数分别表示:

  • filename:需要压缩的文件名
  • arcname:添加到zip文档之后保存的名称


4.将压缩好的报告自动发送到指定邮箱



最后1步,将压缩好的报告以附件的形式发送到指定邮箱。我们先来了解下python对于发送邮件这件事的一些相关知识:


SMTP是发送邮件的协议。Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。


Python对SMTP支持有 smtplibemail 两个模块,email 负责构造邮件,smtplib 负责发送邮件。


但在实际编写脚本的过程中,小编发现这两个模块的使用起来比较繁琐,容易出错。经过一顿搜索之后,找到了 yagmail 库,可以用来替代上述两个模块自动发送邮件的功能。


并且使用这个库的话,我们 只需要3行代码就能够简单地实现自动发送邮件的功能


网络异常,图片无法展示
|


实现的效果如下:


网络异常,图片无法展示
|


另外需要注意的是,使用该库之前,需要先在IDE指定的本地python环境中使用 pip install yagmail 安装好这个库。


还有一点也需要注意下,yagmail.SMTP() 里面的 password 并不是指发送邮箱的密码,而是 发送邮箱的授权码 ,获取授权码的方式同学们可以自行到某度上面搜索,不同邮箱获取授权码的方式有略微的不同,同学们需要针对自己使用的邮箱去进行搜索。


小结



学会了如何使用python帮助我们自动发送邮件之后,我们还可以利用这个脚本自动帮我们发送别的东西,比如脚本文件等等。本文完整的示例代码:


# -*- encoding=utf8 -*-
__author__ = "AirtestProject"
__desc__ = """
自动发送测试报告到指定邮箱
1.在脚本中导出报告
2.压缩生成的测试报告
3.以附件形式发送测试报告
"""
from airtest.core.api import *
# LogToHtml 用于导出报告
from airtest.report.report import LogToHtml
# yagmail 用于发送邮件
import yagmail
# zipfile 用于压缩文件
import zipfile
auto_setup(__file__,logdir=True)
touch(Template(r"tpl1601027276597.png", record_pos=(-0.117, -0.296), resolution=(900, 1600)))
# 导出报告
h1 = LogToHtml(script_root=r'D:\test\email_test.air', log_root=r"D:\test\email_test.air\log", export_dir=r"D:\test\report02" ,logfile=r'D:\test\email_test.air\log\log.txt', lang='zh', plugins=None)
h1.report()
# 压缩文件
def zipDir(dirpath,outFullName):
    # dirpath为需要导出的文件夹路径
    # outFullName为导出的zip压缩包的路径(含压缩包名称)
    zip = zipfile.ZipFile(outFullName,"w",zipfile.ZIP_DEFLATED)
    for path,dirnames,filenames in os.walk(dirpath):
        # 去掉目标根路径,只对目标文件夹下边的文件及文件夹进行压缩
        fpath = path.replace(dirpath,'')
        for filename in filenames:
            zip.write(os.path.join(path,filename),os.path.join(fpath,filename))
    zip.close()
zipDir(r"D:\test\report02\email_test.log",r"D:\test\report02\email_test.log.zip")
# 发送报告
#连接邮箱服务器
yag = yagmail.SMTP(user="用来发送邮件的邮箱", password="邮箱授权码", host='邮箱的smtp服务器')
#邮箱正文,自定义
contents = ['Airtest测试报告', '脚本:nolog_test.air', '作者:AirtestProject']
# 发送带附件的邮件,最后1个参数为附件地址
# 接收邮件的邮箱和附件地址可以为列表,即发送给多个邮箱,发送多个附件
yag.send('接收邮件的邮箱', '邮件主题', contents, [r"D:\test\report02\email_test.log.zip"])


相关文章
|
4天前
|
测试技术 Python
|
1天前
|
Python
告别混乱!Python上下文管理器的自定义实践,让你的代码更加整洁有序
【7月更文挑战第6天】Python的上下文管理器通过`__enter__`和`__exit__`方法自动处理资源的获取与释放,如文件操作。使用with语句结合自定义类(如`FileManager`示例),能确保文件在使用后正确关闭,防止资源泄漏,提升代码整洁度和健壮性。自定义上下文管理器是代码模块化和错误处理的好实践。
|
1天前
|
设计模式 Python
深度揭秘!Python元类:掌握它,让你的代码拥有创造类的能力
【7月更文挑战第6天】Python元类探秘:**元类是类的类,用于控制类的创建。通过定义元类,可自定义类的行为,如动态添加方法或改变继承结构。示例中,`my_metaclass`在创建类时添加`new_method`。元类强大且适用于高级编程,如动态修改、注册类或实现设计模式。理解并善用元类能提升Python编程技巧。
6 0
|
1天前
|
数据采集 程序员 Python
深度定制Python上下文管理器,让你的代码世界从此井井有条
【7月更文挑战第6天】Python的上下文管理器简化了资源管理,通过`__enter__`和`__exit__`方法自动处理获取和释放。例如,一个自定义的LoggingContextManager类在`__enter__`中配置日志并返回记录器,在`__exit__`中关闭文件。使用`with`语句,可以优雅地控制日志文件的生命周期,提高代码的整洁性和健壮性。
5 0
|
1天前
|
Python
Python大神的秘密武器:揭秘上下文管理器的自定义艺术,让代码更优雅
【7月更文挑战第6天】Python上下文管理器是资源管理的关键,与with语句结合确保自动释放,防止资源泄露。通过定义__enter__和__exit__方法的类或使用contextmanager装饰器的生成器,可自定义管理器,简化代码,增强健壮性,如资源获取与释放、异常处理和高级功能实现。掌握这一技巧能提升代码的优雅度和可维护性。**
|
1天前
|
Python
惊艳!原来Python闭包与装饰器可以这样玩,让你的代码瞬间高大上
【7月更文挑战第6天】Python中的闭包和装饰器是代码复用和增强功能的利器。闭包是能记住外部作用域变量的内嵌函数,常用于封装和优化代码。例如,`make_multiplier_of`生成了乘法函数,如`times3`和`times5`,避免了重复代码。装饰器则不修改原函数即可添加新功能,如`my_decorator`在函数调用前后打印信息。当两者结合,如`repeat`装饰器,可以根据参数动态改变函数行为,如重复执行`greet`函数。闭包和装饰器的协同使用提升了代码的优雅性、效率和可扩展性。
6 0
|
1天前
|
Python
告别代码冗余!Python闭包与装饰器如何让你秒变代码优化大师?
【7月更文挑战第6天】Python的闭包和装饰器是解决代码冗余的利器。闭包,如匿名函数,记忆外部作用域变量,实现代码封装。例如,`make_multiplier_of`生成特定乘法函数,避免重复。装饰器如`@my_decorator`,不修改原函数,添加额外功能,如在函数调用前后打印信息。两者结合,提升代码灵活性和复用性,是优化和整洁代码的关键。
4 0
|
2天前
|
机器学习/深度学习 数据采集 算法
【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现
【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现
11 0
|
3天前
|
语音技术 开发者 Python
语音识别,python运行H ~W~,要使用英符,执行Python的流程是输入Python,回车,解释器的两大功能,翻译代码,提交计算机运算,多行代码运行,写一个py文件,pycharm安
语音识别,python运行H ~W~,要使用英符,执行Python的流程是输入Python,回车,解释器的两大功能,翻译代码,提交计算机运算,多行代码运行,写一个py文件,pycharm安
|
4天前
|
Python
惊呆了!Python 闭包与装饰器:解锁代码魔法的神秘钥匙🔑
【7月更文挑战第3天】Python中的闭包和装饰器是代码的神器。闭包是内嵌函数记住外部函数的变量,如`inner_function`记住`outer_function`的`x`。装饰器不修改原函数,增加额外功能,如`my_decorator`在`my_function`执行前后的打印。它们提升代码复用性,如`timeit_decorator`计时或`permission_required`控制访问权限。利用这些特性,编码变得更高效和优雅。