点赞,我是面试官也是这样的期望,其实主要是想了解面试者自己有没有想好自己想怎么发展,是属于有规划的还是随缘的。同时也避免有的人只是 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),用例就直接用数据好了,而且这个造数据还可以提供给非自动化测试时用。
整体初始化数据库这种方法,对于单体应用可用,但对于涉及多个服务的应用(每个应用有自己的缓存、数据库)就不行了。
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 内容。
你的 id 是怎么找到的,uiautomatorviewer 截图发下?
全是 unable ,建议确认下会不会是 android sdk 版本太低?
对于每天发帖数,内部有讨论过是否需要限制,但最终没能达成一致,所以目前还是没有限制的。针对你提出的情况,我们按照具体情况,一般会屏蔽一部分避免引起刷屏。
后续也会推出举报功能,便于大家主动反馈给管理员,便于我们更及时处理。
不知道你用的是具体什么方法什么路径来读取和写入 excel ,不好判断你这样有没有问题。但有几个点可以肯定:
1、你本地运行的方式和 Jenkins 不完全一样,目测 Jenkins 运行并没有把 maven resources 文件一并拷贝到 target/classes 中,但你本地运行有。建议你本地和 Jenkins 用一模一样的命令来运行,再把结果作对比。
2、target 下面的文件都是构建产物,每次构建都有可能发生改变,不应该纳入 git/svn 进行版本管理。但你的截图里能看出它们都被纳入管理了(有绿色的勾)
不大清楚你是根据什么教程入门学习的,但建议你找一些比较专业全面的教程学习下,太速成的只追求能跑,不追求规范,容易遗漏这些小点,而这些点才是体现专业的地方,也是避免你踩各种坑的捷径。
你有这样的迷茫,我理解是你开始对工作上的重复感到无趣,但一扩展又发现东西太多,不知道从何下手好。
建议先全身心投入工作,把工作中不懂的都弄懂,然后你会发现有些重复其实没必要,有些地方自己没想到。这段时间你可以对你接触到的东西做比较深入的学习,也可以借此探索你的兴趣点。
等到自己觉得已经对现有的东西都很熟悉后,把你了解的整理一个思维导图,再通过咨询你的导师或者身边有一定经验的朋友了解更长远的路,再做打算。