• 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""
            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

    # 项目结构的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()
    
  • 相关阅读:
    SSH协议简介与使用
    AIGC专栏9——Scalable Diffusion Models with Transformers (DiT)结构解析
    Pointpillar 论文解读
    lab1-4 PE结构
    基于Python实现的五子棋游戏设计
    心理健康数据集:mental_health_chatbot_dataset
    k8s整合kong
    ADSP-21569/ADSP-21593的开发入门(上)
    中高级Java程序员,你不得不掌握的基本功,挑战20k+
    SpringCache
  • 原文地址:https://blog.csdn.net/liuaoxiang/article/details/126471986