额,从你的截图看,你这个代码里,self.staue 没可能是 False 。你这里逻辑是不是没贴全?
1、初始值是 True
2、后续改变值的语句 self.statue = outcome.success
,是放在了 if outcome.success
里面的,意味着这里面的 outcome.success
值如果是布尔值,那也必定是 True
所以,你在后面继承的 B 类里拿到 self.statue 是 True ,说明不了这个 True 就是第二个位置给的。
然后,也没太看懂你这里加个 self.statue 且想要被子类拿到的目的是什么,想实现什么功能?这块可以说下不?
PS:statue 是不是拼错了?状态的英文应该是 status
这个要看公司。没法一概而论。也有的直接按各个团队人员比例来裁。
你这个方法,fun4() 能拿到的只有 init 里配置的初始值,拿不到 fun2() 里面改变后新的属性值吧。fun2() 改变的是 class A 对象里面的内部属性,而 class B 继承的是类,而非对象。
而且即使能实现,你这块设计也会导致使用时比较混乱。因为你这个属性值有可能在 class A 的任何方法里被改动,而且这个 class A 极有可能是在其它文件里的,对于 class B 的使用人员来说,这个属性值是一个难以预测的值,要合理使用还得看完 class A
建议可以考虑下,修改 class A ,提供这个属性值的 get 方法。然后 class B 通过获取 class A 实例化后的对象,来获取对象里面的属性(可以通过单例模式来保障 class A 只会有一个对象,避免存在多个对象拿错了)。而不是通过继承去获取。继承只能继承类,复用里面类相关的资料(如方法、类变量这类代码里本身就有写好的内容),但没法继承一个对象的(也就是用不了任何运行时才创建或改变的内容)。
或者可以去掉这些 class A 之类的脱敏,具体说下你这个场景是什么,这样才能更好地给合适的建议。
1、这种算是业务逻辑。因为不能保障和看到的接口文档强一致,不过这类逻辑如果是非常简单的,也建议直接 review 代码。个人觉得,不是很值得为了一个超简单且不怎么改的业务逻辑,去维护一个用例。
2、这种我理解就是多接口调用测试用例了,也就是上面很多同学说的接口集成测试,或者叫流程型用例(对比单接口用例)。一般做法是在 setup 里面调了 A 接口后,从 A 接口的返回值提取需要的参数。然后在 test 方法里把参数带上去请求 B 接口。
PS:你这种不是 callback 吧?个人理解的 callback 是被调用方在完成自己需要做的东西后,主动发起某个调用方明确要求的操作,主要用于异步非阻塞型任务。你这个 B 接口要 A 接口返回值,前提是 A 接口已经有返回,所以是同步阻塞型的
比如金融业务里常见的付款,A 系统调用 B 系统提供的付款接口,并要求在 B 系统处理完毕后给某个指定的 url 发一个请求,表示处理完毕。B 系统会在收到后立即放到一个类似队列的位置缓存,然后返回已收到(此时还没开始处理),此时这个 api 调用已经结束了。接下来 B 会做一系列操作(比如请求第三方等),全部操作完毕后,再调用最前面 A 系统给的一个指定 url,通知自己已经处理完毕。这个在最后主动调用 A 系统给的 url,我理解才是 api callback 。
同步异步、阻塞非阻塞的解释,建议看这篇文章,讲得非常清晰:https://mp.weixin.qq.com/s/CvImJ5Ab1J7KiKAhV0BuAQ
发帖提示什么?
以下均为个人观点哈
比如 url 错误返回 404,大部分情况是 web 框架(如 springmvc)就自动返回的,开发啥都不用写,或者写一次就可以永久使用。这种个人觉得不需要测试
但也有的 url 是直接通配符匹配后,在具体开发写的业务逻辑里面进一步处理的(比如 path 参数,/user/{userId}/info
这类,实际 url 会是 /user/1/info
,也会是 /user/2/info
),那就要测试 url 里面 userId 存在、不存在 2 种场景。
一般异常场景,会区分为业务逻辑异常/非业务逻辑异常。非业务逻辑异常主要是由框架直接校验的(如某某参数不能为空,swagger 或者 jsr303 注解,controller 定义接口的时候就可以一并完成校验了),这类抽查或者通过 review 代码确认有没有问题,更高效;业务逻辑异常则是具体的内部逻辑,这部分一般会是复杂度比较高的,做接口测试会更高效。
如果拿的方式是找后端拿(比如不走 api 取,但是走 mq 取,甚至直接查库),那你就找后端拿
如果拿的方式是本身自己内置(比如本身有字典表或者对应常量),那就直接写死在你代码里
至于你说的 “自己写一个 mock 的接口” ,不是很明白。你还是把你的完整场景说清楚吧,现在说一半不说一半,看不大懂。
我们这边实际用远程启动好 wda 服务时的日志:
2021-06-18 18:55:34:442 [Appium] Welcome to Appium v1.21.0
2021-06-18 18:55:34:443 [Appium] Non-default server args:
2021-06-18 18:55:34:444 [Appium] port: 20000
2021-06-18 18:55:34:444 [Appium] sessionOverride: true
2021-06-18 18:55:34:444 [Appium] logFile: public/serverLog/appium_20000_2021-06-18_18-55-33.log
2021-06-18 18:55:34:444 [Appium] localTimezone: true
2021-06-18 18:55:34:461 [Appium] Appium REST http interface listener started on 0.0.0.0:20000
2021-06-18 18:55:34:634 [HTTP] --> GET /wd/hub/status
2021-06-18 18:55:34:634 [HTTP] {}
2021-06-18 18:55:34:635 [GENERIC] Calling AppiumDriver.getStatus() with args: []
2021-06-18 18:55:34:636 [GENERIC] Responding to client with driver.getStatus() result: {"build":{"version":"1.21.0"}}
2021-06-18 18:55:34:639 [HTTP] <-- GET /wd/hub/status 200 5 ms - 68
2021-06-18 18:55:34:640 [HTTP]
2021-06-18 18:55:35:066 [HTTP] --> POST /wd/hub/session
2021-06-18 18:55:35:066 [HTTP] {"desiredCapabilities":{"noReset":true,"xcodeOrgId":"F7YWW93M6T","bundleId":"xxx","skipLogCapture":true,"deviceName":"iPhone6s","wdaLocalPort":25000,"webDriverAgentUrl":"http://192.168.25.12:20474","waitForQuiescence":false,"newCommandTimeout":43200,"platformVersion":"14.5.1","automationName":"XCuiTest","useNewWDA":false,"wdaStartupRetries":0,"platformName":"iOS","udid":"xxx","wdaConnectionTimeout":1800000,"autoAcceptAlerts":true},"capabilities":{"firstMatch":[{"appium:autoAcceptAlerts":true,"appium:automationName":"XCuiTest","appium:bundleId":"xxx","appium:deviceName":"iPhone6s","appium:newCommandTimeout":43200,"appium:noReset":true,"platformName":"ios","appium:platformVersion":"14.5.1","skipLogCapture":true,"appium:udid":"xxx","appium:useNewWDA":false,"waitForQuiescence":false,"appium:wdaConnectionTimeout":1800000,"appium:wdaLocalPort":25000,"appium:wdaStartupRetries":0,"appium:webDriverAgentUrl":"http:/...
2021-06-18 18:55:35:066 [W3C] Calling AppiumDriver.createSession() with args: [{"noReset":true,"xcodeOrgId":"F7YWW93M6T","bundleId":"xxx","skipLogCapture":true,"deviceName":"iPhone6s","wdaLocalPort":25000,"webDriverAgentUrl":"http://192.168.25.12:20474","waitForQuiescence":false,"newCommandTimeout":43200,"platformVersion":"14.5.1","automationName":"XCuiTest","useNewWDA":false,"wdaStartupRetries":0,"platformName":"iOS","udid":"xxx","wdaConnectionTimeout":1800000,"autoAcceptAlerts":true},null,{"firstMatch":[{"appium:autoAcceptAlerts":true,"appium:automationName":"XCuiTest","appium:bundleId":"xxx","appium:deviceName":"iPhone6s","appium:newCommandTimeout":43200,"appium:noReset":true,"platformName":"ios","appium:platformVersion":"14.5.1","skipLogCapture":true,"appium:udid":"xxx","appium:useNewWDA":false,"waitForQuiescence":false,"appium:wdaConnectionTimeout":1800000,"appium:wdaLocalPort":25000,"appium:wdaStartupRetries":0,"appium:webDriverAgentUrl":"http://192.168.25.12:20474","appium:xc...
2021-06-18 18:55:35:067 [BaseDriver] Event 'newSessionRequested' logged at 1624013735067 (18:55:35 GMT+0800 (China Standard Time))
2021-06-18 18:55:35:069 [BaseDriver] The following capabilities are not standard capabilities and should have an extension prefix:
2021-06-18 18:55:35:070 [BaseDriver] skipLogCapture
2021-06-18 18:55:35:070 [BaseDriver] waitForQuiescence
2021-06-18 18:55:35:729 [Appium] Appium v1.21.0 creating new XCUITestDriver (v3.43.0) session
2021-06-18 18:55:35:729 [Appium] There are no active sessions for cleanup
2021-06-18 18:55:35:731 [BaseDriver] W3C capabilities and MJSONWP desired capabilities were provided
2021-06-18 18:55:35:731 [BaseDriver] Creating session with W3C capabilities: {
2021-06-18 18:55:35:731 [BaseDriver] "alwaysMatch": {
2021-06-18 18:55:35:731 [BaseDriver] "platformName": "ios",
2021-06-18 18:55:35:732 [BaseDriver] "appium:skipLogCapture": true,
2021-06-18 18:55:35:732 [BaseDriver] "appium:waitForQuiescence": false,
2021-06-18 18:55:35:732 [BaseDriver] "appium:autoAcceptAlerts": true,
2021-06-18 18:55:35:732 [BaseDriver] "appium:automationName": "XCuiTest",
2021-06-18 18:55:35:732 [BaseDriver] "appium:bundleId": "xxx",
2021-06-18 18:55:35:732 [BaseDriver] "appium:deviceName": "iPhone6s",
2021-06-18 18:55:35:732 [BaseDriver] "appium:newCommandTimeout": 43200,
2021-06-18 18:55:35:732 [BaseDriver] "appium:noReset": true,
2021-06-18 18:55:35:732 [BaseDriver] "appium:platformVersion": "14.5.1",
2021-06-18 18:55:35:732 [BaseDriver] "appium:udid": "xxx",
2021-06-18 18:55:35:732 [BaseDriver] "appium:useNewWDA": false,
2021-06-18 18:55:35:733 [BaseDriver] "appium:wdaConnectionTimeout": 1800000,
2021-06-18 18:55:35:733 [BaseDriver] "appium:wdaLocalPort": 25000,
2021-06-18 18:55:35:733 [BaseDriver] "appium:wdaStartupRetries": 0,
2021-06-18 18:55:35:733 [BaseDriver] "appium:webDriverAgentUrl": "http://192.168.25.12:20474",
2021-06-18 18:55:35:733 [BaseDriver] "appium:xcodeOrgId": "F7YWW93M6T"
2021-06-18 18:55:35:733 [BaseDriver] },
2021-06-18 18:55:35:733 [BaseDriver] "firstMatch": [
2021-06-18 18:55:35:733 [BaseDriver] {}
2021-06-18 18:55:35:733 [BaseDriver] ]
2021-06-18 18:55:35:733 [BaseDriver] }
2021-06-18 18:55:35:742 [BaseDriver] Session created with session id: 1f9c9767-7842-4635-8610-7adc9eee6738
2021-06-18 18:55:35:761 [XCUITest] Current user: 'lizhi'
2021-06-18 18:55:35:774 [XCUITest] Available devices: xxx
2021-06-18 18:55:35:775 [XCUITest] Creating iDevice object with udid 'xxx'
2021-06-18 18:55:35:775 [XCUITest] Determining device to run tests on: udid: 'xxx', real device: true
2021-06-18 18:55:35:775 [XCUITest] Normalized platformVersion capability value '14.5.1' to '14.5'
2021-06-18 18:55:35:776 [BaseDriver] Event 'xcodeDetailsRetrieved' logged at 1624013735775 (18:55:35 GMT+0800 (China Standard Time))
2021-06-18 18:55:35:776 [BaseDriver] Event 'appConfigured' logged at 1624013735776 (18:55:35 GMT+0800 (China Standard Time))
2021-06-18 18:55:35:776 [BaseDriver] Event 'resetStarted' logged at 1624013735776 (18:55:35 GMT+0800 (China Standard Time))
2021-06-18 18:55:35:777 [XCUITest] Reset: fullReset not set. Leaving as is
2021-06-18 18:55:35:777 [BaseDriver] Event 'resetComplete' logged at 1624013735777 (18:55:35 GMT+0800 (China Standard Time))
2021-06-18 18:55:35:777 [WebDriverAgent] Using WDA path: '/Users/lizhi/.nvm/versions/node/v12.22.1/lib/node_modules/appium/node_modules/appium-webdriveragent'
2021-06-18 18:55:35:777 [WebDriverAgent] Using WDA agent: '/Users/lizhi/.nvm/versions/node/v12.22.1/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj'
2021-06-18 18:55:35:782 [XCUITest] 'skipLogCapture' is set. Skipping starting logs such as crash, system, safari console and safari network.
2021-06-18 18:55:35:782 [XCUITest] Setting up real device
2021-06-18 18:55:36:266 [DevCon Factory] Requesting connection for device xxx on local port 20474
2021-06-18 18:55:36:266 [DevCon Factory] Cached connections count: 0
2021-06-18 18:55:36:266 [DevCon Factory] Successfully requested the connection for xxx:20474
2021-06-18 18:55:36:267 [XCUITest] Starting WebDriverAgent initialization with the synchronization key 'XCUITestDriver'
2021-06-18 18:55:36:268 [XCUITest] Trying to start WebDriverAgent 1 times with 10000ms interval
2021-06-18 18:55:36:268 [BaseDriver] Event 'wdaStartAttempted' logged at 1624013736268 (18:55:36 GMT+0800 (China Standard Time))
2021-06-18 18:55:36:268 [WebDriverAgent] Using provided WebdriverAgent at 'http://192.168.25.12:20474'
2021-06-18 18:55:36:270 [WD Proxy] Matched '/status' to command name 'getStatus'
2021-06-18 18:55:36:270 [WD Proxy] Proxying [GET /status] to [GET http://192.168.25.12:20474/status] with no body
2021-06-18 18:55:36:287 [WD Proxy] Got response with status 200: {"value":{"message":"WebDriverAgent is ready to accept commands","state":"success","os":{"testmanagerdVersion":28,"name":"iOS","sdkVersion":"14.5","version":"14.5.1"},"ios":{"ip":"192.168.17.178"},"ready":true,"build":{"time":"May 25 2021 19:44:41","productBundleIdentifier":"com.facebook.WebDriverAgentRunner"}},"sessionId":null}
2021-06-18 18:55:36:288 [BaseDriver] Event 'wdaSessionAttempted' logged at 1624013736288 (18:55:36 GMT+0800 (China Standard Time))
2021-06-18 18:55:36:288 [XCUITest] Sending createSession command to WDA
2021-06-18 18:55:36:289 [WD Proxy] Matched '/session' to command name 'createSession'
2021-06-18 18:55:36:289 [WD Proxy] Proxying [POST /session] to [POST http://192.168.25.12:20474/session] with body: {"capabilities":{"firstMatch":[{"bundleId":"xxx","arguments":[],"environment":{},"eventloopIdleDelaySec":0,"shouldWaitForQuiescence":false,"shouldUseTestManagerForVisibilityDetection":false,"maxTypingFrequency":60,"shouldUseSingletonTestManager":true,"shouldTerminateApp":true,"defaultAlertAction":"accept"}],"alwaysMatch":{}}}
2021-06-18 18:55:37:911 [WebDriverAgent] Parsed BUILD_DIR configuration value: '/Users/lizhi/.nvm/versions/node/v12.22.1/lib/node_modules/appium/node_modules/appium-webdriveragent/DerivedData/WebDriverAgent/Build/Products'
2021-06-18 18:55:37:911 [WebDriverAgent] Got derived data root: '/Users/lizhi/.nvm/versions/node/v12.22.1/lib/node_modules/appium/node_modules/appium-webdriveragent/DerivedData/WebDriverAgent'
2021-06-18 18:55:38:785 [WD Proxy] Got response with status 200: {"value":{"sessionId":"BE97DA3B-EB3D-4D16-8231-A8D18AA33E64","capabilities":{"device":"iphone","browserName":" ","sdkVersion":"14.5.1","CFBundleIdentifier":"com.apple.springboard"}},"sessionId":"BE97DA3B-EB3D-4D16-8231-A8D18AA33E64"}
2021-06-18 18:55:38:785 [WD Proxy] Determined the downstream protocol as 'W3C'
2021-06-18 18:55:38:786 [BaseDriver] Event 'wdaSessionStarted' logged at 1624013738786 (18:55:38 GMT+0800 (China Standard Time))
2021-06-18 18:55:38:786 [BaseDriver] Event 'wdaStarted' logged at 1624013738786 (18:55:38 GMT+0800 (China Standard Time))
2021-06-18 18:55:38:786 [XCUITest] Skipping setting of the initial display orientation. Set the "orientation" capability to either "LANDSCAPE" or "PORTRAIT", if this is an undesired behavior.
2021-06-18 18:55:38:786 [BaseDriver] Event 'orientationSet' logged at 1624013738786 (18:55:38 GMT+0800 (China Standard Time))
2021-06-18 18:55:38:786 [BaseDriver] The value of 'elementResponseAttributes' setting did not change. Skipping the update for it
2021-06-18 18:55:38:787 [BaseDriver] The value of 'shouldUseCompactResponses' setting did not change. Skipping the update for it
2021-06-18 18:55:38:787 [Appium] New XCUITestDriver session created successfully, session 1f9c9767-7842-4635-8610-7adc9eee6738 added to master session list
2021-06-18 18:55:38:788 [BaseDriver] Event 'newSessionStarted' logged at 1624013738787 (18:55:38 GMT+0800 (China Standard Time))
2021-06-18 18:55:38:788 [W3C (1f9c9767)] Cached the protocol value 'W3C' for the new session 1f9c9767-7842-4635-8610-7adc9eee6738
2021-06-18 18:55:38:788 [W3C (1f9c9767)] Responding to client with driver.createSession() result: {"capabilities":{"webStorageEnabled":false,"locationContextEnabled":false,"browserName":"","platform":"MAC","javascriptEnabled":true,"databaseEnabled":false,"takesScreenshot":true,"networkConnectionEnabled":false,"platformName":"ios","skipLogCapture":true,"waitForQuiescence":false,"autoAcceptAlerts":true,"automationName":"XCuiTest","bundleId":"xxx","deviceName":"iPhone6s","newCommandTimeout":43200,"noReset":true,"platformVersion":"14.5.1","udid":"xxx","useNewWDA":false,"wdaConnectionTimeout":1800000,"wdaLocalPort":25000,"wdaStartupRetries":0,"webDriverAgentUrl":"http://192.168.25.12:20474","xcodeOrgId":"F7YWW93M6T"}}
2021-06-18 18:55:38:789 [HTTP] <-- POST /wd/hub/session 200 3723 ms - 736
不过我们是在 mac 下运行的,不会出现你上面日志里的错误:[WebDriverAgent] Cannot retrieve WDA build settings. Original error: spawn xcodebuild ENOENT
。建议你根据日志看下源码,看是不是 appium 会不会不管是否要不要启动 wda ,都要检测 xcodebuild 是否存在?
如果是,要不改源码,要不可以往 path 搞个假的 xcodebuild ,让输出符合 appium 检测结果就行。
可能我表述也不够清晰。我不是说不涉及这些规范,而是这些规范并不像是导致 迁云时间跨度长 的根本原因。 “因为迁云时间跨度太长了,所以我们要落实代码规范/code review”,这个因果关系不够明确,也说服不了别人。
对于项目跨度时间长,因素会很多。而且很多时候这些地方缺少的不是规范或流程,而是大家的意识。好的程序员,并不会因为规范的缺失而写出很烂的代码,因为规范已经在他意识里面了,没规范他自己也会去制定规范。而改变意识成本是很高的,周期也比较长,需要找好节奏,循序渐进,并且每一步都找到合适切入点。
明天回公司看下 appium 版本,感觉像是 appium 版本不同导致的问题。
听你描述,学 java 至少可以看开发代码,修下小 bug 之类的。学 go 好像能做的事情更少?
感觉你的问题和原因有点对不上呀。迁云我理解更多是运维部署层面的,最多和发布管理有一些关系,前面的这些不规范和迁云有什么关系呢?比如代码命名不规范,主要影响其他人的阅读和理解,但不会直接造成缺陷的。建议要先复盘清楚,到底根本原因是在哪里,没有解决根因,其他改进都是吃力不讨好。
另外,要特别留意,这些规范,限制的不仅自己下面的测试团队,更多是开发、运维这些兄弟团队。先和大家沟通好达成共识,这个是大前提。
我按我经历过的大概写下吧:
阿里、google 这些大公司都有各个语言的代码规范白皮书这类文档分享出来的,各个语言自己也有自己的一些推荐规范(比如 idea 自带的规则基本是基于这些规范),可以基于这些来调整。我们之前具体的调整是由一些资深开发 + 测试组成的技术委员会来操刀,保障调整的有效性。而且这些人参与了制定过程,后面落地认同感也更强,更容易推进落地。
同时也可以搞一些 bad case 之类的文化活动,分享一下某些不规范的写法会导致什么样的 bug ;或者组织大家看看 clean code 这本书,对怎么写好代码有更好的认识。
这个核心就是分支模型了。一般主流就几个,主干开发 + 主干发布,分支开发 + 主干发布,主干开发 + 分支发布。一般需求并行比较多的,采用 分支开发 + 主干发布 会比较多。然后配合 gitlab 提供的 protect 分支特性,可以把主干保护起来,只有 master 权限才能合并,普通开发改不了,只能在自己的分支上修改,然后提 merge request(后面缩写为 MR)来申请合并。
master 一般由团队里对系统比较熟悉的人来做,这样在 MR 的时候做的 code review ,会更有效。同时 MR 也可以定制补充一些自动检查项(如前面大家提到的 sonar 、单测这类),检查结果直接呈现在 MR 中,作为 code review 的参考。
这里面东西比较多,比如 review 的时机(赶早不赶晚,谁都无法认真 review 改动行数过千的改动),review 的方式(评审人和写代码的人一起的方式,如 review 会议、结对 review;不在一起的方式,如前面提到的用 MR review ),review 的限制程度(阻塞式,必须 review 通过才能合并和提测,节奏相对慢的用得比较多;非阻塞式,可以提测后再 review,节奏快的更适用)。这块建议微信公众号搜索下吧,以前看到过挺多好文章的。
我们实际落地更多是提测后测试去阅读代码(我们一般不叫 review ),有问题会和开发沟通确认。通过阅读代码可以了解实现逻辑,也能更直接的找到一些问题,比如空指针隐患、if else 的场景不够全、事务性操作没有包到一个事务里等。
不知道你们那边运维发布相关的基础设施做到什么程度,是已经做到了一个带审批流程的平台上,还是只是一个 jenkins job ,还是更人工的。如果想 QA 在这个层面上做很大的限制(比如二次确认开发有没有在最后时刻自己加料啥的),那需要在发布的审核流程里加上 QA 这个环节,QA 审核通过才能到实际部署这个步骤。
我们实际落地,审核流程会有 QA 环节,并且 QA 不能只是管审核,还需要在上线后和开发、产品一起通过线上测试/指标监控等手段,确认上线后没问题,为最终上线结果负责。
代码规范、分支规范、code review 这些,本质上更多是在开发阶段做的事情,如果本身开发都没这方面经验甚至想法,需要长期灌输慢慢接受。
要逐步落地,建议可以先从线上问题复盘改进开始,一方面都出事故了,大家容易配合推进;另一方面这些问题一般也是破坏性比较大,最需要解决的问题。
个人经验,任何规范都是约束,都是会产生额外成本的,而且落地最终要靠的还是人。所有的要推行的规范,一定要能解决某些目前存在的实际问题,并和大家取得共识。切勿为了规范而规范,最后变成一张废纸。
PS:正常一个稍微大一点的开发团队,分支规范应该是最基础的协作基础,不可能没有的。建议你先和开发团队沟通下,了解下对于一个新开发进入团队,他们会教些什么,这里面一般就会有代码规范、分支规范这些了。
日志发一下?
然后,也试试去掉 "usePrebuiltWDA": False,
试试?
分享下我们实际用的:
"desiredCapabilities": {
"noReset": true,
"xcodeOrgId": "xxx",
"bundleId": "xxx",
"skipLogCapture": true,
"deviceName": "iPhone6s",
"wdaLocalPort": 25000,
"webDriverAgentUrl": "http://192.168.25.12:20474",
"waitForQuiescence": false,
"newCommandTimeout": 43200,
"platformVersion": "14.5.1",
"automationName": "XCUITest",
"useNewWDA": false,
"wdaStartupRetries": 0,
"platformName": "iOS",
"udid": "xxx",
"wdaConnectionTimeout": 1800000,
"autoAcceptAlerts": true
}
这个问题好大,一时不知道从何说起。而且个人经验,这个东西必须因地制宜的,别人的经验你不一定适用。比如大公司代码规范会配套做 ide 扫描工具、持续集成的自动卡点等,小公司可能就一个文档和 leader 多看几眼代码。
可以简单说下你们的当前情况和主要问题点,这样大家比较好给建议?
如果是想了解那种通用型、讲概念型的,可以社区里搜索下,或者到微信公众号搜索下。
看下浏览器开发者工具的 network ,是不是有的 Js 基础库获取失败了?
有点没看懂你的问题。这两个工具一个是测试工具,一个是网络代理工具,本身就可以相互独立使用。
你说要联合,是要做到什么效果?自动化测试的时候,自动配置代理,并且自动改代理里的 mock 配置,返回你想返回的 response ?
appium 日志里,有个地方要留意下
[BaseDriver] Capability 'usePrebuiltWDA' changed from string to boolean. This may cause unexpected behavior
[BaseDriver] Capability 'useNewWDA' changed from string to boolean. This may cause unexpected behavior
这种转换不知道结果是布尔值的 true 还是 false
"webDriverAgentUrl": "http://localhost:8100/",
"usePrebuiltWDA": "false",
"useNewWDA": "false",
建议第二、第三个改为用布尔值的 false,不要用字符串的 false 。
我们内部用,只需要配置 webDriverAgentUrl
、useNewWDA
(值为 false ),就可以用 atx server 云真机上提供的 wda 来执行自动化了。
感觉楼主是累了,进入了疲惫期。这个主要还是心态上的变化。我毕业 2-3 年的时候也遇到过,各种新想法,然后否定自己的新想法,否定多了就会觉得啥都没意思,不想做。最后是去了一次旅游放松,然后就好很多了。
建议楼主可以先暂停思考一下,放松下自己 1-2 周。然后再去思考这个问题,找到自己的方向。
新公司项目虽然用 python 但是我没有参与
后面建议可以主动申请参与下,参与了可能就没那么多疑问了。
我的方法是:多练、多比较,然后每次练的时候,都借鉴下其他更好的,融入进来。
比如,我基本上从高中开始全部作文都写议论文,都是总论点、2-3 个分论点、总论点的结构。重复写了这么多遍后,基本上现在想、说、写都是 1、2、3 这样的分点描述的结构了。写代码、写用例本身,其实也是一种非常锻炼逻辑思维的工作,因为要求逻辑严谨。
前期建议先从写作开始,想是最快速的,说第二,写的速度最慢,思考时间也最充分。阿里不是每周都要写周报么,刚好可以借助这个来练习下,一举两得。写完周报可以也看看其他人的,看有什么写得比自己好的,然后下一次周报借鉴提高。
如果想要先了解下怎么能分论点阐述,可以看看《金字塔原理》这本书。
描述问题,先说清楚用的啥框架吧。。。看图明显不是编程语言,应该用的是 robot framework
至于你这个问题,可以用 robotframework 不定参数
搜索下,很容易找到答案。基本思路是封装成字典来传,而非传 10 个参数。
不过这个答案是受限于 robot framework 机制(.robot 格式的用例,没有类和对象,也没有函数可选参数机制,只有关键字、逻辑操作符和变量)所以只能这么做,如果是编程语言,直接 java bean + builder 模式(没有可选参数可用的语言,如 java )或者用函数的可选参数(keyword argument)更好。
实际编程要尽量避免传一个字典作为参数,解析字典还得各种判空和让使用者想办法保障 key 名称一致(编程工具无法帮你自动补全,重构改名字也没法直接帮你每个地方都改到位),很容易出错。
从目前给到的日志,只能看出是某个底层的请求可能由于卡住超时了,超过 240 秒都没返回。但因为不知道你使用的自动化驱动方式,所以不知道是 ios wda 卡住,还是 android uiautomator2 卡住,还是别的其他底层驱动卡住。
可以跑的时候也收集下对应操作系统的日志(如 android logcat ,ios 的系统日志),看下发生超时的同一时刻,操作系统有没有报什么异常?
也特别感谢你之前开源的脑图编辑器,我们内部的 vue 脑图编辑器就是基于你开源的版本进行调整的,省了很多力。
目前已经封装成了独立的 vue 组件,方便各个 vue 工程直接接入。目前在内部申请开源中。
学习了。
文章概念略多,想确认下,Light Merge 是不是相当于:
1、从 master 拉出一个新分支
2、选择一堆开发完待测试的 feature 分支,逐个 git merge 到这个新分支
3、全部成功则可以基于这个分支进行测试,有冲突则提示信息,让开发改为手动 merge
这三个点?
实际实践中,有个疑问点,修改 bug 是在 feature 分支上修,还是直接基于合并后的新分支修?是否会遇到某个功能,在单独 feature 分支独立没问题,但 merge 后的新分支有问题的情况?
个人理解,2 年一般要求是一个独立的执行者 + 入门的协调者吧
1、可以独立 Hold 住中小型项目的整个测试过程,包括前期评审到测试到最后上线。
2、接口、UI 自动化至少两者有其中一者的经验,能基于工具或框架编写用例
3、对自己测试的系统整体架构有了解,自己测的最多的部分能说清背后怎么实现的
4、视野除了自己所在的小公司,还能看到一些行业的东西,比如接口测试除了自己用过的,还有什么流行的工具,大概优缺点是什么,不一定用过,但有一些了解。
不过,实际上招聘不是看 2 年经验要有什么能力或技术,你是否符合,而是岗位要有什么能力或技术,你是否符合,然后再看你工作年限,年限只要不是过大一般没问题。2 年一般对应的是中级或者高级 title,可以参考下照片网站上这方面的岗位招聘要求。
RPC 应该不算是协议吧?