

测试报告文件名写的是一个固定名字,每次生成测试报告会覆盖上一次的测试报告的文件
#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)
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)
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)
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"
"
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"
"
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"
"
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"
"
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包中创建login_failed.cvs和login_success.cvs文件,内容为正确的和错误的用户名,密码,验证码等测试数据
#项目结构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()