• @601068603 对于手机短信验证码获取不太懂,代码可以稍微该下。本地没尝试,你可以试试看哦!

    def getCodeFromSms(timeout=20):
        os.system("adb logcat -c")
        cmd = ' adb logcat -d |findstr D/Mms/Txn'
        n = 0
        while n < timeout:
            smscode = os.popen(cmd).read()
            print(smscode)
            if smscode != " ":
                smscode = smscode.split("验证码:")[1].split(",")[0]
                print("code is {}:".format(smscode))
                break
            else:
                time.sleep(1)
                n += 1
                print('已等待:{}秒'.format(n))
                continue
        print('短信接收失败!')
    
  • #6 楼 @pyattack 如果是 UI 层的自动化,这么设计,相对已经算是比较灵活了啊,不知道你说的这种方式太死板,目前的疑惑主要是如何比较好的进行数据驱动,把用例和数据分离开来,还指哪些?是说封装好后,case 调用,写的样式都差不多吗?
    你希望这样?:

    
    test001:
          - ID:search
          - value:vaules
          - action:search
    

    然后各种封装后调用

    def case():
        #定位location()
        #输入send_keys()
        #执行动作action()
    

    data 驱动 case

  • 自己理解的 PO 设计模式,大概这样:

    1.元素定位

    elements.py

    def find_element(*loc):
        return driver.find_element(*loc)
    
    def send_params(value,ipt_element):
        return ipt_element.send_keys(value)
    
    def click_btn(*loc):
        return driver.find_element(*loc).click()
    

    2.定位器

    单独写在配置文件中,yaml,xml,ini,config 等

    locators.py

    login_username = (By.ID,'username')
    search_btn = (By.ID,'search')
    .....
    

    3.每个页面封装该 page 经常使用到的元素或操作

    例如首页搜索功能

    homePage.py

    def search_action(value):
         search_ipt = find_element(locators.search_ipt)
         search_btn = find_element(locators.search_btn)
         send_params(value,search_ipt) 
         click_btn(search_btn)
         return value in driver.page_source
    

    例如购物车页面的立即结算按钮

    buyCartPage.py

    def order_cart():
          click_btn(find_element(*loc))
    

    4.测试用例

    testCase.py

    def test_search( ):
          assertTrue search_action()
    
    
    def test_order_placing():
          ....
          add_cart()
          ....
          #点击结算
          order_cart()
          ....
          assertTrue('success' in page)
    

    以上代码写的粗略,主要表达设计思路,感觉 PO 的设计就是层层递进。
    好处就是尽可能把易变的东西分离出来,以保证整体稳定性。谢谢

  • 点击 Tools→View RIDE log ,查看下报错信息。

  • 测试的一些误区 at 2016年10月24日

    别因为争论影响了工作心情啊,很少能看到这种盛况→测试技术人在 TesterHome 争论的面红耳赤,可能对于二位不太好把,但是对于大部分人来说,学到了很多,总之我是学到挺多的!最简单的方法→列个条目 1、2、3 一次只回答一条,1 条没结束讨论,就不开始下一条。😜

  • #8 楼 @quqing 非常感谢,学习了。

  • 看到题主关于自动化的分享, 有几个延伸问题,自己在工作中一直思考,但是一直没有找到合适的答案。

    1. 接口自动化和 UI 自动化的用例是完全重新设计,还是从业务用例中筛选?IF 从业务用例中筛选的话,筛选的标准有哪些呢?(PS:接口用例中的接口参数类型的用例设计,暂不考虑)

    2. 接口自动化和 UI 自动化,互相之间有影响吗?或者说接口覆盖的用例和 UI 覆盖的用例之间是否有某种关联?IF 有关联,请问需要多大粒度的关联比较合适?ELIF 没关联,请问两者之间各自为战吗?(PS:这样会不会导致测试覆盖率重复呢?)

    3. 如果 UI 层的用例 Faile,是不是需要定位到对应的接口层?相反,接口层用例 faile,是否需要定位到 UI 层,IF 以上需要,如何有效关联呢?Or 是否需要在分层测试的工程中,让他们互相成为彼此的辅助?

  • #7 楼 @Tank007 打断点看看? 那没招了,坐等 ds 来。

  • #4 楼 @Tank007
    应该不是实例化了 2 次哦,单例是实例化对象在内存中的地址是同一个地址。
    单例模式的_new() 方法是在__init_() 之前被调用

    cls.instance.logger = logging.getLogger(cls.instance.logger_name)
    

    这行代码在运行的时候,相当于 cls.instance 已经有一个类属性 logger
    当你在初始化实例时,并调用 get_logger() 方法时,实际上

    logsignleton = LogSignleton(conf_path)
    

    又返回了一个 logger 对象。
    所以你在使用的时候,logger.debug('向右滑动') 就返回两次输出。一个是类实例的输出,一个是类本身的属性输出。


    修改下 get_logger 方法:

    def get_logger(self,logger_name):
        return logging.getLogger(logger_name)
    
    # 这行注释掉试试看:
    ls.instance.logger = logging.getLogger(cls.instance.logger_name)
    

    以上是猜测,未做本地验证,不知道 debug 的对不对,若错误了,请指出,谢谢

  • 提一个小小小的建议啊😁 ,python @classmethod 装饰的函数,一般第一个参数是用 cls。不建议使用 self 哦,sorry。

    @classmethod
    def setUpClass(self):
        self.driver = WebDriver(desired_caps, server_url)
        self.driver.init()
    
  • @nancy2896 ‘’ 导入文档控件 filePicker,没有类似 input type='text' 的属性,虽然你定位到了这个元素,但是后续的 send_keys() 方法,找不到输入框,所以提示你无法获得焦点的啊。

  • #7 楼 @chenhengjie123 恩恩,已看,谢啦。

  • #4 楼 @heyniu OK。

  • #2 楼 @jacexh 😅 确实是没太懂 2 个的区别,谢了。

  • #1 楼 @among29 恩呢,我的也是 2.10,直接 get 会显示 params 参数,如果是 requests.Session().get(),就不显示勒。谢谢

  • @ycwdaaaa 支持你。人天生有惰性,工作时间久了,混日子也就慢慢培养出来。像你这样的负责和热心很少了,很多评论可能都是仅仅针对你的内容,换个角度看,可能更容易理解你的想法!

  • 测试迷茫求解惑 at 2016年06月12日

    各位学接口自动化的时候除了语言要学,还需要学哪些知识?怎么整合在一起去实践的?

    说下自己的 web 接口自动化测试的学习经历,提供一些参考。

    1. 首先清楚接口测试的目的是什么?有目的性不会让自己在测试的过程中迷茫。

      接口测试个人的理解是为了验证在 UI 层测试时,无法触及到的一些深层次的测试点,还是归结到 “功能测试”。保证后端或者外部提供的接口调用时的正确性,当然还可以做一些性能方面的测试。

    2. 为保证以上的接口测试目的性,需要业务验证,构造请求,断言响应,为满足以上 3 个需求,了解接口实现的业务,” 请求方法,请求参数。请求字段,通用字段,响应字段,响应解析等等 http 协议相关方面的知识,推荐可以看下《图解 HTTP》或《HTTP 权威指南》

    3. 了解基础知识后,需要知道接口如何工作的,例如前端的一个 submit 按钮,点击提交后调用http://www.xxxxx.com/api/case/add?data=response 给客户端。{}接口,会把用户录入的文字作为接口参数传递给服务器端程序,后端会对传递的参数处理后写入到数据库,并返回一个

    4. 找到一个接口自动化的工具,例如 python 中的 urllib,urllib2,requests(建议 requests),熟悉 requests 的文档。了解 api 的使用,例如 get,post,图片上传,流式上传,提交 cookies,会话对象等等。

    5. 最后就是所学在实际中使用,可以在平时生活中,练习爬虫,工作中,可以向开发要接口文档,自己尝试写下,不懂的随时问开发,大部分开发还是很乐意帮助的😄

      当然还有一些需要知道的,fiddler,chrome 开发着工具,firebug,数据库相关的等等。
      以上就是最近接口测试中的一些总结,还有很多不足或遗漏的地方,大家一起努力。

  • #2 楼 @monkey 高级语言黑,O(∩_∩) O

  • hi,遇到一个问题。

    <h3 class="title" onclick="javascript:set_map_data('http://www.xxxxx.com');"></h3>  
    

    请问下类似这种 js 跳转的链接,应该如何检测呢?

  • 功能性:
    1:检查是否以实际价格的 20% 购入
    2:检查是否每个人限制为 1 张,如果一个人买 2 张的话是否可以通过验证
    3:检查上限 1000 张全部售出验证是否还可以继续购买
    4:因为是移动 APP 的一个活动,应该是H5的页面,需要要考虑该方面的检查
    ①:前端是否可以实时刷新
    ②:前端提示是否友好,例如:“提示一个用户只可以购买一张” 或 “已全部售罄” 等等
    ③:既然是活动,考虑活动时间范围检查。

    兼容性:
    1:在不同设备,不同系统,不同系统版本该 “活动” 的兼容性检查
    性能:
    1:考虑并发,高峰等测试(性能不熟悉)等等把
    2:加载H5页面的时间。
    可靠性检查
    1:模拟monkey测试10000次检查活动页面的可靠性
    服务器端检查
    1:活动相关接口性能,接口的响应时间,平均时间等等
    2:检查前端提交的表单数据,数据方面的检查(具体没做过,不太清楚,但是我想应该考虑下数据方面)
    专项测试:
    1:该活动界面的 CPU,GPU,耗电量,流量消耗检查等等
    2:弱网络,不同网络 wifi,3G ,4G 浏览的情况
    3:断网情况下的检查
    4:提交按钮双击检查。
    5:最好做下 fiddler 的抓包,篡改数据后重新发包,看后端的处理。
    体验检查:
    因为是一个电影 app 的售票活动,用户应该基本是青年
    所以考虑,界面的交互是否简单,提示是否友好,界面设计是否美观大方等等
    ps:自己花费 10 分钟不到,随便写的,主要锻炼下自己的用例策略设计思维,写的烂或者不对的地方,请指出。谢谢

  • 心向百度 at 2016年04月12日

    每个优秀的人,都有一段沉默的时光。那段时光,是付出了所有努力,忍受孤独和寂寞,不抱怨不诉苦,日后说起时,连自己都能被搞感动的日子.
    恭喜

  • 程序员在家办公挣得更多 at 2016年03月22日

    = = !