最近博主完成了一个web端UI自动化平台测试环境搭建,包括常用的操作流程组合成方法,组织测试用例,利用框架及报告文件生成,最后通过邮件添加附件的格式发送。
首先UI自动化平台的核心是selenium+python、里面一些元素定位的操作博主也就不做介绍了,有很多大神都有详细的文档来辅助、博主这里想总结的是如何通过模块的方式来写通用的方法来简化测试工作。
就拿最简单的登录注册页面来举例,可能需要设计的用例:不存在的用户名、正确的用户名加错误的密码、正确的用户名加空密码、正确的用户名加正确的密码。 博主这里就简单的列一些常用的用例(别吐槽用例覆盖不全),
然后来通过 selenium的 定位API来写用例代码,每一个用例都包括:进入登录页、用户名的操作、密码的操作、确认登录,博主想说的就是类似这样同一个页面、不同的操作可以通过定义方法的形式来整合代码,
把相应元素但不同操作用定义的变量来区别。
下面是一个类似的例子:
1 # ERP自动化登录接口 2 @classmethod 3 def erp_login(cls, username, password): 4 driver = cls.driver 5 driver.find_element_by_id("btn-front").click() 6 7 # 登录名称 8 driver.find_element_by_id("DloginName").send_keys(username) 9 # 登录密码 10 driver.find_element_by_id("Dpassword").send_keys(password) 11 12 driver.find_element_by_id("Flogin").click()
同样比如一个表单新增功能,涉及的字段多了,同样可以通过定义方法来整合,如此可以大大优化代码,否则相似的用例会出现大量重复的操作步骤代码,而且随着方法的不断增加,测试用例也变成不同方法的组合
例如:
1 # ERP自动化前台测试用例 2 def test_case_1(self): 3 u"""菜肴条件:时价主菜称重备注(535465);单独下单""" 4 TestErp.erp_login(self, "237nj03", "000000") 5 TestErp.erp_front(self) 6 TestErp.erp_front_open_dish_Desk(self, "512788") 7 TestErp.erp_front_dish_pwfb(self, "10", "1.5", "1", "2") 8 TestErp.erp_front_dish_order(self) 9 TestErp.erp_front_account_clearDesk(self, "512788")
这是一个用例集,是在单元测试框架unittest里的,之前博主也介绍过,博主负责的项目是一个智能餐饮系统
TestErp.erp_login 这个是登录的方法
TestErp.erp_front 这个是进入前台的方法
TestErp.erp_front_open_dish_Desk 这个是餐饮系统中选择变量(desk_id)来开台
TestErp.erp_front_dish_pwfb 这个是选择其中一种菜肴信息,输入 price 价格、weight 称重、 配菜信息
TestErp.erp_front_dish_order 这个是下单操作
TestErp.erp_front_account_clearDesk 这个是进入结账页、选择现金结账打印并清台
之后就是通过构建用例集来执行用例,并发送邮件
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 from unittest_erp import TestErp 5 import HTMLTestRunner 6 import unittest 7 from datetime import datetime 8 from time import sleep 9 from unittest_smtp import unittest_smtp 10 11 # 定义测试报告的文件名称 12 reportname = datetime.today().strftime("%Y%m%d%H%M%S") + ".html" 13 # 定义测试任务集 14 testreport = unittest.TestSuite() 15 16 # 给测试任务集添加测试用例任务的名称 17 testreport.addTest(TestErp("test_case_1")) 18 testreport.addTest(TestErp("test_case_2")) 19 testreport.addTest(TestErp("test_case_3")) 20 testreport.addTest(TestErp("test_case_4")) 21 testreport.addTest(TestErp("test_case_5")) 22 testreport.addTest(TestErp("test_case_6")) 23 testreport.addTest(TestErp("test_case_7")) 24 testreport.addTest(TestErp("test_case_8")) 25 testreport.addTest(TestErp("test_case_9")) 26 testreport.addTest(TestErp("test_case_10")) 27 testreport.addTest(TestErp("test_case_11")) 28 testreport.addTest(TestErp("test_case_12")) 29 testreport.addTest(TestErp("test_case_13")) 30 testreport.addTest(TestErp("test_case_14")) 31 testreport.addTest(TestErp("test_case_15")) 32 testreport.addTest(TestErp("test_case_16")) 33 34 # 定义测试报告的文件路径 35 file_path = "D:\pythonproject\Wito_erp\wito_selenium\" + reportname 36 fp = file(file_path, "wb") 37 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, 38 title=u"测试报告", 39 description=u"用例执行情况:" 40 ) 41 # 执行测试任务集 42 runner.run(testreport) 43 44 fp.close() # 关闭文件 45 46 # 根据文件路径、定义附件名称发送邮件 47 unittest_smtp(file_path, reportname)
1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 from email.mime.text import MIMEText 5 from email.mime.multipart import MIMEMultipart 6 from email.header import Header 7 from email.utils import parseaddr, formataddr 8 import smtplib 9 10 11 def _format_address(text): 12 name, address = parseaddr(text) 13 return formataddr((Header(name, "utf-8").encode(), address)) 14 15 16 def unittest_smtp(file, filename): 17 from_address = "xx@xx.com" 18 # 发件箱地址 19 password = "123456!a" 20 # 授权密码 不是邮箱登录密码 21 # to_address = "xx@xx.com" 22 to_address = "xx@xx.com" 23 # 收件箱地址 24 smtp_server = "smtp.ym.163.com" 25 # 发件箱服务器地址 26 27 # message = MIMEText(mail_msg, "html", "utf-8") 28 29 message = MIMEMultipart() 30 # msg = MIMEText("测试smtp邮件发送功能", "plain", "utf-8") 31 # 第一个参数:邮件正文 32 # 第二个参数:邮件类型 纯文本 33 # 第三个参数:编码 34 35 message["From"] = _format_address("自动化测试报告 <%s>" % from_address) 36 # 发件人姓名与地址 37 message["To"] = _format_address("xx <%s>" % to_address) 38 # 收件人姓名与地址 39 message["Subject"] = Header("xx自动化测试平台邮箱服务", "utf-8").encode() 40 # 邮件标题 41 message.attach(MIMEText("xx自动化测试任务执行完毕,附测试报告文件", "plain", "utf-8")) 42 # 接收html格式文件 43 44 att1 = MIMEText(open(file, "rb").read(), "base64", "utf-8") 45 # 文件地址 46 att1["Content-Type"] = "application/octet-stream" 47 att1["Content-Disposition"] = "attachment; filename=%s" % filename 48 # 定义附件名称 49 50 message.attach(att1) 51 # 添加附件 52 try: 53 server = smtplib.SMTP(smtp_server, 25) 54 # 构造smtp服务器连接 55 server.set_debuglevel(1) 56 # 打开debug输出模式 57 server.login(from_address, password) 58 # 登录smtp服务器 59 server.sendmail(from_address, to_address, message.as_string()) 60 # 发送邮件 61 62 print "邮件发送成功" 63 server.quit() 64 except smtplib.SMTPException: 65 print "Error: 无法发送邮件"
最后附上邮件图片