Python Selenium unittest+HTMLTestRunner实现 自动化测试及发送测试报告邮件

news2025/1/15 6:22:06

 1、UI测试框架搭建-目录结构

 2、 文件介绍

2.1、baseinfo->__init__.py

配置文件定义基础参数

#-*-coding:utf-8-*-
#测试用例配置参数

base_url = "http://xxxxx.com"
undirect_username = "username"
undirect_password = "password"
direct_username = "username"
direct_password = "password"

buyerName = 'username'
buyerPassword = 'password'

sellerName = 'username'
sellerPassword = 'password'


#发送邮件配置参数
Smtp_Server = 'smtp.xxxx.com'
Smtp_Sender = 'nnv@xx.cn'
Smtp_Sender_Password = 'Password'
#Smtp_Receiver = ['nnv1@xx.cn','nnv2@xx.cn','nnv3@xx.cn','nnv4@xx.cn']
Smtp_Receiver = ['nnv1@xx.cn']
Smtp_Receiver_pre = ['nnv1@xx.cn']


#测试邮箱配置
#Smtp_Server = 'smtp.163.com'
#Smtp_Sender = 'wmqyyj_test@163.com'
#Smtp_Sender_Password = 'Password'
#Smtp_Receiver = ['wmqyyj_test@163.com']
#Smtp_Receiver_pre = ['wmqyyj_test@163.com']


#测试用例及报告路径配置参数
# case_dir = './test_case'
# test_report = './test_report/'

#测试用例及报告路径配置参数
test_dir = 'D:\\WorkSpace\\Python\\UiTest\\test_case'
test_report = 'D:\\WorkSpace\\Python\\UiTest\\test_report\\'

2.2、caseData

用于存放测试数据,这里用于存放文件上传功能中的上传的文件。

2.3、test_case

用于存放测试用例,根据下图定义的pattern的值,所以用例必须以test开头

2.4、test_report

用户存放测试报告文件

 

 2.5、测试执行程序 

编写用例执行程序 runtest.py

# -*-coding:utf-8-*-
# Time:2017/7/1-0:18
# Author:YangYangJun
import sys

reload(sys)
sys.setdefaultencoding('utf8')
import smtplib
import unittest
import time
import os
from HTMLTestRunner import HTMLTestRunner
from email.header import Header
from email.mime.text import MIMEText

import baseinfo
from email.mime.multipart import MIMEMultipart

from selenium import webdriver

def get_NewReport(testreport):
    #获取testreport 目录下的文件返回一个list
    dirs = os.listdir(testreport)
    #对文件list 进行排序 进行增序排列
    dirs.sort()
    #获取序列最后一个元素,即最大的一个元素。
    newreportname = dirs[-1]
    print('The new report name: {0}'.format(newreportname))
    file_new = os.path.join(testreport, newreportname)
    print file_new
    return file_new
def get_Result(filename):
    driver = webdriver.Firefox()
    driver.maximize_window()
    ##得到测试报告路径
    result_url = "file://%s" % filename
    driver.get(result_url)
    time.sleep(5)

    result = driver.find_element_by_xpath("html/body/div[1]/p[3]").text

    result = result.split(':')
    print  result
    driver.quit()
    return  result[-1]



def send_Mail(file_new,result):
    f = open(file_new, 'rb')
    # 读取测试报告正文
    mail_body = f.read()
    f.close()
    try:
        smtp = smtplib.SMTP(baseinfo.Smtp_Server, 25)
        sender = baseinfo.Smtp_Sender
        password = baseinfo.Smtp_Sender_Password
        receiver = baseinfo.Smtp_Receiver
        smtp.login(sender, password)
        msg = MIMEMultipart()
        # 编写html类型的邮件正文,MIMEtext()用于定义邮件正文
        # 发送正文
        text = MIMEText(mail_body, 'html', 'utf-8')
        # 定义邮件正文标题
        text['Subject'] = Header('XXXXUI自动化测试报告', 'utf-8')
        msg.attach(text)
        # 发送附件
        # Header()用于定义邮件主题,主题加上时间,是为了防止主题重复,主题重复,发送太过频繁,邮件会发送不出去。
        msg['Subject'] = Header('[执行结果:' + result + ']'+ 'XXXXUI自动化测试报告' + now, 'utf-8')
        msg_file = MIMEText(mail_body, 'html', 'utf-8')
        msg_file['Content-Type'] = 'application/octet-stream'
        msg_file["Content-Disposition"] = 'attachment; filename="TestReport.html"'
        msg.attach(msg_file)
        # 定义发件人,如果不写,发件人为空
        msg['From'] = sender
        # 定义收件人,如果不写,收件人为空
        msg['To'] = ",".join(receiver)
        tmp = smtp.sendmail(sender, receiver, msg.as_string())
        print tmp
        smtp.quit()
        return True
    except smtplib.SMTPException as e:
        print(str(e))
        return False


