七. 邮件与运行脚本
1. 邮件
在第四小节中还遗留了一个 sendMail.py 文件没有说明,它的功能是接收新生成的测试报告名称,将该报告作为附件装载到邮件中,发送出去,收件人在配置文件 config.ini 中指定。内容如下:
1 import os
2 import configparser
3 import smtplib
4 from email.mime.multipart import MIMEMultipart
5 from email.mime.application import MIMEApplication
6 from .getPath import GetPath
7
8
9 class SendEmail():
10 def __init__(self):
11 # config.ini文件存放路径
12 config_path = GetPath().get_conf_path()
13 # 读取配置文件config.ini
14 config = configparser.ConfigParser()
15 config.read(config_path)
16 self.receiver = config.get('email', 'receiver') # 获取[email]中指定的收件人
17 self.subject = config.get('email', 'subject') # 获取[email]中指定的主题
18
19 self.username = os.environ.get('username') # 从环境变量获取邮箱账户
20 self.password = os.environ.get('password') # 从环境变量获取邮箱密码
21
22
23 def sendEmail(self, fname):
24 """
25 发送邮件
26 """
27 # 测试报告文件完整路径
28 report_path = os.path.join(GetPath().get_report_dir(), fname)
29
30 msg = MIMEMultipart()
31 msg["from"] = self.username
32 msg["to"] = self.receiver
33 msg["subject"] = self.subject + ': ' + fname
34
35 # 装载附件
36 part = MIMEApplication(open(report_path, 'rb').read())
37 part.add_header('Content-Disposition', 'attachment', filename=fname)
38 msg.attach(part)
39
40 # 发送
41 s = smtplib.SMTP("smtp.sina.com", timeout=30)
42 s.login(str(self.username), str(self.password))
43 s.sendmail(self.username, self.receiver, msg.as_string())
44 s.close
2. 运行脚本
为了避免每次测试都要输入一长串的命令,我们编写一个简单的脚本 run.py 来运行测试、生成报告,并调用 sendEmail.py 中的方法把报告发送给特定的邮箱,文件内容如下:
1 #!/usr/bin/python
2 import os
3 import datetime
4 import configparser
5 from Common.sendEmail import SendEmail
6 from Common.getPath import GetPath
7
8 # 当前时间
9 now = str(datetime.datetime.now())[0:19]
10 # 测试报告名
11 report_name = now.replace(' ', '-') + '-report.html'
12 # 测试报告完整路径
13 report_path = os.path.join(GetPath().get_report_dir(), report_name)
14
15 # config.ini文件存放路径
16 config_path = GetPath().get_conf_path()
17 # 读取配置文件config.ini
18 config = configparser.ConfigParser()
19 config.read(config_path)
20 # 获取[email]中指定的active值
21 active = config.get('email', 'active')
22
23 def run_test():
24 os.system("pytest -q ./test_main.py --html=../Report/%s --self-contained-html" %(report_name))
25
26 if __name__ == '__main__':
27 run_test()
28 # 如果已邮件功能已激活且测试报告成功生成
29 if active == 'yes' and os.path.isfile(report_path):
30 SendEmail().sendEmail(report_name)
然后,我们为脚本文件添加可执行权限:chmod +x run.py
现在,可以直接在控制台输入./run.py
运行测试了:
>>> ./run.py
....... [100%]
=============================================== warnings summary ================================================
/usr/lib/python3.7/site-packages/requests/__init__.py:91
/usr/lib/python3.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.25.2) or chardet (3.0.4) doesn't match a supported version!
RequestsDependencyWarning)
-- Docs: https://docs.pytest.org/en/latest/warnings.html
------- generated html file: /home/user1/ProgramFile/IntTestDemo/Report/2019-05-17-17:25:16-report.html -------
7 passed, 1 warnings in 0.30 seconds
测试报告2019-05-17-17:25:16-report.html,已发送!
收到的邮件:
测试报告邮件.png
4. 嗯
>>> cd ../ # 回到根目录IntTestDemo
>>> git add . # 将项目改动放入暂存区
>>> git commit # 将暂存区的的修改提交到当前分支,m参数表示添加注释
>>> git push origin master # 推送到远程服务器(github)
网友评论