selenium+unittest自动化测试发送邮件

unittest 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。

1.目录结构

在一个demo下,我总的这系列的功能分成三个部分:testcase.py自动化测试web网页功能,testreport.py通过HTMLTestRunner.py文件生成HTML格式的测试报告,send_report.py通过邮件发送测试结果

2.编写测试用例testcase.py

from selenium import webdriver
import unittest
import time

class Test_login(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(15)   #隐式等待15秒,找到元素开始执行
        self.base_url = "https://xxxx.xxxx.xxxx/login"

 #测试登录验证各条件
    def test_login_sucess(self):
        '''测试用户名,密码登录'''

        driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[2]/div/div/input").send_keys('xxxxxxxxxxxx')
        time.sleep(0.5)
        driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[3]/div/div/input").send_keys('xxxxxxx')
        time.sleep(0.5)
        driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[4]/div/button").click()
        time.sleep(2)
        self.assertIn('/sup/homecse', driver.current_url) #断言:获取成功后的网页连接是否存在url中

    def test_login_error(self):
        '''用户名,密码错误提示信息'''
        driver = self.driver
        driver.get(self.base_url)
        #输入账号
        driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[2]/div/div/input").send_keys("xxxxxxxxxx")
        time.sleep(0.5)
        #输入密码
        driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[3]/div/div/input").send_keys('xxxxxx')
        time.sleep(0.5)
        driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[4]/div/button").click()
        time.sleep(2)

        result = driver.find_element_by_xpath("//*[@id='app']/div/div/div[2]/div/div[2]/div/div[2]/form/div/div[1]/div").text
        print(result)
        self.assertIn('帐号或密码错误', result, msg="报错原因:不包含")
    
    def tearDown(self):
        self.driver.close()

这里测试的一个登录页面的登录功能,主要设置了登录成功和登陆失败两种情况,这里设置了一个Test_login类的success和error两种情况,xpath定位方法定位到输入用户名和密码的位置,然后设置两种不同的情况,看页面登录功能是否完整,并且通过unittest的断言方法,进行判代码的运行情况

3.生成HTML测试报告testreport.py

import HTMLTestRunner
import unittest
from demo.testcase import Baidu

def make_report():
    testunit = unittest.TestSuite()
    #单个添加测试用例
    # testunit.addTest(Baidu('test_login_sucess'))
    # testunit.addTest(Baidu('test_login_error'))

    #多个添加测试用例
    tests = [Baidu('test_login_sucess'), Baidu('test_login_error')]
    testunit.addTests(tests)
    with open('report/result.html', 'wb+') as fp:
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='测试报告', description='测试报告详情', verbosity=2)
        runner.run(testunit)
        fp.close()

if __name__ == '__main__':
    make_report()

这里unittest提供了单个添加测试用例和多个添加测试用力的方法,将report/reslut.html文件打开,然后以lib/HTMLTestRunner的运行内容在将测试结果写入result.html,具体安装HTMLTestRunner请参考:unittest---测试报告(HTMLTestRunner / BSTestRunner)_宫崎骏的大胖猫的博客-CSDN博客_unittest 测试报告

4.发送Html测试报告send_report.py

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from demo.testreport import make_report

make_report()#执行测试用例,生成报告

# 第三方 SMTP 服务
mail_host = "smtp.163.com"  # SMTP服务器
mail_user = "xxxxxxxxxxxx@163.com"  # 用户名
mail_pass = "xxxxxxxx"  # 授权密码,非登录密码

# 发件人邮箱(最好写全, 不然会失败)
sender = 'xxxxxxxxxx@163.com'
# 接收邮件,可设置为你的QQ邮箱或者其他邮箱
receivers = ['xxxxxxxxxx@qq.com']

html = open('./report/result.html', 'rb')
content = html.read()
html.close()
title = '测试报告'  # 邮件主题


def sendEmail():
    message = MIMEText(content, 'html', 'utf-8')  # 内容, 格式, 编码
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title

    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 启用SSL发信, 端口一般是465
        smtpObj.login(mail_user, mail_pass)  # 登录验证
        smtpObj.sendmail(sender, receivers, message.as_string())  # 发送
        print("mail has been send successfully.")
    except smtplib.SMTPException:
        print('发送失败')


if __name__ == '__main__':
    sendEmail()

这里需要获取邮箱的第三方服务SMTP,请自行百度。send_report.py中设置邮件的内容再进行发送。技术不好,虚心请教,死不悔改


版权声明:本文为m0_50574727原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。