自动化测试脚本之模块化驱动测试

一、模块化驱动测试

  • 把常用、公用的一些功能、业务、步骤专门提取出来,写在一个专门的模块中,以方法、类的形式实现出来,其他的模块如果需要这些功能,直接调用即可,无需重复显示这些代码。
  • 最大限度的消除了重复,提高了测试用例的可维护、复用性。
  • 比如登录登出模块、邮件发送模块、数据库处理模块、日志模块

二、邮件发送模块

  • 在自动化测试脚本运行完成后,可以调用邮件发送将测试报告发送到相关人员的邮箱

代码如下:

	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…

  • 打印效果如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yang_yang_heng/article/details/108716631