一、模块化驱动测试
- 把常用、公用的一些功能、业务、步骤专门提取出来,写在一个专门的模块中,以方法、类的形式实现出来,其他的模块如果需要这些功能,直接调用即可,无需重复显示这些代码。
- 最大限度的消除了重复,提高了测试用例的可维护、复用性。
- 比如登录登出模块、邮件发送模块、数据库处理模块、日志模块
二、邮件发送模块
- 在自动化测试脚本运行完成后,可以调用邮件发送将测试报告发送到相关人员的邮箱
代码如下:
import smtplib #发送邮件
import os
#封装邮件内容
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
class mailsend():
def sendFujian(self,filename):
#设置发送邮箱服务器
smtpserver = "smtp.163.com"
#设置邮箱的用户名及密码,用于邮箱登录
username = "[email protected]"
#大家自己的qq邮箱、163邮箱的授权码
password = "XXX"
#设置发送邮箱
sender = "[email protected]"
#设置接收邮箱
receiver = "[email protected]"
#设置邮箱主题
subject = "xxxx自动化测试结果"
#编写HTML类型的邮箱正文,及发送邮件的参数
#content = "<html><h1>自动化测试结果文件,请查收</h1></html>"
#通过读取html文件中的内容,然后发送
# path = os.path.dirname(__file__)
# path = os.path.dirname(path)
# path2 = os.path.dirname(os.path.dirname(__file__))+r"/test_reports/"
path2 = os.path.dirname(__file__)
path = path2+filename+".html"
# 文件路径
print(path)
content = open(path,"rb").read()
msg = MIMEText(content,"base64","utf-8")
msg["Content-Type"]="application/octet-stream"
# 添加
msg['Content-Disposition'] = "attachment;filename='%s.html'" %filename
msgRoot = MIMEMultipart('related')
msgRoot["Subject"]=subject
msgRoot["From"] = sender
msgRoot["To"]= receiver
msgRoot.attach(msg)
#创建一个邮件发送服务的对象
smtp = smtplib.SMTP()
#连接发件服务器
smtp.connect(smtpserver)
#登录发件邮箱
smtp.login(username,password)
#发送邮件
smtp.sendmail(sender,receiver,msgRoot.as_string())
smtp.quit()
if __name__=="__main__":
ssend = mailsend()
ssend.sendFujian(r"/re")
三、数据库处理
- 对数据库的增删改查操作
代码如下:
#使用pymysql模块进行数据库的操
#1、从数据库中读数据进行参数化
#2、执行了注册的脚本,我希望后面再运行脚本的时候,不用更新参数数据。所以要将该次注册的数据删除掉,还原场景
#如何连接上数据库
#导包
import pymysql
from configparser import ConfigParser
import os
class mysqlMy():
#1、为什么引入:有一些数据,通过配置文件来修改更方便
#使用构造方法
def __init__(self):
cf = ConfigParser()
path2 = os.path.dirname(os.path.dirname(__file__))+r"/conf/"
cf.read(path2+"sql.conf")
self.username = cf.get("mysqld","username")
self.password = cf.get("mysqld","password")
self.port = cf.getint("mysqld","port")
self.table = cf.get("mysqld","table")
self.host = cf.get("mysqld","host")
def selectFunc(self):
#创建Connection对象(数据库连接对象)用于打开数据库连接
con = pymysql.connect("localhost",self.username,self.password,self.table,self.port,charset='utf8')
print(con)
#创建游标对象,用于执行sql语句
corsor = con.cursor()
#创建sql语句
sql = "select * from x2_user limit 10"
#使用游标对象运行sql语句,执行数据库查询或命令,将结果从数据库获取到客户端
corsor.execute(sql)
#获取该游标多查询到的数据,fetchone():获取结果集的下一行
data = corsor.fetchone()
print(data)
#关闭游标对象
corsor.close()
#关闭数据库连接对象
con.close()
#往数据库中增加一条数据
def InsertFunc(self):
#创建Connection对象(数据库连接对象)用于打开数据库连接
con = pymysql.connect("localhost",self.username,self.password,self.table,self.port,charset='utf8')
print(con)
#创建游标对象,用于执行sql语句
corsor = con.cursor()
con.autocommit(False)
#创建sql语句
sql = 'insert into x2_user(username,useremail,userpassword,userregip) values("sdsafasdf","[email protected]","12344567","127.0.0.1")'
#使用游标对象运行sql语句,执行数据库查询或命令,将结果从数据库获取到客户端
#关闭自动提交事务功能
con.autocommit(False)
try:
corsor.execute(sql)
#提交游标执行结果到数据库
con.commit()
except:
#出现异常,回滚数据库到sql语句之前的状态
con.rollback()
print(corsor.rowcount)
#关闭游标对象
corsor.close()
#关闭数据库连接对象
con.close()
#往数据库中增加一条数据
def deleteFunc(self,user):
#创建Connection对象(数据库连接对象)用于打开数据库连接
con = pymysql.connect("localhost",self.username,self.password,self.table,self.port,charset='utf8')
print(con)
#创建游标对象,用于执行sql语句
corsor = con.cursor()
con.autocommit(False)
#创建sql语句
sql = 'delete from x2_user where username="sdsafasdf"'
#使用游标对象运行sql语句,执行数据库查询或命令,将结果从数据库获取到客户端
try:
corsor.execute(sql)
con.commit()
except:
con.rollback()
print(corsor.rowcount)
#关闭游标对象
corsor.close()
#关闭数据库连接对象
con.close()
if __name__=="__main__":
my = mysqlMy()
# my.selectFunc()
# my.readConf()
my.InsertFunc()
# my.deleteFunc()
代码中有用到sql.conf配置文件,代码如下:
[mysqld]
port = 3306
username = root
password =
host = localhost
table = examonline
四、日志模块
- 进行自动化脚本运行的时候可以在断言处设置日志打印,将结果打印在相应文件中供查看
代码如下:
'''
日志需要写入的格式:
年月日时分秒,测试文件的路径,测试用例方法名,预期结果,实际结果,是否通过
20200915,C:\selenium\XXX.py,请设置用户名,用户格式不正确,测试未通过
'''
# 由于可能会调整最终的输出到日志的数据格式,所以该模块的实现使用不定长参数
import time
def myLog(*args):
timeNow = time.strftime("%Y%m%d %H%M%S")
# 把日志放在当前文件加目录下
with open(r"C:\XXX\myLog.log","a",encoding="utf-8") as f:
f.write(timeNow)
for i in args:
f.write("," + i)
f.write("\n")
if __name__ == "__main__":
myLog("1342342","myLog.py","请设置用户名","用户格式不正确","测试未通过")
- 调用:
注意:需要使用try…exception…
- 打印效果如下: