• 自动化测试 at March 02, 2019

    appium 支持很多语言的,不只是 java 。至于不依赖源码的自动化软件,各种 app ui 自动化工具调研文章都有详细对比资料,请善用论坛里面的搜索。

  • 感觉需求不明确呀。

    每个子文件夹下有好几张 jpg 图片
    这个范围是包含所有级别的子文件夹,还是只需要一级的子文件夹?

    需要把这个这些图片全部拷贝并存在 B 文件夹下
    文件夹结构需要一起拷贝不?没有提及。

  • 建议:
    1、把 runalltest.py 以及你用例文件的内容贴出来
    2、从 jenkins 截图里看,有一个用例报错了(输出了 E ),但没看到错误堆栈。可以想办法把错误堆栈搞出来,更便于你从日志定位问题。

    现在提供的资料太少,不足以定位问题原因,大家也只能凭自己经验猜想。

  • 没有吧,都在相互否定还怎么出结果呢。。。

    我们一般 Merge Request 记录评审结果,评审有可能 2 人面对面或者整个小组公开评审。不过评审前肯定要先按规范文档自审,避免浪费时间在如变量命名不规范这类小事里。

  • 这个不大了解哦

  • 点赞,我是面试官也是这样的期望,其实主要是想了解面试者自己有没有想好自己想怎么发展,是属于有规划的还是随缘的。同时也避免有的人只是 3 分钟热度,做不久就直接跳槽甚至换行。也可以通过这个看是否匹配团队的发展方向,是否能给到匹配的机会。

    如果答不出来,或者只有远大目标没有具体计划,基本就 pass 了。

  • 最后一段话,说明你们对自动化的价值没考虑好,建议先想好预期收益再做。

    1、功能测试不相信自动化。说明文化没上来,大家还没认可自动化。这个需要不断重复宣传,让大家了解自动化,再谈相信
    2、自动化投入少。同上,说明你们只是试水,可能 Leader 自己都没认可自动化,不敢投入太多。
    3、自动化出 bug 少。这是非常正常的,回归测试本身发现 bug 就少,何况是它的自动化子集。说明对自动化的价值没想好。

    分享一下我们的大致路线:
    1、明确自动化是每个人都要掌握的,只会有开发框架的专员,不会有自动化测试专员。自动化用例每个人自己写。当然,更多从"这是一个难得让大家提升能力的机会,大家要珍惜"的角度讲。
    2、招聘时,代码能力、api 自动化经历是基本要求,获得一批本身就认可自动化的人,起带头作用
    3、先从造数据入手,写出来的自动化用于提升造数据效率,进而提升测试效率。由于自己就是作者,自然没信任问题
    4、复用造数据的代码或用例,加上适当的断言,直接变成测试用例

    另外,前面的没接口文档、后端没参数校验,我猜测你们现在是缺少后端测试的,都是全流程纯黑盒测试,没有关注后端质量的文化,所以现在自动化有点过早了。建议先把后端测试建立起来,倒逼后端要做好文档和参数校验,开始做接口测试,再谈自动化。

  • 现在都没有跑到执行这一步,所以还没有截图可以放上来。。。

  • 具体怎么改,能否分享下?

  • 代理的具体配置命令,可以发下不?不知道是不是配得不对,配了代理还是不行。

  • 从日志上猜,应该是连不上 google 服务?

  • babel 貌似不是到 go path 拿依赖的:

    $ bazel run //local:create_gopath
    INFO: Invocation ID: cbeff0a8-2bb4-4a56-ba63-8673567aa6f4
    ERROR: /Users/hengjiechen/Develop/Python/clusterfuzz/src/go/cloud/db/BUILD.bazel:3:1: no such package '@org_golang_google_api//iterator': failed to fetch org_golang_google_api: 2019/02/20 22:19:22 get "google.golang.org/api": found meta tag vcs.metaImport{Prefix:"google.golang.org/api", VCS:"git", RepoRoot:"https://code.googlesource.com/google-api-go-client"} at http://google.golang.org/api?go-get=1
    # cd .; git clone https://code.googlesource.com/google-api-go-client /private/var/tmp/_bazel_hengjiechen/169f8f67a11b1bde0973a54e7e2223f5/external/org_golang_google_api
    Cloning into '/private/var/tmp/_bazel_hengjiechen/169f8f67a11b1bde0973a54e7e2223f5/external/org_golang_google_api'...
    fatal: unable to access 'https://code.googlesource.com/google-api-go-client/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to code.googlesource.com:443
    2019/02/20 22:19:44 exit status 128
     and referenced by '//go/cloud/db:go_default_library'
    DEBUG: Rule 'org_golang_x_tools' modified arguments {"sha256": "2384fa91351a7414b643c5230422ce45f5aa2be8a82727609afd4e64e6973a30"}
    ERROR: Analysis of target '//local:create_gopath' failed; build aborted: no such package '@org_golang_google_api//iterator': failed to fetch org_golang_google_api: 2019/02/20 22:19:22 get "google.golang.org/api": found meta tag vcs.metaImport{Prefix:"google.golang.org/api", VCS:"git", RepoRoot:"https://code.googlesource.com/google-api-go-client"} at http://google.golang.org/api?go-get=1
    # cd .; git clone https://code.googlesource.com/google-api-go-client /private/var/tmp/_bazel_hengjiechen/169f8f67a11b1bde0973a54e7e2223f5/external/org_golang_google_api
    Cloning into '/private/var/tmp/_bazel_hengjiechen/169f8f67a11b1bde0973a54e7e2223f5/external/org_golang_google_api'...
    fatal: unable to access 'https://code.googlesource.com/google-api-go-client/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to code.googlesource.com:443
    2019/02/20 22:19:44 exit status 128
    INFO: Elapsed time: 47.020s
    INFO: 0 processes.
    FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets co\
    FAILED: Build did NOT complete successfully (0 packages loaded, 0 targets co\
    nfigured)
        Fetching @org_golang_google_api; fetching 46s
        Fetching @in_gopkg_yaml_v2; fetching 46s
        Fetching ; Cloning 8dea3dc473e90c8179e519d91302d0597c0ca1d1 of https://g\
    ithub.com/grpc/grpc-go 46s
        Fetching ; Cloning aa810b61a9c79d51363740d207bb46cf8e620ed5 of https://g\
    ithub.com/golang/protobuf 46s
    
  • 细想了下,好像也不是邓爷爷说的。我还是改为 曾有人说 比较正规把。

  • 官方文档没提到 Fuzz 生成规则,只是大致提到了可以根据测试的代码覆盖率等数据自动优化生成的数据集。fuzz 生成器是是使用其它开源工具实现的,不是 ClusterFuzz 本身的内容。后续再细看下相关的资料。

  • 不一定是浏览器,应该只要是 C/C++ 都可以。比如 openssl 。

  • 不能说所有,但可以相对低成本的检查内存溢出类问题。

  • 1、思路上可以考虑在参数组合的表格里手动加一列,作为断言。然后根据这个列来生成对应的断言
    2、你说的这个优惠券不能重复跑场景,个人觉得核心点是把造数据和测试用例分开。造数据保证每次都给出一个可用的数据(如未使用的优惠券 id),用例就直接用数据好了,而且这个造数据还可以提供给非自动化测试时用。
    整体初始化数据库这种方法,对于单体应用可用,但对于涉及多个服务的应用(每个应用有自己的缓存、数据库)就不行了。

  • 如何进行 UX 自动化测试 at February 14, 2019

    yy 一下

    1、UX 把设计稿输出图片,且图片是 1:1 比例,和实际软件生成的大小是一致的
    2、把软件生成的控件,进行截图。注意此时的颜色、文字显示尽量和设计稿保持一致
    3、用截图对比软件对比两个图的差异度,要求差异度在 xx% 内

    话说,一般 UX 都不会较真到像素级别吧。毕竟现在移动端分辨率这么多, UX 设计稿不可能针对各个分辨率都出一个,和设计稿分辨率不一样的一般都是 UX 主观判断是否可接受。

  • 我用 appium desktop 试了下,貌似是可以找到的哦。

    appium desktop 版本:1.8.2.20181101.4
    手机 android 版本:5.1
    抖音安装包:大概 2 天前官方下载的,文件名: app_aweGW_v4.3.3_84a2a6f.apk

    搜索日志:

    [HTTP] --> POST /wd/hub/session/3ac01ec6-d048-4e5d-ac0b-cfd64ba010eb/elements
    [HTTP] {"using":"id","value":"com.ss.android.ugc.aweme:id/l7"}
    [MJSONWP] Calling AppiumDriver.findElements() with args: ["id","com.ss.android.ugc.aweme:id/l7","3ac01ec6-d048-4e5d-ac0b-cfd64ba010eb"]
    [BaseDriver] Valid locator strategies for this request: xpath, id, class name, accessibility id, -android uiautomator
    [BaseDriver] Waiting up to 0 ms for condition
    [AndroidBootstrap] Sending command to android: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.ss.android.ugc.aweme:id/l7","context":"","multiple":true}}
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got data from client: {"cmd":"action","action":"find","params":{"strategy":"id","selector":"com.ss.android.ugc.aweme:id/l7","context":"","multiple":true}}
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command of type ACTION
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command action: find
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Finding 'com.ss.android.ugc.aweme:id/l7' using 'ID' with the contextId: '' multiple: true
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Using: UiSelector[RESOURCE_ID=com.ss.android.ugc.aweme:id/l7]
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] getElements selector:UiSelector[RESOURCE_ID=com.ss.android.ugc.aweme:id/l7]
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Element[] is null: (0)
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] getElements tmp selector:UiSelector[INSTANCE=0, RESOURCE_ID=com.ss.android.ugc.aweme:id/l7]
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Element[] is null: (1)
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] getElements tmp selector:UiSelector[INSTANCE=1, RESOURCE_ID=com.ss.android.ugc.aweme:id/l7]
    [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Returning result: {"status":0,"value":[{"ELEMENT":"5"}]}
    [AndroidBootstrap] Received command result from bootstrap
    [MJSONWP] Responding to client with driver.findElements() result: [{"ELEMENT":"5"}]
    [HTTP] <-- POST /wd/hub/session/3ac01ec6-d048-4e5d-ac0b-cfd64ba010eb/elements 200 194 ms - 89
    

    有一个点要特别留意,如果视频在播放,此时页面处于动态状态,控件树是不会 dump 出来的。得暂停了视频后才能比较快地 dump 出来。具体原理可以百度下 uiautomator dump 控件树原理相关的文章。

  • 有试过对比 page_source 获取到的 xml 树,和 uiautomatorviewer 相比,缺少了哪些元素吗?

    按以前经验,确实会有部分元素 viewer 可见,page_source 不可见,例如 webview 里面的元素。但从你的 viewer 截图上看,这个控件及它的上层所属的类应该都是原生布局,不大像是 webview 里面的元素。

  • 这个是 find_element 的日志,不是 page_source 的日志吧?

    另外,实际界面上,这个元素真的有出现了吗?能否也截个图看看?

  • page_source 时,可以同时也留意下 appium 的日志,看有没有什么异常。

  • 建议在 find 函数加个断点,然后在断点的时候通过 page_source 获取下界面的控件树,看是不是控件树和 uiautomatorviewer 看到的有出入。

  • 这样用例量以及时间花费仍然很大,在实际项目中测试人员没有充足的时间来进行用例编写,那么去即不降低用例的覆盖场景,又能快速编写用例呢??

    最近也有遇到类似的问题,暂时解决办法是提测前先覆盖冒烟场景,非核心场景有时间且有必要重复执行,就补充编写自动化用例,否则半自动化(在已有代码基础上手动改参数)。

    思路上,可以试试基于接口 API 文档(引入 swagger 注解可以自动生成)自动按照数据类型,通过参数组合生成测试用例,对于单接口参数构造方面的场景用例编写会有一定程度的效率提升。

  • dabging 这个命令拼错了吧?

    aapt dump --help
    ERROR: Unknown option '--help'
    Android Asset Packaging Tool
    
    Usage:
     aapt l[ist] [-v] [-a] file.{zip,jar,apk}
       List contents of Zip-compatible archive.
    
     aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]
       strings          Print the contents of the resource table string pool in the APK.
       badging          Print the label and icon for the app declared in APK.
       permissions      Print the permissions from the APK.
       resources        Print the resource table from the APK.
       configurations   Print the configurations in the APK.
       xmltree          Print the compiled xmls in the given assets.
       xmlstrings       Print the strings of the given compiled xml assets.
    

    官方命令里没有说通过 badging 一定可以获取 activity 信息的。建议改为用其它获取主 activity 的方法,例如获取 apk 的 AndroidManifest.xml 内容。