unittest自动化框架

框架架构: 

 

按照日期、时间生成报告  


  测试报告文件名写的是一个固定名字,每次生成测试报告会覆盖上一次的测试报告的文件
  
#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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值