• 不知道楼主除了从怎么做场景模拟的角度外,有没有考虑过分析这类故障出现的原因?

    我们以前类似这种测试环境没问题,一到线上大数据量就扛不住的情况,大多是 sql 本身写得不好,没命中索引引起全表查询导致。测试环境数据量少,所以全表查也没多慢。线上有些大表是千万级数据的,全表查一下就 gg 了,不仅接口响应超时,还可能由于占住了连接数,导致数据库很快连接数资源就被用尽,引起所有查库操作卡住的大问题。

    如果楼主是类似情况,可以考虑在测试环境做一下所有实际执行 sql 的监控及检测。现在有一些 sql 检测工具是可以直接自动分析出 sql 的执行是不是会引起全表查询的(或者简单点,拿到线上库里分析下执行计划,也可以看出查询数据量情况),只要查询量达到一定量级,有性能风险的,都直接做预警,要求优化后才能上线。印象中 mtsc 大会上唯品会、微众银行也有类似这样的 sql 性能检测实践经验分享。

  • 我们之前的监测预警有点简单暴力,主要是通过定期统计数据库落库数据来做的。

    支付相关检测指标大概有:最近 5 分钟的支付发起数、支付成功数、支付失败数。每个指标除了绝对值,还会在曲线图中展示前一天的曲线和今天的曲线。这些指标的数据来源都是实时查询数据库里的数据(为了这个专门弄了个监控系统专用从库),有一个专门的大盘界面可以直接看到所有指标当前值及预警情况。

    预警机制:失败数绝对值达到一定数量会直接自动电话预警(这种一般说明是出现严重故障了),成功数/发起数差值百分比达到一定程度会发消息预警。每个预警在大盘里会记录持续时长、跟进人这类信息。

    另外,当时因为比较关注线上质量,还弄了一个专门的监控室,招专人排班 7x24 小时值班看大盘指标及预警数据,如果判断认为问题比较严重,人工通知检测指标对应的负责人(大盘系统里每个指标都会登记负责人信息)去排查确认。

  • 声网的混沌工程实践 at 2022年04月08日

    从声网的建立初始就有了对可用性的投入,到现在已经成为了内部的标准与体系(见下图)。

    这里的图好像没了?

  • hmm,做第三方支付服务的监测会比较麻烦,建议优先建设好预警机制,再补充主动检测机制。

    你说的这两个,实际实施会遇到一些难点:

    1、UI 自动化,有可能支付环节的输入密码都会做一些安全限制避免系统自动输入,这个会提高 UI 自动化的成本。

    2、第三方提供测试账号这个,测试环境可能还可能提供。线上正式环境,三方支付一般只是中间商,背后他们还会再连接很多级的第三方系统直到银行的系统,基本上不可能存在能打通全链路的测试账号。

  • 这种可以做的,不过这样只校验到自己的系统,可能作用不是特别大。

    按我之前的经验,一般支付系统最常见的线上问题是外部第三方渠道的问题(比如他们要维护或者出线上问题导致链路不通,然后需要调整配置把这个渠道的流量比例降低到 0),自家系统出了上线变更或者基础设施负荷太大处理不过来外,相对比较少出问题。

  • 论坛个别帖子 502! at 2022年04月08日

    怀疑是服务器被攻击了,导致处理不过来返回 502。。。

  • hmm,确实不大好。

    晚些换个静态页替换掉 nginx 默认自带的这个页面。

  • 不知道你这里的白名单,具体是指什么白名单?

    我们之前支付环节不怎么做拨测,主要做监控 + 预警。主要原因是一般为了保障高可用会对接多个支付渠道,而支付渠道不同,背后走得第三方系统乃至自家系统配置都不少差异,要通过拨测覆盖成本不低。不如做支付失败数量,或者支付成功订单和前一天环比数量波动情况的预警性价比高。

  • 这个问题描述看得我云里雾里。。。你的问题具体是什么,具体哪几行代码截取到的图不是指定元素的图?那截到的是什么图?

    作为测试,描述问题请像报 bug 一样专业吧。

  • 有这段代码的话,测试任务还是需要加锁的。因为测试任务里面的测试结果,pr 里面是不带有增量保存的。
    同时前端记得按照我 pr 的说明里适配一下。

    然后对于清除执行记录这个,我瞄了下我的前端,原来没把这个功能迁移过来。。。所以我只说思路吧。

    思路是给服务端请求了 clear 清除了对应的测试结果记录后,把新结果的 json 对象更新到 VueTestcaseMinderEditor 的 init-json 属性绑定的对象即可(印象中 react 要显式用 set 属性名 的方法才能更新指定对象,而 vue 直接更新绑定的对象值即可)。组件内部有对这个属性值进行 watch 监听,一旦检测到变更,会立即变更自己的展示内容。

  • 1、 前端想加上这个清除结果功能的时候,发现后端里面还调用了 websocket,会报错 ,不知道您的解决方案是?

    你的服务端用的是 agileTC 么?清除结果的核心是清理掉数据库里 exec_record 表里的内容,清理了这里后重新从服务端再拉一次合并测试结果后的用例数据,就是清除了所有测试结果后的数据了。

    2、保存 baseCaseContent 内容,在分配多个子任务的情况下,需要获取到全量的 baseCase?还是说只要获取到当前子集的 baseCase 内容?

    没太明白你的问题,这里的全量和子集具体是指?

    然后如果是使用这个组件配合 agiletc 服务端使用的话,多人协作这块可能你需要花点精力处理下,比如加个锁或者让服务端能做增量保存,否则按照默认情况,是会出现相互覆盖的问题的。

  • 客气啦。

    PS:建议你用下 python 的语法糖,用

    code, udid = get_code()
    

    这样的写法,会更清晰简洁。

  • 你的工程代码方便分享下不?之前也有同学反馈过,但我这重现不了,不好处理。

  • 额,排查说不上,只能说给些思路参考。

    你这里报错的原因上面已经有同学说得很清楚了,原因是 find_element_by_class('android.widget.button') 没找到元素,所以返回的内容是 None 。一个 None 类型的对象,是没有 click() 方法的,所以才会出现你正文里的报错。

    相当于你直接运行 None.click() 这段代码,这样会报正文里的错,应该显而易见吧。

    然后你说的 最后测试跳过这个元素,操作点击其他的元素的时候同样也会报这个错误 ,没看懂你这里跳过是什么意思,请把你改动后的代码以及错误信息都贴上来吧(请不要截图,直接贴文字,截图看得好累。。。)

  • 你截图里用的不是 VueTestcaseMinderEditor 组件,而是 AgileTCEditor 组件哦。

    VueTestcaseMinderEditor 目前没有支持 websocket ,所以你如果用这个组件的话,涉及 websocket 部分的都会用不了。

  • code = get_code()[0]
    uuid = get_code()[1]
    

    这里调用了两次获取图片验证码信息的接口,有确认这个接口在一定时间内多次请求,会返回一样的结果么?如果不确定,这里改写成只获取一次吧。

  • 简历项目经历问题求助 at 2022年04月07日

    看你简历一共有多少个项目,多的话写你觉得比较亮点的就行,少的话可以都写上。

  • 1、把你的脚本内容发出来看看?现在信息太少了
    2、可以的话录个屏,对比看下你手动登录 + 点按钮,以及自动化登录 + 点按钮有什么差异?
    3、和开发确认下,登录后登录态在客户端的保存是怎么做的?(浏览器的话一般是 cookies),确认下你自动化提示 404 时,登录态的存储信息是不是丢失了?

  • 信息有限,且不知道你的内部网络环境具体情况,不好给意见。

    可以参照下这篇看看?https://blog.csdn.net/qq_39390545/article/details/108755289

  • 今天写帖子写的云里雾里的感觉。

    看完表示也有点云里雾里😂

  • 建议你先确认下,你这个 find_element_by_class 方法,找不到元素是不是会抛出 NoSuchElementException ?还是只是返回个 None ?如果是后者,那这个 try catch 就是无效的。

    在 appium python client 里没找到 driver 对象有 find_element_by_class 的方法,所以无法确认。

  • 关于场景图在实际项目中应该写到什么粒度比较合适,这个在实践中有什么比较适合的经验分享么?

  • 我在 Z 厂的半年工作总结 at 2022年04月04日

    很赞的思考总结,加个精让更多人可以关注到

  • 按照文中的方式进行安装并启动,固定出现如下报错,无法运行起来:

    $ python3 -m solox
    Traceback (most recent call last):
      File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 197, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 87, in _run_code
        exec(code, run_globals)
      File "/usr/local/lib/python3.9/site-packages/solox/__main__.py", line 2, in <module>
        from .web import *
      File "/usr/local/lib/python3.9/site-packages/solox/web.py", line 9, in <module>
        from flask_socketio import SocketIO,disconnect
      File "/usr/local/lib/python3.9/site-packages/flask_socketio/__init__.py", line 24, in <module>
        from werkzeug.serving import run_with_reloader
    ImportError: cannot import name 'run_with_reloader' from 'werkzeug.serving' (/usr/local/lib/python3.9/site-packages/werkzeug/serving.py)
    

    python 版本: Python 3.9.2 。是我运行姿势不对?

  • AOP IN LINUX(在 shell 命令行中实现 aop)

    好奇楼主的最终解决方案是什么?个人以自己已知的知识,想到的方法:
    1、针对构建工具运行命令加参数的,可以给编译环境增加临时 alias 覆盖原有命令,让 alias 的新命令默认自带添加覆盖率所需参数
    2、针对需要针对项目结构注入新配置的,可以看看这类配置构建工具本身是否支持将其转换为方式 1,不行的话考虑对构建工具进行扩展,让其可以在加载外部配置时自动注入(不过这样还是深坑,不见得所有构建工具都能这么方便扩展,但至少应该比去重新根据构建工具的规则,解析各个配置文件并插入覆盖率配置要简单一些)。