使用 Visual Studio 2017 搭配 Xamarin.UITest 進行安卓應用程式的自動化測試
前言
介紹完了使用 Appium 來針對安卓應用程式進行自動化測試的方式之後。這回要跟大家分享的是更輕鬆愉快的方式--只要透過錄製的方式就能自動產生程式碼的 Xamarin.UITest。
如果要簡單的介紹一下 Xamarin.UITest ,它其實就是一個以 Calabash 為基礎,可以讓我們透過 NUnit 和 C# 來撰寫針對安卓和 iOS 原生 App 自動化測試的一個框架。
雖然它的名字前面掛了個 Xamarin ,但是它可不只能測 Xamarin 開發出來的 App 而已喔!! 原生的安卓和 iOS 應用程式也都是可以透過它來作到自動化測試的喔!!
而 Xamarin.UITest 原生支援 NUnit 2,所以建立出來的專案預設就會加入 NUnit 的參考,整個測試框架也是基於 NUnit 2 所建構的。
需要特別注意的是,目前 UITest 尚未支援 NUnit 3 喔!!
好了,有了簡單的介紹之後,再來我們就直接進入重點啦~
懶人/麻瓜福音 - 透過錄製的方式產生程式碼
Xamarin.UITest 最吸引人的地方就是可以直接透過 Visual Studio 來錄製測試的步驟,並且自動轉化為測試程式碼。
廢話不多說,馬上開啟 Visual Studio 2017 來建立一個 Xamarin.UITest 測試專案。
專案類型使用 Cross-Platform -> UI Test App (Xamarin.UITest|Cross-Platform)。
![image-01] (01-create-uitest-project.png "建立 Xamarin.UITest 測試專案")
專案建立完成之後,透過方案總管打開內建的 Tests.cs 檔,應該可以看到如下圖的畫面:

在開始錄製測試的步驟之前,建議先將電腦中的安卓模擬器開起來準備;如果要使用實機進行錄製的話,也請先把機器接上電腦。
只要點選那個錄製符號加閃電的圖示,並且選取 Record New Test -> Select APK,接著選取要進行測試的 APK 之後,接下來,Visual Studio 就會幫我們把 APK 安裝到模擬器上,並且自動打開它,錄製我們接下來的所有行為。

這邊我就一樣使用之前用來示範 Appium 自動化測試的同一個 APK 檔來進行測試。
如果光是用文字加圖片來描述錄製的過程的話可能會有點複雜,所 以我直接錄給大家看囉~
請看 VCR !!
影片中有幾個重點,在這邊再透過文字來提醒大家:
-
錄製的過程中,如果有需要驗證物件是否出現或是值是否正確的時候,可以按下左邊的板手小圖示,選取
Start Assertion Mode,再點選要驗證的控制項,就能自動產生驗證相關的程式碼。 -
若要結束錄製,則需要按下左邊的板手小圖示,選取
Stop Recording即可。
錄製完畢之後,千萬要記得要在 AppInitializer.cs 的 StartApp 方法中為 Android 手動加上 APK 檔的路徑,這樣才能順利執行測試喔!!
錄好了,然後呢?
大家可以看到,錄製出來的程式碼就是很標準的 C# 語法,只要有基本的 C# 功力,應該都有能力去編輯它的內容才對。
然而,畢竟不是我們自己手動刻出來的,透過錄製產生出來的程式碼,也可能會有部份不如我們的預期。
舉例來說,像是驗證的部份,自動產生的程式碼就不會幫我們加上 NUnit 的 Assert 方法來進行驗證。
另外,針對某些控制項的搜尋方式,有些會使用控制項 Id ,有些則是使用值來查找。
雖然這些並不會影響到自動化測試的結果,不過對於講究紀率的開發團隊來說,可能還是得手動進行一些調整,來讓這組程式碼可以符合團隊開發的規範。
所以,舉例來說,我們可以將錄製好的程式碼改成這樣:
[Test]
public void NewTest()
{
app.Tap( x => x.Marked("The Hunger Games"));
app.Back();
app.Tap(x => x.Text("Harry Potter and the Order of the Phoenix"));
app.Back();
app.Tap(x => x.Text("To Kill a Mockingbird"));
app.Back();
app.Tap(x => x.Text("Pride and Prejudice"));
var name = app.Query( x => x.Marked( "txtName" ) );
Assert.IsTrue( name.Any());
Assert.AreEqual( "Pride and Prejudice" , name.FirstOrDefault().Text );
var price = app.Query( x => x.Marked( "txtPrice" ) );
Assert.IsTrue( price.Any() );
Assert.AreEqual( "4.8" , price.FirstOrDefault().Text );
app.Back();
}
這樣一來應該比原來產生的程式碼來得一致多了吧?
除了用錄製的方式產生程式碼之外,當然您也可以選擇使用完全手寫的方式來寫出自動化測試的所有流程喔!!