Appium 服務器運行時會產生很多日誌,但是很多人並不瞭解其中的意義,也無法掌握有用的信息。本文將詳細解讀如何讀懂 Appium 日誌,並讓你的測試效率翻倍。
開啟服務
日誌第一行顯示了 Appium 版本和運行地址。
<code>$ appium [Appium] Welcome to Appium v1.8
.0
-beta3 (REV40e40975
ebd3593d08c3f83de2546258f7ddf11d) [Appium] Appium REST httpinterface
listener
started
on
0.0.0.0:4723
/<code>
如果你在 Appium 上添加了參數,他們會在日誌中展示,如果添加了 defaultCapabilities,日誌也會顯示出來。
Appium 參數:
http://appium.io/docs/en/writing-running-appium/server-args/defaultCapabilities詳見:
http://appium.io/docs/en/writing-running-appium/default-capabilities-arg/
<code>$
appium
--address
172.19
.131
.113
--port
8000
--default-capabilities
'{"showIOSLog": true}'
[Appium]
Welcome
to
Appium
v1.8.0-beta3
(REV
40e40975ebd3593d08c3f83de2546258f7ddf11d)
[Appium]
Non-default server args:
[Appium]
address:
172.19
.131
.113
[Appium]
port:
8000
[Appium]
defaultCapabilities:
{
[Appium]
showIOSLog:
true
[Appium]
}
[Appium]
Default
capabilities,
which will be added to each request unless overridden by desired capabilities:
[Appium]
showIOSLog:
true
[Appium]
Appium
REST
http
interface
listener
started
on
172.19
.131
.113
:8000
/<code>
對於自動化測試來說,這個信息很重要,因為不同的 Appium 版本有不同的功能和問題,必須要知道自己的 Appium 版本。
創建 Session
為了自動化測試跑起來,session 要做很多事,日誌提供了一些基本的 session 信息,特別是 desired capabilities 和 default capabilities。應該時刻注意 Appium 服務是否正確接收了請求內容,日誌列出了創建 automation session(不懂 automation session 的看下面的鏈接)。
desired capabilities:
http://appium.io/docs/en/writing-running-appium/caps/
<code>[Appium]
Creating
new
XCUITestDriver
(v2.68.0)
session
[Appium]
Capabilities:
[Appium]
app:
/Users/isaac/apps/UICatalog-iphonesimulator.app
[Appium]
platformName:
iOS
[Appium]
platformVersion:
11.3
[Appium]
deviceName:
iPhone
6
[Appium]
automationName:
XCUITest
[Appium]
noReset:
true
[Appium]
maxTypingFrequency:
30
[Appium]
clearSystemFiles:
true
[Appium]
showXcodeLog:
false
[debug]
[BaseDriver]
[debug]
[BaseDriver]
Creating session with MJSONWP desired capabilities:
{"app":"/Users/isaac/code/a...
/<code>
Appium 指令
Appium 是一個 REST 服務,接收 HTTP 請求,展示請求內容,返回某種結果。Appium 服務端日誌用線和箭頭展示了請求和返回的內容。在兩個箭頭之間是 Appium 服務端執行請求命令的日誌信息:
什麼是REST服務:
https://en.wikipedia.org/wiki/Representational_state_transfer
<code>[HTTP] [debug] [MJSONWP] Calling AppiumDriver.getStatus()with
args: [] [debug] [MJSONWP] Respondingto
client
with
driver.getStatus()result
: {"build"
:{"version"
:"1.8.0-beta3"
,"revision"
:"30e7b45bdc5668124af33c41492aa5195fcdf64d"
}} [HTTP
]
錯誤排查
利用日誌可以非常方便的排查錯誤,錯誤通常發生在 automation session 之後。但有時,如果 session 持續存在,錯誤也可能發生。所以第一步是找出錯誤在哪。
下面的例子可以看出,每個指令用 [HTTP] --> 和 [HTTP]
<code>[HTTP]
-->
POST
/wd/hub/session
[debug]
[AndroidDriver]
Shutting
down
Android
driver
[debug]
[AndroidDriver]
Called
deleteSession
but
bootstrap
wasn't
active
[debug]
[Logcat]
Stopping
logcat
capture
[debug]
[ADB]
Getting
connected
devices...
[debug]
[ADB]
1
device(s)
connected
[debug]
[ADB]
Running
'/home/user/Android/Sdk/platform-tools//adb'
with args:
["-P",5037,"-s","ec8c4df","shell","am","force-stop","io.appium.unlock"]
[debug]
[AndroidDriver]
Not
cleaning
generated
files.
Add
`clearSystemFiles`
capability
if
wanted.
[MJSONWP]
Encountered internal error running command: Error: Cannot stop and clear com.company.app. Original error: Error executing adbExec. Original error:
'Command '
/home/user/Android/Sdk/platform-tools//adb
-P
5037
-s
ec8c4df
shell
pm
clear
com.company.app'
exited
with
code
1
'; Stderr: '
Error: java.lang.SecurityException:
PID
22126
does
not
have
permission
android.permission.CLEAR_APP_USER_DATA
to
clear
data
of
package
com.company.app';
Code:
'1'
at
Object.wrappedLogger.errorAndThrow
(../../lib/logging.js:63:13)
at
ADB.callee$0$0$
(../../../lib/tools/adb-commands.js:334:9)
at
tryCatch
(/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)
at
GeneratorFunctionPrototype.invoke
[as
_invoke]
(/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)
at
GeneratorFunctionPrototype.prototype.(anonymous
function)
[as
throw]
(/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)
at
GeneratorFunctionPrototype.invoke
(/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)
at
at
process._tickCallback
(internal/process/next_tick.js:188:7)
[HTTP]
POST
/wd/hub/session
500
40811
ms
-
557
/<code>
用戶試圖用 Android driver 啟動一個 session,但發生了錯誤。Appium 為準備 session 而關掉並清除 AUT 時發現了錯誤,這個錯誤讓我們知道兩件事:
- Appium 正在嘗試做什麼
- 哪裡出錯了
在這個例子中,Appium 嘗試運行 adb 命令(adb shell am force-stop),adb 參數在錯誤信息中也有顯示。發生了 Android 系統權限錯誤。此時,我們可以手動運行這個 adb 命令,看看錯誤是不是可以重現。如果錯誤重現,上網查錯吧!如果 adb 命令成功運行,可能是 Appium 的 bug,應該去 Github 的 issue 上查看或者提交這個 bug 。(例子中的錯誤是設備製造商的安全模型造成的)
這個例子只是眾多錯誤中的一個,但它說明至關重要的一點,當錯誤發生時,日誌可以提供更多的信息,如果沒有完整的日誌信息,對 Appium 排錯難上加難。
可以改變日誌輸出的參數
通常,默認的日誌內容已經足夠,如果你想去 Github 上尋求幫助,信息當然越多越好!下面一些參數可以改變 Appium 服務端的日誌行為:
- --log-level - 改變Appium日誌顯示級別。Appium 默認展示所有日誌,它有以下一些選項:'info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error'。
- --log-no-colors - 如果你的控制檯沒有顏色(日誌可能會產生一些奇怪的字符,比如"TODO: find the color"),你可以用這個參數關閉顏色。
- --log-timestamp - 在日誌前添加時間戳,在排查超時錯誤時有奇效,展示如下:
<code>2018
-03
-15
13
:17:58:663
-
[Appium]
Welcome
to
Appium
v1.8.0-beta3
(REV
30e7b45bdc5668124af33c41492aa5195fcdf64d)
2018
-03
-15
13
:17:58:664
-
[Appium]
Non-default server args:
2018
-03
-15
13
:17:58:665
-
[Appium]
logTimestamp:
true
2018
-03
-15
13
:17:58:732
-
[Appium]
Appium
REST
http
interface
listener
started
on
0.0
.0
.0
:4723
/<code>
(文章來源於霍格沃茲測試學院)
專欄
軟件測試工程師如何獲取高薪職位
9.9幣
0人已購