zoukankan      html  css  js  c++  java
  • Selenium2 Python 自己主动化測试实战学习笔记(五)

        

    7.1 自己主动化測试用例

             无论是功能測试、性能測试和自己主动化測试时都须要编写測试用例,測试用例的好坏能准确的体现了測试人员的经验、能力以及对项目的深度理解。

    7.1.1 手工測试用例与自己主动化測试用例

             手工測试用例是针对手工測试人员。自己主动化測试用例是针对自己主动化測试框架。前者是手工測试用例人员应用手工方式进行用例解析,后者是应用脚本技术进行用例解析。

             前者具有较好的异常处理能力,并且可以基于測试用例,制造各种不同的逻辑推断,并且人工測试步步跟踪,可以仔细定位问题。后者全然依照測试用例的步骤进行測试,仅仅能在已知的步骤和场景中发现问题。并且往往由于网络问题或者功能的微小的变化导致用例运行异常,自己主动化的运行也非常能发现新的bug。

             手工測试用例和自己主动化測试用对照:

             手工測试用例:

    l  较好的异常处理能力,能通过人为的逻辑推断校验当前步骤的功能实现正确与否。

    l  人工运行用例具有一定的步骤跳跃性。

    l  人工測试步步跟踪,可以仔细的定位问题。

    l  主要用来发现功能缺陷

    自己主动化測试用例:

    l  运行对象是脚本,不论什么一个推断都须要编码定义。

    l  用例步骤之间关联性强。

    l  主要用来保证产品主体功能正确完整和让測试人员从繁琐反复的工作中解脱出来。

    l  眼下自己主动化測试阶段定位在冒烟測试和回归測试。

    自己主动化測试用例选型注意事项:

    1.  不是全部的手工用例都要转为自己主动化測试用例。

    2. 考虑到脚本开发的成本,不要选择流程太复杂的用例。

    假设有必要。能够考虑把流程拆分多个用例来实现脚本。

    3.      选择的用例最好能够构建成场景。比如一个功能模块。分n 个用例,这n 个用例使用同一个场景。这种优点在于方便构建keyword測试模型。

    4.      选择的用例能够带有目的性,比如这部分用例是用例做冒烟測试,那部分是回归測试等,当然,会存在重叠的关系。假设当前用例不能满足需求,那么唯有改动用例来适应脚本和需求。

    5.      选取的用例能够是你觉得是反复运行,非常繁琐的部分,比如字段验证,提示信息验证这类。这部分适用回归測试。

    6.      选取的用例能够是主体流程,这部分适用冒烟測试。

    7. 自己主动化測试也能够用来做配置检查,数据库检查。这些可能超越了手工用例,可是也算用例拓展的一部分。项目负责人能够有选择地添加。

    8. 假设平时在手工測试时。须要构造一些复杂数据,或反复一些简单机械式动作,告诉自己主动化脚本。让他来帮你。也许你的效率因此又提高了。

    7.1.2 測试类型

     静态内容測试是最简单的測试,用于验证静态的、不变化的UI 元素的存在性。比如:

    每一个页面都有其预期的页面标题?这能够用来验证链接指向一个预期的页面。

    •应用程序的主页包括一个应该在页面顶部的图片吗?

    •站点的每个页面是否都包括一个页脚区域来显示公司的联系方式,隐私政策,以及商标信息?

    •每一页的标题文本都使用的<h1>标签吗?每一个页面有正确的头部文本内吗?

    您可能须要或也可能不须要对页面内容进行自己主动化測试。假设您的网页内容是不易受到影响手工对内容进行測试就足够了。假设,比如您的应用文件的位置被移动,内容測试就很有价值。

     

    測试链接:Web 网站的一个常见错误为的失效的链接或链接指向无效页。链接測试涉及点各个链接和验证预期的页面是否存在。假设静态链接不常常更改,手动測试就足够。可是,假设你的网页设计师常常改变链接,或者文件不时被重定向,链接測试应该实现自己主动化。

     

    功能測试一般是须要自己主动化測试的最复杂的測试类型,但也一般是最重要的。典型的測试是登录,注冊站点账户,用户帐户操作,帐户设置变化,复杂的数据检索操作等等。功能測试通常相应着您的应用程序的描写叙述应用特性或设计的使用场景。

     

    測试动态元素:通常一个网页元素都有一个唯一的标识符,用于唯一地定位该网页中的元素。

    通常情况下,唯一标识符用HTML 标记的’id’属性或’name’属性来实现。这些标识符能够是一个静态的,即不变的、字符串常量。

     

    Ajax 的測试:Ajax 是一种支持动态改变用户界面元素的技术。页面元素能够动态更改,但不须要浏览器又一次载入页面,如动画,RSS源,其它实时数据更新等等。Ajax 有不计其数的更新网页上的元素的方法。可是了解AJAX的最简单的方式,能够这样想,在Ajax 驱动的应用程序中,数据能够从应用server检索,然后显示在页面上,而不需又一次载入整个页面。

    仅仅有一小部分的页面,或者仅仅有元素本身被又一次载入。

     

    在编写用例过程中应该遵守下面几点原则:

    1、一个脚本是一个完整的场景。从用户登陆操作到用户退出系统关闭浏览器。

    2、一个脚本脚本仅仅验证一个功能点。不要试图用户登陆系统后把全部的功能都进行验证再退出系统

    3、尽量仅仅做功能中正向逻辑的验证。不要考虑太多逆向逻辑的验证,逆向逻辑的情况非常多(比如手号输错有非常多种情况),验证一方面比較复杂。须要编写大量的脚本,还有一方面自己主动化脚本本身比較脆弱。非常多非正常的逻辑的验证能力不强。

    (我们尽量遵循用户正常使用原则编写脚本就可以)

    4、脚本之间不要产生关联性,也就是说编写的每个脚本都是独立的,不能依赖或影响其它脚本。

    5、假设对数据进行了改动,须要对数据进行还原。

    6、在整个脚本中仅仅对验证点进行验证。不要对整个脚本每一步都做验证。


    8.1  使用HTMLTestRunner生成測试报告

    HTMLTestRunner 是Python 标准库的unittest 单元測试框架的一个扩展。它生成易于使用的HTML 測试报告。HTMLTestRunner 是在BSD 许可证下公布。

    首先要下HTMLTestRunner.py 文件,下载地址:

    http://tungwaiyip.info/software/HTMLTestRunner.html

    HTMLTestRunner.py 本是一个.py 文件,将它放到Python 安装文件夹下就可以调用。

    Windows :将下载的文件放入...Python27Lib文件夹下。

     

    在Python 交互模式引入HTMLTestRunner 包,假设没有报错,则说明加入成功。

    >>> importHTMLTestRunner

    8.1.1    生成HTMLTestRunner測试报告

    testBaidu.py

    #coding=utf-8
    fromselenium import webdriver
    importunittest,time
    importHTMLTestRunner
    classMyTest(unittest.TestCase):
       
        def setUp(self):
            self.driver = webdriver.Chrome()
            self.driver.maximize_window()
            self.driver.implicitly_wait(10)
            self.base_url ="http://www.baidu.com"
           
        def test_baidu(self):
            driver = self.driver
            driver.get(self.base_url +"/")
            driver.find_element_by_id("kw").clear()
            driver.find_element_by_id("kw").send_keys("HTMLTestRunner")
            driver.find_element_by_id("su").click()
        def tearDown(self):
            self.driver.quit()
    if__name__=="__main__":
        testSuite=unittest.TestSuite()
        testSuite.addTest(MyTest("test_baidu"))
        Html=".\result.htm"
        fp=file(Html,'wb')
     
        runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'百度搜索測试报告',description=u'用例运行情况:')
        runner.run(testSuite)
        fp.close()

             首先将HTMLTestRunner 模块imoport 进来。定义測试报告的存放路径fiename,通过file()将文件以读写的方式打开。

    接着调用HTMLTestRunner 模块下的HTMLTestRunner 方法。

    stream 指定測试报告文件。title 用于定义測试报告的标题。description 用于定义測试报告的副标题。

    如今通过HTMLTestRunner 的run()方法来执行測试套件中所组装的測试用例。

    最后fp.close()来关闭測试报告文件。

     

    通过Python 提供的help()来查看类和方法的说明。

            >>> import HTMLTestRunner

           >>>help(HTMLTestRunner)

           每次执行測试之前之前都要手动的去改动报告的名称,假设忘记改动就会把之前的报告覆盖。这样做显然会麻烦。那么有没有办法使每次生成的报告名称都不一样而且更有意义,我们能够在报告名称中增加当前时间,这样报告不会重叠而且更清晰的知道生成的前后时间.

            time.time() 获取当前时间戳。

    time.ctime() 当前时间的字符串形式。

    time.localtime() 当前时间的struct_time形式。

    time.strftime() 用来获得当前时间,能够将时间格式化为字符串。

    Python 中时间日期格式化符号:

    %a                   星期几的简写

    %A                   星期几的全称

    %w                  十进制表示的星期几(值从06,星期天为0

    %d                   十进制表示的每月的第几天

    %b                   月份的简写

    %B                   月份的全称

    %m                  十进制表示的月份

    %y                   不带世纪的十进制年份(值从099

    %Y                   带世纪部分的十制年份

    %H 24             小时制的小时

    %I 12               小时制的小时

    %p                   本地的AMPM 的等价显示

    %M                  十时制表示的分钟数

    %S                   十进制的秒数

    %f                    十进制的微秒,零填充左边

    %Z                   当前时区的名称

    %j                    十进制表示的每年的第几天

    %U                  一年中的星期数(00-53)星期天为星期的開始

    %W                  一年中的星期数(00-53)星期一为星期的開始

    %x                   本地对应的日期表示

    %X                   本地对应的时间表示

    %%                  %号本身

    获取当前时间:now = time.strftime("%Y-%m-%d %H_%M_%S")

      眼下測试报告仅仅集成到了单个測试文件里,我们的终于目的是将其集成表all_test.py 文件里。以下打开all_test.py 文件,做例如以下改动:UnitTestProjectall_test.py

    #coding=utf-8
    import unittest
    import HTMLTestRunner
    import time
     
    def creatSuite():
       testunit=unittest.TestSuite()
       test_dir="C:\Users\ewang\Desktop\Python_Selenium2\UnitTest\Project\test_case"
       discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py",top_level_dir=None)
     
       for test_suit in discover:
            for test_case in test_suit:
                testunit.addTest(test_case)
       return testunit
            
    now = time.strftime("%Y-%m-%d%H_%M_%S")
    filename ='.\report\'+now+'result.html'
    fp = file(filename, 'wb')
    runner=HTMLTestRunner.HTMLTestRunner(
                       stream=fp,
                       title=u'百度搜索測试报告',
                       description=u'用例运行情况:')
     
     
    if __name__=="__main__":
       alltest=creatSuite()
      runner.run(alltest)

    8.2 创建定时任务

    为了让自己主动化測试“自己主动化”起来。如今我们来创建定时任务,使自己主动化測试脚本在指定的时间自己主动化执行。

    创建定时任务的方法有非常多,比方,我们能够写一段程序让其在指定的时间执行all_test.py 文件。或者使用系统的定时任务功能在指定的时间执行all_test.py文件。

  • 相关阅读:
    Linux Shell中的特殊符号和含义简明总结(包含了绝大部份)
    Linux学习笔记:cat、tac、more、less、head、tail查看文件内容
    Linux学习笔记:pwd与dirs的区别
    Linux学习笔记:nohup & 后台任务
    Linux学习笔记:输入输出重定向 >>命令
    Linux学习笔记:vi常用命令
    Linux学习笔记:touch新建文件、修改访问、改动时间
    Linux学习笔记:mkdir创建文件夹
    Linux学习笔记:mv移动或文件重命名
    Shell学习笔记:#*、%*字符串掐头去尾方法
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7270787.html
Copyright © 2011-2022 走看看