if __name__ == '__main__':
    # test_dir = os.path.join(os.getcwd(),'test_case')
    # print(test_dir)
    # report_dir = os.path.join(os.getcwd(),'test_report')
    # 测试用例路径
    test_dir = baseinfo.test_dir
    # est_dir = os.path.join(os.getcwd(),'test_case')

    # print(test_dir)
    # report_dir = os.path.join(os.getcwd(),'test_report')
    # 测试报告存放路径
    report_dir = baseinfo.test_report

    test_discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
    now = time.strftime("%Y-%m-%d-%H_%M_%S")
    filename = report_dir + 'result-' + now + '.html'
    print filename
    fp = open(filename, 'wb')
    runner = HTMLTestRunner(stream=fp, title='XXXXUI自动化测试报告', description='用例执行情况')
    runner.run(test_discover)
    fp.close()
    #其实根本不需要这里获取最新报告,filename就是最新的报告了,可以直接使用了
    #new_report = get_NewReport(report_dir)
    result = get_Result(filename)

    mail = send_Mail(filename,result)

    print mail
    if mail:
        print(u"邮件发送成功!")
    else:
        print(u"邮件发送失败!")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想知道怎么给图片加贴纸?手把手教你给图片加贴纸

有时候我们在拍摄照片时,会不小心排到一些隐私的东西,这个时候该怎么办呢?可能很多人会先想到使用马赛克涂抹,这个方法确实好,但马赛克在帮我们遮挡的同时,也会影响到图片的整体观感。那我们应该用什么来代…

WebRTC Pacer

目录 一. 前言 二. WebRTC Pacer 1. 数据包传入Pacer模块的队列 2. Pacer模块取出队列的包发送 (1)什么时候取出数据包发送 (2)每次发送多少数据量 (3)避免引入较大延时的处理方法 一. 前言 实时音视…

@MapperScan 和 @Mapper 源码走读

一.从开发中遇到的问题开始 问题描述 : 在一个springbootmybatis的项目中,在dao也就是Mapper接口上配置了Mapper注解,其他同事在启动类还配置了MapperScan注解(包扫描没有配全面),进行批量指定所生成的Mapper接口动态代理接口类&…

TFT-LCD移植LVGL详细过程记录

TFT-LCD移植LVGL LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。 LVGL更多介绍:https://zhuanlan.zhihu.com/p/406294618 本次实验…

第六章 图论 16 AcWing 1558. 加油站

第六章 图论 16 AcWing 1558. 加油站 原题链接 AcWing 1558. 加油站 算法标签 图论 最短路 枚举 思路 枚举加油站位置,对于每个加油站位置进行dijkstra,选择符合要求1的最小距离最大值(要求2)与的距离和最小值(要…

(九)Java算法:快速排序(详细图解)

目录一、前言1.1、概念1.2、算法过程二、maven依赖三、流程解析3.1、全部数据分区3.2、左边数据分区3.3、右边数据分区四、编码实现结语一、前言 1.1、概念 快速排序:用数组的第一个数作为基准数据,然后将所有比它小的数都放到它左边,所有比…

使用 Spring Boot 设置 Hibernate Envers

Hibernate Envers是一个实现持久实体的审核和版本控制的模块。审计和版本控制是构建生产级Spring 启动微服务的关键组件。Hibernate Envers与Spring Boot无缝集成以实现相同的目标。 在这篇文章中,我们将在我们的Spring Boot Starter应用程序中集成Hibernate Envers…

生信工作流框架搭建 | 02-nextflow 实战

目录生信工作流框架搭建 | 02-nextflow前情提要开始使用依赖安装核心概念一个fastqc的示例,加深理解快速搭建你的程序你需要仔细阅读的:可以快速浏览(但需要知道大概有什么,以便后来查览):报错!…

IPD-需求管理流程

一、产品需求管理模型 在确定客户需求时,要考虑影响用户购买标准的八类基本需求($APPEALS),并基于客户视角进行详细分解,形成有针对性的产品。 1.1、需求管理业务流程 二、需求收集流程 2.1、需求收集的来源 路标规划:通过市场管理流程分析,落实到路标规划中的需求…

基于Paddle的手写数字识别模型

百度飞桨(paddlepaddle)是百度的开源深度学习平台,今天就利用paddle来编写入门级的手写数字模型. 一,准备数据 下载数据集,这里我们使用的是MNIST数据集 # 下载原始的 MNIST 数据集并进行解压 wget https://paddle-imagenet-mode…

12.数组的初始化和引用

数组的初始化 定义数组的时候,顺便给数组的元素赋予初值,即开辟空间的同时并且给数组元素赋值 一维数组的初始化 a. 全部初始化 int a[5] {2,4,7,8,5}; 代表的意思:a[0] 2 , a[1] 4 , a[2] 7 , a[3] 8, a[4] 5; b. 部分初始化 int …

Clever Internet Suite for Delphi, C++Builder

为Internet应用程序添加即时SSL/TLS安全性,并实现许多有用的Internet相关功能。 聪明的互联网套件允许您添加下载、上传和提交互联网资源;发送和接收MIME消息;HTTP、FTP、SMTP、POP3、IMAP和NNTP客户端/服务器解决方案;带有数字证书的SSL/TLS通道支持您的VCL应用程序…

电脑分辨率怎么调?电脑分辨率怎么调合适

​无论是笔记本电脑的用户,还是说台式电脑的用户,在使用电脑的时候,如果电脑分辨率调整的不对,很容易造成显示与观感方面的模糊。电脑分辨率怎么调?电脑分辨率怎么调最佳?本篇文章,小编就来教教…

ASEMI肖特基二极管1N5822参数,1N5822特征,1N5822应用

编辑-Z ASEMI肖特基二极管1N5822参数: 型号:1N5822 最大重复峰值反向电压(VRRM):40V 最大RMS电桥输入电压(VRMS):28V 最大直流阻断电压(VDC)&#xff1a…

三、简单了解kafka设计原理

系列文章目录 文章目录系列文章目录一、Kafka核心总控制器Controller二、kafka高性能简单理解一、Kafka核心总控制器Controller 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责…

[ZJCTF 2019]Login--动态调试--详细版

前言 主要是因为太菜了,看了别人的exp,还是懵懵懂懂的,都是静态分析,不明白为会在改密码的时候会导致最后的getshell。今天给它动态分析整一个,看看到底哪里出错了。 基本原理 网上有很多介绍的,在这里说…

Linux学习——01 gcc编译器

一、程序构建过程 高级语言的代码无法被计算机执行,需要将高级语言代码编译成汇编语言,然后再将汇编语言翻译成机器指令,最后通过链接生成最后的可执行文件,此时该文件才可以被计算机执行。总共有四步: 1.1 预编译&a…

[02] BLEMotion-Kit 基于QMI8658传感器使用加速度计进行倾斜检测

文章目录1. 先修知识2. 原理(单轴为例)2.1 单轴倾斜2.2 双轴倾斜2.3 三轴倾斜1. 先修知识 2. 原理(单轴为例) 首先我们要知道的是:当目标轴(本例中为X轴)与地球表面平行时,传感器处于 0g 场。顺时针或逆时针旋转90 将…

springboot+java大学生西部计划志愿者岗位补助管理系统

本课题要求实现一套大学生西部计划管理系,系统主要包括系统个人中心、志愿者管理、岗位信息管理、补助信息管理、交流论坛、系统管理等功能模块。 为完善志愿者、岗位信息,应当建立健全志愿者的补助和管理机制,建立有效的激励机制&#xff0c…

Android Studio无法连接设备,一直显示Loading Devices...

不知道什么时候做了啥,从某个时间点之后,电脑就特别容易断开adb,有时候重启电脑都不管用。 一直显示"Loading Devices...",拔插设备,重启Android Studio都没用,甚至重启电脑有时候也不行。 反正…