模块化驱动测试:把常用、公用的一些功能、业务、步骤专门提取出来,写在一个专门的模块中,以方法、类的形式实现出来,再其他的模块如果需要这些功能,直接调用即可,无需重复显示这些代码。最大限度的消除了重复,提高了测试用例的可维护、复用性。
比如可以做登录模块、退出模块、邮件发送模块、数据库处理模块等。
1、电商系统的登录、退出模块
在自动化测试用例中,有很多是需要先登录再进行操作的,所以我们可以将登录做成模块,在使用的时候进行调用即可。
class verydows():
def verylogin(self,driver):
#1、打开verydows电商系统的首页:http://xx.xx.xx.xx/verydows/
driver.get("http://xx.xx.xx.xx/verydows/")
#写一句隐形等待
driver.implicitly_wait(10)
# 2、点击其中的登陆按钮
driver.find_element_by_link_text('登陆').click()
# 3、输入正常的用户名
driver.find_element_by_id('username').send_keys('sz1902_002')
# 4、输入正常的密码(与登陆用户名一致的密码)
driver.find_element_by_id('password').send_keys('123456')
# 5、点击登陆
driver.find_element_by_xpath('//*[@id="login-form"]/div/a').click()
#再点击登陆之后需要等待5秒,跳过中间界面
time.sleep(5)
#( 验证是否能登陆成功)
expectLoginUrl = 'http://xx.xx.xx.xx/verydows/verydows/index.php?c=user&a=index'
actualLoginUrl = driver.current_url
if expectLoginUrl==actualLoginUrl:
print("跳转登陆成功页面,正向的登录用例通过")
else:
print("未能跳转登陆成功页面,正向的登录用例失败")
#退出登陆的 方法
def veryLogout(self,driver):
driver.find_element_by_xpath('//*[@id="top-userbar"]/a').click()
driver.find_element_by_link_text('退出').click()
#关闭浏览器的方法
def veryquit(self,driver):
driver.quit()
2、邮件发送模块
在自动化测试脚本运行结束之后,可以调用邮件发送模块将测试报告,发送给相关责任人的邮箱,不需要手动去发邮件。
import smtplib#发送邮件
import os
#封装邮件内容
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
class mailsend():
def sendHtml(self):
#设置发送邮箱服务器
smtpserver = "smtp.1000phone.com"
#设置邮箱的用户名及密码,用于邮箱登录
username = "xxx@1000phone.com"
password = "xxx"
#设置发送邮箱
sender = "xxx@1000phone.com"
#设置接收邮箱
receiver = "xxx@qq.com"
#设置邮箱主题
subject = "自动化测试结果"
#编写HTML类型的邮箱正文,及发送邮件的参数
# content = "<html><h1>自动化测试结果文件,请查收</h1></html>"
#通过读取html文件中的内容,然后发送
content = open("./verydows电商/test_reports/2020-01-03-11-40-34.html","rb").read()
msg = MIMEText(content,"html","utf-8")
msg["Subject"]=subject
msg["From"] = sender
msg["To"]= receiver
#创建一个邮件发送服务的对象
smtp = smtplib.SMTP()
#连接发件服务器
smtp.connect(smtpserver)
#登录发件邮箱
smtp.login(username,password)
#发送邮件
smtp.sendmail(sender,receiver,msg.as_string())
smtp.quit()
def sendFujian(self,filename):
#设置发送邮箱服务器
smtpserver = "smtp.1000phone.com"
#设置邮箱的用户名及密码,用于邮箱登录
username = "xxx@1000phone.com"
password = "xxx"
#设置发送邮箱
sender = "xxx@1000phone.com"
#设置接收邮箱
receiver = "yyy@qq.com"
#设置邮箱主题
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/"
path = path2+filename+".html"
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.sendHtml()
3、数据库处理模块
对数据库的增删改查操作,方便脚本中随时调用
import pymysql
from configparser import ConfigParser
#通过配置文件,重构下代码
class HandleMysql():
def __init__(self):
#创建对象
conf = ConfigParser()
#通过conf读入配置文件中的数据
conf.read(r"./day04/mysql.conf")
# 1.建立链接
self.conn = pymysql.connect(host=conf.get("mysqld1","host"), # mysql服务器ip或者域名
user=conf.get("mysqld1","username"), # 用户名
password=conf.get("mysqld1","password"), # 密码
db=conf.get("mysqld1","db"), # 要链接的数据库名
port=conf.getint("mysqld1","port"), # 数据库端口号,默认为3306
charset="utf8", # 数据库编码为utf8,不能写为utf-8
# 默认返回的结果为元组或者嵌套元组的列表
# 可以指定cursorclass为DictCursor那么返回的结果为字典或者嵌套字典的列表
cursorclass=pymysql.cursors.DictCursor
)
# 2.创建游标对象
self.cursor = self.conn.cursor()
def run(self, sql, args=None, is_more=False):
# 3.使用游标对象,执行sql语句
self.cursor.execute(sql, args)
# 使用连接对象,提交
self.conn.commit()
# 4.获取执行的结果
if is_more:
# 返回获取执行的所有结果
return self.cursor.fetchall()
else:
# 返回获取执行的单条结果
return self.cursor.fetchone()
def close(self):
# 5.一定要关闭游标和连接
# 先关闭游标对象,然后关闭连接对象,否则会报错
self.cursor.close()
self.conn.close()
if __name__ == "__main__":
do_mysql = HandleMysql()
# 查:查找表中所有信息
sql_1 = "select * from dept"
# 删:删除表中所有记录
# sql_2 = "delete from employee;"
# 增:增加员工信息
# sql_3 = "insert into employee (eid,ename,job,phone,manager,hiredate,salary,did) values(400011,'Zhangsan','销售员','18812345678',22,'2019-10-20','5500',102)"
# 改:将所有员工薪水修改为5000元
# sql_4 ="update employee set salary=5000;"
print(do_mysql.run(sql_1,is_more=True))
# print(do_mysql.run(sql_2))
# print(do_mysql.run(sql_3))
# print(do_mysql.run(sql_4))
do_mysql.close