UI自动化(web端)之工具篇


大家好。我是小蔡:

  这是Web自动的第二章。上一张主要介绍selenium框架。这一章我介绍其他框架和工具

  今天分享的内容有几个方面:

    1.Unitest测试框架

    2.Log模块以及底层

    3.PO模式

    4.数据驱动

    5.HTML自动生成报告(GIT引入的一个包,哈哈)

  1.Unitest测试框架:

    引入Unitest的目的:1)解决一类多用的问题。2)需要断言

    核心组件: 

      TestCase[用例组件]

      TestSuite

      TestRunner(套件)

      TestLoader(套件)

      Fixture(工程装置)

    TestCase:

      操作:

        1.导包 import unittest

        2.新建类,并继承unittest.TestCase

        3.测试方法必须使用Test开头

      代码:

        import unittest

        class Test(unittest.TestCase)

    TestRunner(套件)/TestSuite:

      多个TestCase组成TeSuite套件

      使用:

        实例化

          suite = unittest.TestSuite

        添加用例:#添加

          suite.addTest(Test01("test_add"))

      执行套件:

        实例化

        runner = unittest_textTestRunner

        添加/执行套件

        runner.run(suite)

      扩展添加:         

        搜索指定classname 内中以test开头方法并执行套件

        my_name_si_shili=unittest.Testsuite()

        my_name_si_shili.addtest(unittest.makesuite(Test02))

        .....

    TestLoader方法类:

      解决批量导入的问题:将Testcase添加入套件,满足条件就添加  

      my_name_si_shili=unittest.TestLoader().discover(测试目录.查找py文件格式)

      不使用实例化

      unittest.defaultTestLoader.discover(../cases)

    区别(TestLoader与TestSuite)

      两者都是套件,前置是按指定目录,指定py文件。后者是按类和方法

    Fixture装置(前置通知/后置通知)

      #初始化函数 def setup()

      #结束函数    def setdown()

      级别:函数/类/模块

      类

      @classmethon 对类级别进行修饰

      def set/downclass()

      模块

      def set/downmodule()     

    断言UnitTest

      常用断言:

        asserture()

        asserfalse()

        assertEqual(参数1,参数2)

        assernotEqual(参数1,参数2)

        assertIn("XXX","XXX") #后面串包含前面的串

      扩展:

        python自带断言机制

        assert str1=str2

        assert str1 in str2  "错误信息"

        assert Ture/false

    Unittest跳过

      对一些为满足的测试用例进行跳过

         Unittest.Skip(‘代码未完成’)

        #可用于修饰测试函数跳过

      满足特定条件提过

        Unittest.SkipIf(跳过条件,原因)

    2.生成HTML测试报告

      因为Unittest没有自带HTML版的报告

      操作

      复制HTMLTestRunner.py文件到指定目录(git下载)

      导包操作 import HTMLTestRunner

      直接打开文件,并调用run方法

      实战操作:

                      

 

 

       扩展:

        open与with open 区别

        相同点:均是打开文件

        异同点:with open 等于打开关闭文件

        一般打开文件都怎么写:

          try:

            f=open("../目录”,“r”,enconding="utf-8")

            print(f.read())

          except:

            pass

          finally:

            f.close()

  3.PO模式:

    PO模式主要思想

      1.不采用任何方法

      2.采用测试框架

      3.将业务代码和页面对象进行(分离)

      4.实际编写 Po编写

    所以我们Web自动化架构分成:三层即page类,case类,base类

      page:一个页面一个对象

      case:集成base类+调用page页面

      base:抽取公共的方法

    

 

 

   4.数据驱动

    前置知识:

      Unittest框架时没有参数化插件的。需要建筑parameterized插件实现参数化

      parameterized使用步骤:

        导入parameterized框架包

        需要在参数化的测试函数上@parameterized.expand(列表)

        列表的值:单(列表)多(值为列表嵌套元组)【(1,2,3),(1,2,3,)】

      用法:

        class def_01(unittest.TestClass):

          #单个参数使用法:

          @parameterized.expand(["1,2,3"]):

          def test_add_one(sefl,num):

            pringt(num)

    思想:

      将数据放置到文件中,实现数据驱动

      是一种设计思想

      数据驱动技术是以讲关注点放到测试数据的构建上,可以将不同数据,执行相同用例上

      依赖于我们的前置参数化

    传入方式/载体:

      直接定义在脚本中

      从文件中读取:json,excel,xml,txt

      从数据库中获取

      直接从接口获取数据

      本地封装

    总结:

    数据驱动=数据存储+读取数据工具(自己写的)+参数化技术

    Json:

    问题:

      需要数据格式【(),()】,【(),()】

      解决:

      新建列表

      读取值,转化json

    arrys=[]

    for date in read_json(“login_json").values():

      arrys.append((date.get("username"))

    json基本情况介绍

      1.基于文本轻量级交换

      2.具有良好的结构

    【key,value】

    xml格式:

    <?xml version=8 encoding=utf-8"?>

    <person>

    ....

    </person>

    扩展:

    json与字典之间转化:

      转化代码:

      python--->json

        import json

        date= {"name":“名字”,“年龄”:“18” }

        date=json.dumps(date)

      json-->python

        import json

        json= {"name":“名字”,“年龄”:“18” }

        date2=json.loads(json)

      读取json:

        with open ('文件名',‘r’,enconding='utf-8') as f :

          date=json.load(f)

      写入json:

        json_01={'name':'tom','age':‘18’}

         with open('data.json','w',encoding='utf-8') as f:

          json.dump(json_01,f,ensure_ascill=False)

    编写数据数据读取工具类:(动态获取)

      def read_json(filename):

        filename="../date/"+filename

        #调用读取方法

        with open(filename,"r",enconding=utf-8) as f :

          return json.load(f)    

  5.日记模块:

    作用

      运行调试错误

      便于观察

    级别

      Debug调试级别

      Info信息级别

      WARINO警告

      Error出现不能用

      Crttal严重错误

    如何使用

      Logging模块

      logging{级别}

      #如何设置日记级别:

      logging,basicConfig(level=looging.DEBUG)   

      #如何设置日志格式:

      f=指定格式

      logging.basicConfig(level=looging.DEBUG,format=f,filename"路径格式")

    基本用法:

      def get_logging():

        f=指定格式

        logging.basicConfig(level=looging.DEBUG,format=f,filename"路径格式")

        return logging

      #在每个需要操作的步骤上方或者下方标注即可

      标注方式:logging.info

    高级用法:涉及logging类的底层,这个部分可看也可以不看

      日记的四大组件

        日记类:Logger   提供入口

        处理类:Handler  将logging日记发送到合适的目的输出

        格式器:Forratter   决定日志的输出格式

        过滤器:Fitter   提供了更细的粒度控制日志记录

      组件关系

        logger 需要多个Hanlder 将日志输出到A,B

        Hanlder需要设置 formatter 将日志输出到AB

        formatter设置,实现过滤

      获取Looger对象:

        logger =logger.getLogger()

        logger=logger.getLoggger("指定名称”)

      Logger常用对象:

        Logger.五个等级()

        Logger.setLevel()//设置日志将会处理等级

        Logger.addHandler()//为该logger对象添加handler

        Looger.addFilter()//为该logger对象添加一个filter对象

      Handler类

        #将消息分配到指定位置

        Logger对象可以通过addhandler()方法为自己添加对象

        #如何创建handler对象

        基本不实例化和handeler实例

        handler是个基类

        #logering内置handler包括:

        获取控制器(处理类)

        sh.logging.StreamHandle()

        logger.addHandler(sh)

        #时间处理器和格式处理器:

        #添加格式器

        #以及设置处理器级别

        最后。。。给大家看看成品吧 我实在是不想分步骤了

 

 

     最后呢运用了一个单例的设计模式。。去设计这个日记类。。就是预防多次调用,出现了多个logger()方法

  总结:

    web自动化基本上已经总结完了。后续会推出App自动化的学习笔记。也感谢各位关注。

    至于提到的Web项目的实战。会找一个三端的东西结合运用吧 App/Web/后台 三者的结合的系统(目前正在开发ing~)

    

             

         

              

              


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM