一.unittest与ddt结合
之前简单用了下unittest的功能,没有实现ddt,用户名和密码还是手输的
新建个文件,写好setup和teardown两个函数
由于断言的部分之前我已经写过了,(那次没用unit test+ddt,纯手搓的),在上次的基础上略作修改即可
修改成如下,把上面手搓的部分换成引入ddt即可,ddt在此文章里不做展开,可以到网上找一下基本用法或者看一下我这篇总结的python常用库的用法:https://blog.csdn.net/qq_38175040/article/details/116125998
贴一下新写的Unittest_ddt.py的代码:
import time
import unittest
from ddt import ddt,data
from selenium import webdriver
from ConfigFiles.ConfigPath import xlsxPath
from Modules.LoginAction import LoginAction
from Utils.ExcelOperate import ExcelOperate
@ddt
class Unittest_ddt(unittest.TestCase):
login_action = LoginAction()
excelOperate = ExcelOperate()
excelOperate.load_workbook(xlsxPath)
excelOperate.get_sheet_by_name('Sheet1')
# 获取最大行数
row_nums = excelOperate.get_rows_nums()
# 获取第一行的值
row_1_values = excelOperate.get_row_values(1)
list_01 = []
for i in range(2,row_nums+1):
row_values = excelOperate.get_row_values(i)
values = dict(zip(row_1_values, row_values))
list_01.append(values)
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get('https://mail.163.com/')
self.driver.maximize_window()
def tearDown(self):
time.sleep(2)
self.driver.quit()
@data(*list_01)
def test_03(self,a):
if a['is_executed'] == 'y':
username = a['username']
password = a['password']
self.login_action.do_login(self.driver, username, password)
time.sleep(2)
if a['except_result'] == '登录成功':
self.assertIn(username,self.driver.page_source)
else:
self.assertNotIn(username,self.driver.page_source)
if __name__ == '__main__':
unittest.main()
将刚刚写的unittest+ddt再结合一下HTMLTestRunner,这部分没啥,就几行代码
执行成功,生成测试报告
这小部分代码如下
'''
unittest+ddt+HTMLTestRunner
'''
suit = unittest.TestSuite()
suit.addTest(Unittest_ddt('test_03_1'))
now = time.strftime('%Y-%m-%d_%H-%M-%S')
with open(reportPath+now+'_report.html','wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title = '测试报告',description = 'lsq')
runner.run(suit)
----------------------------------------------------------------------------------------------------------------------
记录一下实际操作过程中在这里遇到的一个问题:
在没用@ddt时,使用如下写法没有问题,就是正常的向套件中加用例并执行。
但如果一旦测试用例的函数前缀有了@ddt,这么做就会报错
像上面这种写法用addtest会报错,报错信息是找不到函数名叫test_03的测试用例
解决方法:https://testerhome.com/topics/26985
根据解决方法里的原理,将test_03加入套件时改名test_03_1即可运行成功。
----------------------------------------------------------------------------------------------------------------------
二.发送邮件功能
能生成测试报告接下来就是发送测试报告到邮箱了
在公共方法包Utils下新建个SendMails.py文件
将发送邮件所需的方法封装在其中
接下来写个main函数测试这部分代码有没有问题
先指定上述部分的信息,授权码auth_code到邮箱设置里去拿
开启这两个功能
两个都开启之后下方多了个功能
点击之后按操作步骤拿到授权码,然后把授权码写入代码里
写入授权码之后调用send函数,然后执行代码,发送邮件成功
但这样仅仅发送了文本文字,我们再写一个可以发送附件的方法
我们发送的文件选取这个
运行main函数
成功
我们要发送的测试报告是.html文件,继续修改
贴一下SendMails.py文件里的代码:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from ConfigFiles.ConfigPath import xlsxPath
class Send_Mail:
def __init__(self,mail_host):
'''
构建服务器stmp 的服务地址
:param mail_host:
'''
self.mail_host = mail_host
def send(self,title,content,sender,auth_code,receivers):
'''
发送邮件
:param title:
:param content:
:param sender:
:param auth_code: 授权码
:param receivers:
:return:
'''
#指定邮件内容
message = MIMEText(content,'html','utf-8')
#指定发送接受者,以及邮件主题
message['From'] = '{}'.format(sender)
message['TO'] = ','.join(receivers)
message['SUbject'] = title
try:
#指定smtp服务器
smtp_obj = smtplib.SMTP_SSL(self.mail_host,465)
#连接服务器
smtp_obj.login(sender,auth_code)
#发送邮件,as_string()将邮件内容转为str形式
smtp_obj.sendmail(sender,receivers,message.as_string())
print('发送邮件')
except Exception as e:
print(e)
def send_with_file(self,title,content,sender,auth_code,receivers,file_name):
print(file_name)
#构建一个邮件对象,MIMEMultipart代表邮件由多部份组成,后续往其中加附件
mail_mul = MIMEMultipart()
#邮件正文及发送人,接受人和标题
mail_text = MIMEText(content, "plain", "utf-8")
mail_mul['From'] = '{}'.format(sender)
mail_mul['TO'] = ','.join(receivers)
mail_mul['SUbject'] = title
#将正文添加到邮件中
mail_mul.attach(mail_text)
with open(file_name,'rb') as f:
s = f.read()
m = MIMEText(s, "base64", "utf-8")
m["Content-Type"] = "application/octet-stream"
m["Content-Disposition"] = "attachment;filename = test_report.html"
mail_mul.attach(m)
try:
# 指定smtp服务器
smtp_obj = smtplib.SMTP_SSL(self.mail_host, 465)
# 连接服务器
smtp_obj.login(sender, auth_code)
# 发送邮件,as_string()将邮件内容转为str形式
smtp_obj.sendmail(sender, receivers, mail_mul.as_string())
print('发送带附件的邮件')
except Exception as e:
print(e)
if __name__ == '__main__':
#实例化一个对象,并指定一个smtp地址,163邮箱的smtp地址是smtp.163.com
mail = Send_Mail('smtp.163.com')
sender = 'lsqtester001@163.com'
#由于接收者可能是多个邮箱,所以这里用列表来存储一下
receivers = ['1176701245@qq.com']
title = 'test_sendMail'
content = 'this is content'
auth_code = 'VWBXQRMAHTFWEAIX'
# mail.send(title,content,sender,auth_code,receivers)
mail.send_with_file(title,content,sender,auth_code,receivers,xlsxPath)
然后在runCases.py文件里做修改,在生成html测试报告之后立即获取文件地址file_name,然后将获取的地址传入方法,下面的语句就是直接抄的上面main函数里的方法
执行一下看看
成功啦
贴一下runCases.py里的代码:
import time
import unittest
from ConfigFiles.ConfigPath import TestcasesPath, reportPath
from TestCases.Unittest_ddt import Unittest_ddt
from TestCases.Unittest_login import Login_test
from Utils import HTMLTestRunner
from Utils.SendMails import Send_Mail
if __name__ == '__main__':
# suit = unittest.TestSuite()
# #向套件中添加测试用例
# suit.addTest(Login_test('test_01'))
# suit.addTest(Login_test('test_02'))
#
# runner = unittest.TextTestRunner()
# runner.run(suit)
'''
用discover来组织测试用例
discover(dir,pattern='Unittest*.py',top_level_dir=None)
dir就是存放写用例的python文件的具体路径
pattern就是在目录dir下找形式如同Unittest*.py这样的文件
如果符合条件的.py文件里有load_test这个函数的话,就会加载该文件里的测试用例
如果不存在load_test函数的话,就会默认加载文件里以test开头的测试用例函数
'''
# suit = unittest.TestSuite()
# loader = unittest.TestLoader()
# suit.addTest(loader.discover(TestcasesPath,pattern='Unittest*.py'))
#
# runner = unittest.TextTestRunner()
# runner.run(suit)
'''
unittest结合HTMLtestrunner
'''
# suit = unittest.TestSuite()
# loader = unittest.TestLoader()
# suit.addTest(loader.discover(TestcasesPath,pattern='Unittest*.py'))
# #获取当前时间用作文件名
# now = time.strftime('%Y-%m-%d_%H-%M-%S')
# with open(reportPath+now+'_report.html','wb') as f:
# runner = HTMLTestRunner.HTMLTestRunner(stream=f, title = '测试报告',description = 'lsq')
# runner.run(suit)
'''
unittest+ddt+HTMLTestRunner
'''
suit = unittest.TestSuite()
suit.addTest(Unittest_ddt('test_03'))
suit.addTest(Unittest_ddt('test_04'))
now = time.strftime('%Y-%m-%d_%H-%M-%S')
with open(reportPath+now+'_report.html','wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f, title = '测试报告',description = 'lsq')
runner.run(suit)
file_name = reportPath+now+'_report.html'
mail = Send_Mail('smtp.163.com')
sender = 'lsqtester001@163.com'
receivers = ['1176701245@qq.com']
title = 'test_sendMail'
content = '发送测试报告'
auth_code = 'VWBXQRMAHTFWEAIX'
mail.send_with_file(title, content, sender, auth_code, receivers,file_name)