WEB UI自动化测试框架搭建(七)_ddt,邮件发送测试报告

一.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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值