走進 UITest for Xamarin.Forms 走進 Prism for Xamarin.Forms

上一篇  走進 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

 

 摘自官方的說明測試

  • NUnit 2.6.x – Xamarin.UITest is not compatible with NUnit 3.x.
  • A Test Runner for Visual Studio – A 3rd party test runner, such as the NUnit Test Adapter for NUnit 2 or Resharper from Jetbrains, is required for Visual Studio to be able to run the NUnit tests. The NUnit3TestAdapter is not compatible with Xamarin.UITest.
  • Android SDK – Only if testing Android apps. Windows requires that the ANDROID_HOME environment variable is set with the path to the Android SDK.
  • Java Developers Kit – Only if testing Android apps.

 

 2、執行 Test網站

  •  REPL

 建完項目會有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 進程

 

  • Xamarin Test Cloud

 首先須要註冊試用,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盤

  1. E:
  2. cd E:\Code\SD.Xamarin
  3. 粘貼修改過的命令

     

回車後會看到上傳過程和結果

失敗了,不要緊,先繼續看同時網頁那邊的狀況,回頭再改

當再次刷新網站時,頁面變成下邊這樣

 

點進去看看詳情

能夠看到正在跑 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.

 

 

 

 

 

 

  

 

更多內容請參考官方文檔,若有錯誤以官方爲準,有些地方翻譯和理解的可能有偏差

相關文章
相關標籤/搜索