這篇筆記,將會帶領大家實際進行 Xamarin.UITest 的實際實機演練,您只需要跟著這個文件中的說明步驟操作,就會了解到 Xamarin.UITest 是要如何使用。
事前準備工作
首先,您先要完成您的 Xamarin.Forms 跨平台應用程式開發,並且這個 App 確實已經可以執行且正確無誤。
我們這個實機練習過程,將會以 Android 裝置作為 UI 自動測試的演練平台。
您可以使用這個 GitHub Repository 中的 https://github.com/vulcanlee/UITest/tree/master/XFUITest_Source 作為要測試的應用程式對象。
這個應用程式僅有兩個頁面,第一個頁面將會是使用者登入頁面,在這個頁面中,使用者必須輸入正確的帳號與密碼,否則,將會有錯誤訊息顯示出來。
若帳號與密碼輸入正確,此時,就會導航到這個應用程式的首頁
在每個重點過程中,將會把當時螢幕的畫面截圖下來,儲存到測試結果中。
建立 Xamarin.UITest 專案
首先,打開 XFUITest_Source 目錄下的
XFUITest.sln
專案
在
XFUITest
方案滑鼠右擊,選擇 加入
> 新增專案
> Visual C#
> Cross-Platfom
> UI 測試應用程式 (Xamarin.UITest | 跨平台)
選項。
在底下名稱欄位中,可以輸入您想要的專案名稱,在這裡,我們使用預設值
最後點選
確定
按鈕,完成這個專案的產生。產生 Android 專案的佈署 APK 檔案
請滑鼠右擊
XFUITest.Droid
專案,選擇項目 設定為起始專案
接著,選擇方案組態為
Release
滑鼠右擊
XFUITest.Droid
專案,選擇項目 建置
確定這個專案可以成功建置後,滑鼠右擊
XFUITest.Droid
專案,選擇項目 封存...
當封存成功之後,在
封存管理員
的右下方,會看到 散發
按鈕,請點選他
當
散發
對話窗出現之後,請點選 臨機操作
按鈕
選擇這個 App 要使用的
簽署身分識別
,若您還沒有建立您的專屬簽署身分識別,請建立一個。最後,點選 另存新檔
按鈕
選擇一個適當目錄之後,點選
存檔
按鈕
在
簽署密碼
對話窗出現之後,請輸入您的 簽署身分識別
密碼,之後點選 OK
按鈕。
若再 Visual Studio 左下角的狀態列中,出現了
已完成發行專案 'XFUITest.Droid
訊息,恭喜您,表示您已經產生了這個 Android 發行 APK 檔案了。開啟測試總管
請點選功能表
測試
> 視窗
> 測試總管
,顯示出測試總管的視窗修正 AppInitializer.cs
請在
UITest1
專案內,找到 AppInitializer.cs
檔案,打開它
使用底下程式碼替換到
StartApp
方法的定義
這裡使用了
ApkFile
方法,指定了這個 Android 專案的 vulcanlab.xfuitest.apk
發行檔案所要的路徑
另外,由於我們需要在不同的時間點,進行當時手機畫面的螢幕截圖,所以,我們需要呼叫
EnableLocalScreenshots()
方法 public static IApp StartApp(Platform platform)
{
if (platform == Platform.Android)
{
return ConfigureApp
.Android
.ApkFile("../../../XFUITest/XFUITest.Droid/bin/Release/com.vulcanlab.xfuitest.apk")
.EnableLocalScreenshots()
.StartApp();
}
return ConfigureApp
.iOS
.StartApp();
}
加入這次做的 UI 自動測試腳本
請打開
Tests.cs
檔案,使用底下程式碼來替換。
我們將
[TestFixture(Platform.iOS)]
這個屬性註解起來
我們加入了一個新的測試腳本
LoginTest
[TestFixture(Platform.Android)]
//[TestFixture(Platform.iOS)]
public class Tests
{
IApp app;
Platform platform;
public Tests(Platform platform)
{
this.platform = platform;
}
[SetUp]
public void BeforeEachTest()
{
app = AppInitializer.StartApp(platform);
}
[Test]
public void AppLaunches()
{
app.Screenshot("登入頁面");
}
[Test]
public void LoginTest()
{
app.Screenshot("登入頁面");
app.EnterText(x => x.Class("EntryEditText"), "vulcan");
app.Tap(x => x.Class("EntryEditText").Index(1));
app.EnterText(x => x.Class("EntryEditText").Index(1), "123");
app.Tap(x => x.Text("登入"));
app.WaitForElement(x => x.Id("message"));
app.Screenshot("登入錯誤頁面");
app.Tap(x => x.Id("button2"));
app.WaitFor(() =>
{
Thread.Sleep(1000);
return true;
});
app.Tap(x => x.Class("EntryEditText"));
app.EnterText(x => x.Class("EntryEditText"), "1");
app.Tap(x => x.Class("EntryEditText").Index(1));
app.EnterText(x => x.Class("EntryEditText").Index(1), "1");
app.Tap(x => x.Text("登入"));
app.WaitFor(() =>
{
Thread.Sleep(4000);
return true;
});
app.WaitForElement(x => x.Text("歡迎來到 Xamarin.Forms 的跨平台開發世界"));
app.Screenshot("登入成功頁面");
}
}
開始進行 UI 自動測試
您現在的測試總管視窗,應該會如同下圖,沒有任何的測試方法可以選擇。
請滑鼠右擊
UITest1
專案,選擇 重建
當建置完成後,您現在的測試總管視窗,應該會如同下圖,有測試方法可以選擇。
滑鼠右擊
LoginTest
項目,接著選取 執行選取的測試
項目,此時,Visual Studio 將會開始進行自動化的 UI 測試,所有的過程,將會依照您所設定的腳本來執行。
等候一下,您的模擬器就會自動啟動這個應用程式,並且開始輸入錯誤的密碼,接著進行登入,而後顯示錯誤訊息;稍後,就會輸入正確的帳號與密碼,並且切換到應用程式首頁。
當UI自動測試作業完成之後,您會看到測試總管如下圖的畫面。
在測試總管的最下方,有個
輸出
連結,請點選它。
您會看到如下的測試紀錄日誌
所以,當您的UI自動測試有任何錯誤發生的時候,可以參考這個測試紀錄日誌,試圖找出可能的問題原因。
測試名稱: LoginTest
測試結果: 成功
結果 StandardOutput: Full log file: C:\Users\vulca\AppData\Local\Temp\uitest\log-2017-05-06_00-08-53-984.txt
Skipping IDE integration as important properties are configured. To force IDE integration, add .PreferIdeSettings() to ConfigureApp.
Android test running Xamarin.UITest version: 1.3.8
Initializing Android app on device 169.254.76.233:5555 with apk: D:\Vulcan\GitHub\temp\XFUITest_Source\XFUITest\XFUITest.Droid\bin\Release\com.vulcanlab.xfuitest.apk
Signing apk with Xamarin keystore.
Took screenshot. { Path: "D:\Vulcan\GitHub\temp\XFUITest_Source\UITest1\bin\Release\screenshot-1.png", Title: "登入頁面" }
Using first element (2 total) matching Class("EntryEditText").
Tapping coordinates [ 540, 736 ].
Using element matching Class("EntryEditText").Index(1).
Tapping coordinates [ 540, 938 ].
Using element matching Class("EntryEditText").Index(1).
Tapping coordinates [ 540, 938 ].
Using element matching Text("登入").
Tapping coordinates [ 540, 1183 ].
Waiting for element matching Id("message").
Took screenshot. { Path: "D:\Vulcan\GitHub\temp\XFUITest_Source\UITest1\bin\Release\screenshot-2.png", Title: "登入錯誤頁面" }
Using element matching Id("button2").
Tapping coordinates [ 893, 1051 ].
Using first element (2 total) matching Class("EntryEditText").
Tapping coordinates [ 540, 736 ].
Using first element (2 total) matching Class("EntryEditText").
Tapping coordinates [ 540, 736 ].
Using element matching Class("EntryEditText").Index(1).
Tapping coordinates [ 540, 938 ].
Using element matching Class("EntryEditText").Index(1).
Tapping coordinates [ 540, 938 ].
Using element matching Text("登入").
Tapping coordinates [ 540, 1183 ].
Waiting for element matching Text("歡迎來到 Xamarin.Forms 的跨平台開發世界").
Took screenshot. { Path: "D:\Vulcan\GitHub\temp\XFUITest_Source\UITest1\bin\Release\screenshot-3.png", Title: "登入成功頁面" }
沒有留言:
張貼留言