51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 9018|回复: 0
打印 上一主题 下一主题

[转贴] 基于Splinter的自动化回归/测试脚本

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:07
  • 签到天数: 1020 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-1-5 10:21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1测试积点
     总结来说就是用一种自动化回归脚本的方式,可以重复性的回归现有功能,并给出回归测试报告。
      基于这个想法,我开发了这个脚本,定义了一套开发模式,基于这个模式,只要针对每个case添加如下的脚本代码:
    1. caseBegin('输入关键字执行搜索')  ——>测试开始,其实就是打印一个日志     
    2.   reset(__url)                  ——>重置访问指定URL,如s.etao.com     
    3.   addQ('nokia')           ——>添加Q参数,搜索框只有一个固定的q参数可以输入     
    4.   submit()                ——>提交搜索表单     
    5.   jumpUrl('auctions.htm')     
    6.   ——>我们期望结果会跳转到auctions.htm,也可以指定在页面什么区域显示什么内容,     
    7.   目前支持三种:     
    8.   1、结果外跳到某个页面,这个内部会根据指定的页面名称生成一个匹配正则;     
    9.   2、本页面提示某个信息;     
    10.   3、跳转到外部某个页面提示某个信息;     
    11.   caseEnd()               ——>测试结束,其实没有做什么,只是打了日志保存结果,可以扩展成邮件发送之类  
    复制代码
    通过现在的自动脚本跑出来的结果:  
      检查[http://m.etao.com能否正常访问]:
      pass.
      -------------------[End]-----------------------
      检查[未输入关键字执行搜索]:
      期望结果:在本页面中提示信息请输入品牌或型号进行比价
      pass.
      -------------------[End]-----------------------
      检查[输入关键字执行搜索]:
      期望结果:页面跳转到auctions.htm
      pass.
      -------------------[End]-----------------------
      检查[搜索列表页输入空关键字搜索]:
      期望结果:跳转到页面:index.htm,提示信息:请输入品牌或型号进行比价
      期望结果:页面跳转到index.htm
      pass.
      期望结果:在本页面中提示信息请输入品牌或型号进行比价
      pass.
      -------------------[End]-----------------------
      检查[输入关键字搜索]:
      期望结果:页面跳转到auctions.htm
      pass.
      -------------------[End]-----------------------  
      可以较为清晰的看到回归了哪些功能,结果是怎样的。将人肉从重复性的工作中解放出来。例子是在一淘项目中使用的代码,但是具体的步骤库是通用的。
      现在脚本的开发上可能比较复杂,需要涉及python,splinter,正则甚至是jquery的部分语法,后续打算采用自动生成的方式来做。
      如果大家有其他好的想法,非常欢迎一起交流碰撞。
    1. #!/user/bin/python  
    2.   # -*- coding: utf8 -*-  
    3.     
    4.   import sys  
    5.   import re  
    6.   from splinter.browser import Browser  
    7.     
    8.   #####################################################  
    9.   # global instance  
    10.   CLOASE_AFTER_TEST = True # 测试完毕是否自动关闭浏览器  
    11.     
    12.   GBK = "gbk"  
    13.   UTF8 = "utf8"  
    14.     
    15.   #####################################################  
    16.   # encoding for console  
    17.   reload(sys)  
    18.   sys.setdefaultencoding(UTF8)  
    19.     
    20.   #####################################################  
    21.   # small method  
    22.   encoding = lambda x:x.encode(GBK)  
    23.     
    24.   #####################################################  
    25.   # Method output  
    26.   def output(x):  
    27.       """
    28.           encode and print
    29.       """  
    30.       print encoding(x)  
    31.     
    32.   # Method resultMsg  
    33.   def resultMsg(x, msg=''):  
    34.       """
    35.           judge result and print, x : True or False
    36.       """  
    37.       if x == True:  
    38.           output('pass.')  
    39.       else:  
    40.           output('[X]not pass.'+msg)  
    41.     
    42.   # Method infoMsgThisPage  
    43.   def infoMsgThisPage(espectMsg, positionPattern, getPositionMethodName):  
    44.       """
    45.           在本页面提示信息
    46.           espectMsg:期望提示的信息
    47.           positionPattern:位置匹配串,根据getPositionMethodName参数的不同而不同类型
    48.           getPositionMethodName:获取位置的方法,有Splinter提供,可选择列表
    49.               使用CSS方式查找: find_by_css
    50.               使用Xpath查询语言: find_by_xpath
    51.               使用Tag查找:find_by_tag
    52.               使用name查找:find_by_name
    53.               使用id查找:find_by_id
    54.               使用value查找:find_by_value
    55.       """  
    56.       output('期望结果:在本页面中提示信息'+espectMsg)  
    57.     
    58.       function = getattr(browser, getPositionMethodName)  
    59.       if callable(function):  
    60.           errorbox = function(positionPattern)  
    61.           if errorbox is not None and len(errorbox) == 1:  
    62.               resultMsg(espectMsg == errorbox[0].value)  
    63.           elif len(errorbox) > 1:  
    64.               resultMsg(False, '根据您指定的错误信息位置匹配串,页面含有一个以上的错误显示区域,请检查页面')  
    65.           else:  
    66.               resultMsg(False, '根据您指定的错误信息位置匹配串,页面没有找到错误显示区域,请检查页面')  
    67.       else:  
    68.           resultMsg(False, 'ERROR:method'+function+'is not callable.')  
    69.     
    70.   # Method jumpUrl  
    71.   def jumpUrl(urlPattern):  
    72.       """
    73.           页面跳转出去到新的页面提示信息,使用本方法不关注页面提示内容,仅仅关注跳转页面是否正常
    74.           urlPattern:期望跳转到的页面的匹配串,可以是普通页面名称
    75.       """  
    76.       output('期望结果:页面跳转到'+urlPattern)  
    77.     
    78.       if urlPattern[-1] != '/':  
    79.           pattern = "^("+urlPattern+"\?).*"  
    80.           urlPattern = urlPattern + "?" # 截取出来的会带有一个?,所以这里也要加一个,否则无法相等  
    81.       else:  
    82.           pattern = "^("+urlPattern+").*"  
    83.     
    84.       r = re.search(re.compile(pattern, re.IGNORECASE), browser.url)  
    85.       if r is not None and len(r.groups()) == 1:  
    86.           resultMsg(urlPattern == "".join(["%s" % s for s in r.groups()]), '未跳转到指定结果页面')  
    87.       elif r is not None and len(r.groups()) > 1:  
    88.           resultMsg(False, '在跳转结果URL中找到了两个'+urlPattern+'相关的串,请检查是否有问题')  
    89.       else:  
    90.           resultMsg(False, '跳转结果URL中没有找到'+urlPattern)  
    91.     
    92.   # Method : jumpUrlAndInfoMsg  
    93.   def jumpUrlAndInfoMsg(urlPattern, espectMsg, positionPattern, getPositionMethodName):  
    94.       """
    95.           页面跳转到指定页面,提示指定信息
    96.           具体参数请参见 jumpUrl 方法和 infoMsgThisPage 方法
    97.       """  
    98.       output('期望结果:跳转到页面:'+urlPattern+',提示信息:'+espectMsg)  
    99.       jumpUrl(urlPattern)  
    100.       infoMsgThisPage(espectMsg, positionPattern, getPositionMethodName)  
    101.     
    102.   #####################################################  
    103.   # 页面错误提示文案  
    104.   ERROR_WITHOUT_Q = "请输入品牌或型号进行比价"  
    105.     
    106.   #####################################################  
    107.   # 开始执行测试逻辑部分  
    108.   browser = Browser()  
    109.   __url = 'http://m.etao.com'  
    110.     
    111.   reset = lambda x:browser.visit(x)  
    112.   submit = lambda:browser.find_by_value('比价').first.click()  
    113.   addQ = lambda q:browser.fill('q', q.decode(UTF8))  
    114.     
    115.   caseEnd = lambda:output('-------------------[End]-----------------------')  
    116.   caseBegin = lambda m:output('检查['+m+']:')  
    117.     
    118.   try:  
    119.       # check service is ok or not  
    120.       caseBegin(__url+"能否正常访问")  
    121.       reset(__url)  
    122.       resultMsg(browser.status_code.is_success())  
    123.       caseEnd()  
    124.     
    125.       # without q  
    126.       caseBegin('未输入关键字执行搜索')  
    127.       addQ(' ')  
    128.       submit()  
    129.       infoMsgThisPage(ERROR_WITHOUT_Q, "div[class='detail blue-box Amazing']", 'find_by_css')  
    130.       caseEnd()  
    131.     
    132.       # with q  
    133.       caseBegin('输入关键字执行搜索')  
    134.       reset(__url)  
    135.       addQ('nokia')  
    136.       submit()  
    137.       jumpUrl('http://s.m.etao.com/auctions.htm')  
    138.       caseEnd()  
    139.     
    140.       caseBegin('搜索列表页输入空关键字搜索')  
    141.       reset('http://s.m.etao.com/auctions.htm?q=nokia')  
    142.       addQ(' ')  
    143.       submit()  
    144.       jumpUrlAndInfoMsg('http://s.m.etao.com/index.htm', ERROR_WITHOUT_Q, "div[class='detail blue-box Amazing']", 'find_by_css')  
    145.       caseEnd()  
    146.     
    147.       caseBegin('输入关键字搜索')  
    148.       reset('http://s.m.etao.com/auctions.htm?q=nokia')  
    149.       addQ('手机')  
    150.       submit()  
    151.       jumpUrl('http://s.m.etao.com/auctions.htm')  
    152.       caseEnd()  
    153.     
    154.   except Exception, e:  
    155.       print e  
    156.     
    157.   if CLOASE_AFTER_TEST:  
    158.       browser.quit()  
    复制代码





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-19 06:45 , Processed in 0.066339 second(s), 21 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表