上一篇 走進 Prism for Xamarin.Forms 講了簡單的建立一個項目,而後添加了幾個頁面來回切換,這篇想先搞下 UITesthtml
官方詳細地址:https://developer.xamarin.com/guides/testcloud/uitest/intro-to-uitest/web
1、首先在項目上右鍵添加一個 UITest 項目,我命名爲 SD.Xamarin.UITest ,由於 項目叫 SD.Xamarinapi
建完的項目引用的 NUnit 的引用包千萬別升級,官方說了,3.X的是不兼容的,因此你就用2.6.X的好了,官方文檔很重要有木有,否則像我總喜歡升級到最新版的人,就會悲劇的app
IOS項目須要添加 Nuget 包 Xamarin.TestCloud.Agent(官網說的,沒有 Mac 無法測試)ide
同時要添加 Android 和 IOS 項目的引用post
摘自官方的說明測試
ANDROID_HOME
environment variable is set with the path to the Android SDK.
2、執行 Test網站
建完項目會有2個文件,其中一個叫 AppInitializer.cs 的文件就是配置路徑的文件,也就是讓項目知道去哪裏找到生成的包文件,Android 的是 apk 文件,IOS 的是 app 文件ui
public class AppInitializer { public static IApp StartApp(Platform platform) { if (platform == Platform.Android) { return ConfigureApp .Android .ApkFile("../../../SD.Xamarin/SD.Xamarin.Droid/bin/Release/SD.Xamarin.Droid.apk") .StartApp(); } return ConfigureApp .iOS .AppBundle("../../../SD.Xamarin/SD.Xamarin.iOS/bin/iPhoneSimulator/Release/SD.Xamarin.iOS.app") .StartApp(); } }
紅色的部分就是須要本身加的,由於在一個項目文件夾下,因此前邊的 ../../../ 就是往上找目錄(C# 的人都懂的),而後是 項目名 / 測試平臺的項目名 / 生成包的路徑,Debug 仍是 Release 隨你喜歡了(Debug 的包名稱要適當修改,見下邊),這裏要說明下,千萬不要把項目放到VS 的默認目錄下,由於 WIN 10 的權限關係,它只讓你搞 AppData 文件夾,而 VS 默認目錄是 Document 文件夾,因此你根本找不到。url
Android: Debug 目錄下生成的是 SD.Xamarin.Droid-Signed.apk ,Release 目錄下會生成 SD.Xamarin.Droid-Signed.apk 和 SD.Xamarin.Droid.apk 兩個
IOS: 因爲沒有Mac 沒法驗證,可是看到生成 的是 SD.Xamarin.IOS.exe ,不是 app ,不知道是否沒有鏈接 Mac 的事情
固然跑以前要先 Build 好 apk 包,由於用 Android 跑的, IOS 須要鏈接 Mac 因此無法測試
這是 Test 方法
[Test] public void TestLogin() { _app.EnterText(n => n.Marked("Username"), "Name"); _app.EnterText(n => n.Marked("Password"), "Password"); _app.Tap(c => c.Button("LoginButtons")); _app.Repl();
AppResult[] result = _app.Query();
Assert.IsTrue(result.Any(), "Login"); }
先運行下試試
失敗了,不過不要緊,說明配置都是對的,只是沒有設備而已。
啓動 Visual Studio Emulator for Android
嗯,仍是配置的問題
官方說要這樣配置,https://developer.xamarin.com/guides/testcloud/uitest/working-with/running-tests-in-ide/
TARGET | ARCHITECTURE |
---|---|
iOS Simulator | x86 |
iOS device | x86_64 |
Android Device | Typically armeabi-v7a |
Google Emulator | Depends on the Android Virtual Device |
改到 Release 和 ARM 後,再來,彈出了一個窗體,輸入 tree 回車
成功了,頁面裏內容都顯示出來了,並且由於我寫了 Button 的觸發,還列出了跳轉後的頁面的內容
同時模擬器也會有跑 Test
1.手機啓用開發者模式,USB 調試打開
2.電腦上安裝 Google USB Driver(Android SDK Manager 裏最下邊那裏有)
3.把手機鏈接到電腦上,若是一切正常,啓動那裏就能夠選 Device 了(手機的名字,好比個人 Letv X800+)
若是你如今直接啓動測試,會發現報錯
那就指定一下設備吧,打開 ADB 控制檯
輸入 adb device
很明顯的錯誤,是說2個設備,由於還有個 Emulator ,因此你須要指定設備,設備號碼在錯誤裏會有,修改啓動方法以下
public static IApp StartApp(Platform platform)
{
if (platform == Platform.Android)
{
return ConfigureApp
.Android
.ApkFile("../../../SD.Xamarin/SD.Xamarin.Droid/bin/Release/SD.Xamarin.Droid.apk")
.DeviceSerial("96e5b85b")
.StartApp();
}
return ConfigureApp
.iOS
.AppBundle("../../../SD.Xamarin/SD.Xamarin.iOS/bin/iPhoneSimulator/Release/SD.Xamarin.iOS.app")
.StartApp();
}
當你再次啓動測試時,會發現仍是會報錯,超時的錯誤,這點和 Emulator 很不同,因此須要修改測試方法
[Test] public void TestLogin() { _app.Tap(c => c.TextField("Username")); _app.EnterText(n => n.Marked("Username"), "Name"); _app.WaitForElement(n => n.Marked("Username").Text("Name")); _app.Tap(c => c.TextField("Password")); _app.EnterText(n => n.Marked("Password"), "Password"); _app.WaitForElement(n => n.Marked("Password").Text("Password"), ""); _app.Tap(c => c.Button("LoginButton")); AppResult[] result = _app.Query(); Assert.IsTrue(result.Any(), "Login"); }
在我看來這樣應該是對的了,可是不知道是個人環境問題仍是怎樣,在想把焦點跳到 Password 的時候,手機的虛擬鍵盤收起又彈出,可是焦點沒有跳過去,因此我手點了一下,運行到點擊 Button 的時候又跳不過去焦點,因而我又點了一下,可是沒有在登陸按鈕上擡起,因而焦點跳過去了,而後就觸發了 Button 的點擊,可是不寫 Tap 第一個 Username 的焦點也不會進,因此我覺的焦點是這麼跳的,我想不多是隻須要 WaitForElement 方法,而後都須要手動輸入吧,掐斷點的時候你會發現到 WaitForElement 方法的時候是會停住的,直到符合條件纔會繼續,可是若是你一直不符合條件,仍是會報超時的錯誤。
Tips:1. 若是這裏是我理解的錯誤,還請賜教
2. 若是跑 test 時遇到 refused to install the app by The ADB command ! 錯誤,去任務管理器裏結束 adb.exe 進程
首先須要註冊試用,https://testcloud.xamarin.com/register
進去後右上角點擊 頭像下的 Account Setting ,左邊選 Teams & Apps,show API Key 會出來一個 key 留着一會上傳用
SD.Xamarin\packages\Xamarin.UITest.2.1.2\tools 下會有一個 test-cloud.exe (VS 2017 沒有右鍵上傳,VS 2015 有)
若是帳號確認後,就能夠建立新的 Test 了
點擊 New Test Run,選擇 Android
選擇想測試的設備
選擇分支和語言
最終生成了腳本的模板
複製腳本,修改你的真實參數
打開 cmd 窗體,把位置改到項目的地址
好比代碼放在了E盤
回車後會看到上傳過程和結果
失敗了,不要緊,先繼續看同時網頁那邊的狀況,回頭再改
當再次刷新網站時,頁面變成下邊這樣
點進去看看詳情
能夠看到正在跑 Test
點進去看下
這就是大概的詳情,下邊還有一些內容,請本身試驗時看吧
點擊失敗的 Test 能夠看到截圖
具體錯誤的緣由能夠查看 Log 修改,直到 能夠測試成功。
補充成功的截圖
雖然成功了,但仍是很奇怪,焦點跳不過去,因此沒有跳轉頁面,可是模擬器卻始終好使。
這裏就是模擬器和真機的區別了,模擬器沒有顯示鍵盤,真機須要手動關閉一下鍵盤,否則焦點就會不跳轉
修改後的代碼以下
[Test] public void TestLogin() { _app.WaitForElement(x => x.Marked("Username")); _app.Tap(x => x.Marked("Username")); _app.EnterText(x => x.Marked("Username"), "Name"); _app.Screenshot("Fill Name Finished"); _app.DismissKeyboard(); _app.WaitForElement(x => x.Marked("Password")); _app.Tap(x => x.Marked("Password")); _app.EnterText(x => x.Marked("Password"), "Password"); _app.DismissKeyboard(); _app.Tap(x => x.Marked("LoginButton")); _app.Screenshot("Login"); AppResult[] result = _app.Query(); Assert.IsTrue(result.Any(), "Login"); }
腳本生成過程 https://developer.xamarin.com/guides/testcloud/organizations-and-teams/creating-a-test-run/
腳本參數 https://developer.xamarin.com/guides/testcloud/uitest/working-with/submitting-tests-at-command-line/
4、幾個 Test 方法
方法 | 描述 |
Button |
在屏幕上定位一個或多個按鈕 |
Class |
定位指定類的視圖 |
Id |
用指定的Id定位視圖 |
Index |
從集合中返回匹配的視圖。一般和其餘方法結合使用。接受從0開始的索引 |
Marked |
根據之前提到的啓發返回視圖 |
Text |
匹配包含提供文本的視圖 |
TextField |
匹配 Android EditText 或者 iOS UITextField . |
更多內容請參考官方文檔,若有錯誤以官方爲準,有些地方翻譯和理解的可能有偏差