框架架构:
按照日期、时间生成报告
测试报告文件名写的是一个固定名字,每次生成测试报告会覆盖上一次的测试报告的文件
#1.获取当前文件的绝对路径
BASE_DIR =dirname(_file_)
#2.生成当前日期时间格式的测试报告
'''
1. 获取当前的年月日
2. 获取当前的时分秒
3. 利用当前的年月日数据生成保存测试报告文件夹的路径
4. 利用当前的时间秒数据生成测试报告的名字
'''
day = time.strftime("%Y%m%d", time.localtime(time.time())) # 获取当前的年月日
tm = time.strftime("%H%M%S", time.localtime(time.time())) # 获取当前的时分秒
#3.指定生成报告的路径
report_path = BASE_DIR + r'\reports\{}'.format(day)
#4. 测试报告的名字
report_path + '/{}.html'.format(tm)
runner.py
import unittest from HTMLTestRunner_cn import HTMLTestRunner # cases是项目存放测试文件的文件夹名 case_dir="cases" # test* 代表让unittest框架去搜索指定路径下以test开头的文件作为测试文件 dis=unittest.defaultTestLoader.discover(case_dir,pattern="test*.py") #根据 discover()方法返回的测试对象构建测试集 ts=unittest.TestSuite(dis) #使用unittest框架的文本模块 运行测试集并最终得到测试结果,--测试报告是文本 # unittest.TextTestRunner().run(ts) HTMLTestRunner( title='woniusales项目自动化测试报告', #测试报告的标题 description='woniusales项目登录模块测试结果', #测试报告的描述 stream=open("reports/login_test.html","wb"),#测试报告的路径 verbosity=2, #测试报告的详细程度 retry=2, # retry代表我们要设置的失败重试次数 save_last_try=False #如果想保留失败重试的结果,也是仅添加 save_last_try=False即可 ).run(ts)
main.py
import time from os.path import dirname #测试报告文件名写的是一个固定名字,每次生成测试报告会覆盖上一次的测试报告的文件 #1.获取当前文件的绝对路径 BASE_DIR=dirname(r"D:\Python\pycharm\untitled\cases\test_login.py") #2.生成当前日期时间格式的测试报告 # 1. 获取当前的年月日 # 2. 获取当前的时分秒 # 3. 利用当前的年月日数据生成保存测试报告文件夹的路径 # 4. 利用当前的时间秒数据生成测试报告的名字 day=time.strftime("%Y%m%d",time.localtime(time.time())) # 获取当前的年月日 tm=time.strftime("%H%M%S",time.localtime(time.time())) # 获取当前的时分秒 #3.指定生成报告的路径 reports_path=BASE_DIR+r'\reports\{}'.format(day) #4. 测试报告的名字 reports_path+'/{}.html'.format(tm)
case-test_login.py
import unittest import time import ddddocr from PIL import Image from selenium import webdriver #定义登录测试类 class LoginTest(unittest.TestCase): ## 初始化操作 每个测试方法执行前自动调用一次 比如初始化driver, 建立数据库连接等操作 # (可选方法, 根据实际需要来是否编写) def setUp(self) -> None: self.driver=webdriver.Chrome() #建立浏览器驱动对象 self.driver.get("http://localhost:端口/woniusales/") #通过浏览器驱动对象打开指定的网页网址 self.driver.maximize_window() #使打开的网页网址页面窗口最大化 self.imgs = [] #在测试类中定义imgs属性 self.driver.implicitly_wait(10) #设置隐式等待10S print('网址信息已加载完成') #登录测试用例1:正确的账户和密码登录 #标题:正确的账户和密码登录_成功 #预置条件:登录页面已打开 #测试数据: #预期结果:登录成功,跳转主页面的右边第二个元素的文本是注销 def test_login_success(self): self.driver.find_element("id","username").send_keys("admin") #用户名输入框 self.driver.save_screenshot("username.png") # 直接保存截图文件,相对路径 #第一步:截图生成64位二进制内容 img1=self.driver.get_screenshot_as_base64() # 直接保存截图文件,绝对路径 # 在测试方法中 增加截图的代码 self.imgs.append(self.driver.get_screenshot_as_base64()) str=f"<img src='data:image/png;base64,{img1}'>" with open("reports\login_test.html", "w") as file: file.write(str) self.driver.find_element("id","password").send_keys("Milor123") #密码输入框 self.driver.save_screenshot("password.png") # 直接保存截图文件,相对路径 # 第一步:截图生成64位二进制内容 img2 = self.driver.get_screenshot_as_base64() # 直接保存截图文件,绝对路径 # 在测试方法中 增加截图的代码 self.imgs.append(self.driver.get_screenshot_as_base64()) str=f"<img src='data:image/png;base64,{img2}'>" with open("reports\login_test.html", "w") as file: file.write(str) #================================================================= #图片验证码区域(验证图片抠图解析验证码输入) self.driver.find_element("id", "logincode").screenshot(r"screenshot\logincode.png") time.sleep(1) f=open(r"screenshot\logincode.png", "rb") # 打开抠图下来的图片 img_byte=f.read() # 读取图片上面的文本字符 time.sleep(1) f.close() #关闭图片 # 使用ocr解析,抠图下来的(二进制)字符 ocr=ddddocr.DdddOcr() # 使用ocr模块解析 time.sleep(1) ret=ocr.classification(img_byte) # 解析之后的对应文本字符 #==================================================================== self.driver.find_element("id","verifycode").send_keys(ret) #验证码输入框 # 第一步:截图生成64位二进制内容 img3 = self.driver.get_screenshot_as_base64() # 直接保存截图文件,绝对路径 # 在测试方法中 增加截图的代码 self.imgs.append(self.driver.get_screenshot_as_base64()) str=f"<img src='data:image/png;base64,{img3}'>" with open("reports\login_test.html", "w") as file: file.write(str) self.driver.find_element("class name","form-control.btn-primary").click() #点击登录按钮 # 第一步:截图生成64位二进制内容 img4= self.driver.get_screenshot_as_base64() # 直接保存截图文件,绝对路径 # 在测试方法中 增加截图的代码 self.imgs.append(self.driver.get_screenshot_as_base64()) str = f"<img src='data:image/png;base64,{img4}'>" with open("reports\login_test.html", "w") as file: file.write(str) #===============断言==================== data="注销" #期望结果值 result=self.driver.find_element("xpath","//*[@id='navbar']/ul[2]/li[2]/a").text #登录之后主页面的右边第二个元素的文本实际结果 self.assertEqual(data,result,msg="测试不通过,页面没有显示注销") time.sleep(2) self.driver.find_element("xpath", "//*[@id='navbar']/ul[2]/li[2]/a").click() #点击注册恢复测试环境 # 清理操作 每个测试方法执行后自动调用一次 比如退出driver, 断开数据库连接等操作 # (可选方法, 根据实际需要来是否编写) def tearDown(self) -> None: pass
data
# 项目结构的data包中创建login_failed.cvs和login_success.cvs文件,内容为正确的和错误的用户名,密码,验证码等测试数据
utitls
#项目结构utitls包中创建辅助类,编写通用方法如从CVS文件,Excel文件,数据库中读取测试数据 import unittest import pymysql import xlrd from ddt import ddt,data,unpack get_db=[] #定义从数据库中获取到的测试数据内容 class Utils: #从data包中csv文件内读取测试数据 @classmethod def get_data_from_csv(cls,path): pass # 从data包中Excel文件内读取测试数据 def get_data_from_excel(cls): pass # 从数据库中读取测试数据 def get_data_from_db(cls): # 1.准备sql语句 sql4 = "select username,password from user" # print(sql4) # 2.连接数据库,获取连接对象 db_con = pymysql.connect(host='localhost', port=3306, user='root', password='', database='woniusales',charset='utf8') # print(db_con) # 3.创建游标对象 mycur = db_con.cursor() # 4.用游标对象执行sql语句 mycur.execute(sql4) # 5.处理执行结果(游标对象提取查询的结果) student = mycur.fetchall() # 6.关闭连接 db_con.close() # print(student) for i in range(len(student)): get_db1=[] for j in range(len(student[i])): get_db1.append(student[i][j]) get_db.append(get_db1) print(f"数据库中的数据为:{get_db}") ut=Utils() ut.get_data_from_db()