2015-12-30 82 views
1

我正在爲Xamarin上的Android,Windows Desktop 8.1,WinPhone 8.1,iOS開發跨平臺的應用程序,現在添加了測試項目。我經歷了多個UITests資源,但有以下查詢。如果有人能糾正我,這可能會有所幫助。Xamarin中的單元測試查詢

  1. 類型Android測試項目,Windows Phone測試,iOS測試存在。當這些運行時,這些作爲設備/仿真器中的應用程序執行。那麼,這些測試原始應用程序將如何在同一設備上運行?
  2. 如果我有兩個不同的android項目,我如何在上面的測試項目中指定要測試哪一個?
  3. 我還添加了UITest項目,它是類庫項目。在此,我可以使用下面的代碼提apk文件:

    [SetUp] public void BeforeEachTest() { app = ConfigureApp.Android.ApkFile(@"Path\to\apk\com.namespace.apk") .DeviceSerial("emulator-1234") .StartApp(); }

如何引用一個項目來測試而不是.apk文件,所以我每次運行測試時間修改項目?

  1. 如何將UITest項目和本機測試項目結合使用?像常見的便攜式庫一樣,被本地項目引用。

在此先感謝

回答

0
  1. 不知道我理解這個問題。

    UITest將在設備/模擬器中部署並運行應用程序,然後將針對該應用程序運行測試。對於正在測試的iOS應用程序,它將爲您啓動模擬器。對於正在測試的Android應用程序,您必須自己啓動模擬器。如果他們是不同的Android應用程序,那麼大概每個Android應用程序的UITests都會有所不同,所以將UITests保存爲單獨的項目似乎是合理的,特別是如果您要將測試上傳到Xamarin測試雲。

    另請注意,UITest目前不支持Windows Phone項目,因此它只能用於測試您的Android和iOS項目。

  2. 有了兩個不同的Android項目,您可以爲每個Android項目創建一個UITest項目,或者您需要使用ConfigureApp.Android.ApkFile()來指定測試中.apk文件的路徑在代碼示例中完成。

  3. 如果您使用Xamarin Studio,則可以直接在IDE中運行UITest,而無需指定.apk文件或iOS .app的完整路徑。

    你需要做的是讓UITest項目引用Android項目。但是它需要一種特殊類型的參考,因此您需要使用Xamarin Studio來執行此操作。您可以從單元測試窗口中添加這種特殊類型的參考,方法是找到測試應用項目,選擇添加應用項目,然後選擇Android和/或iOS項目。

    有關Xamarin開發人員指南的更多信息,請參閱Adding UITest to a solution

    請注意,您可以讓一個UITest項目測試iOS和Android應用程序。假設它們都是同一個應用程序。但是,您可能需要創建Android和iOS特定的UI測試查詢以在屏幕上查找UI元素。

  4. 首先,您應該問問自己,您是否確實需要將UITest與本地測試項目結合使用。例如UITest可能需要很長時間才能運行,所以如果你有一些快速的單元測試,你可能不希望將它們一起運行。

    如果本地測試項目本質上是NUnit項目,則可以將它們結合使用。 UITest項目基本上是一個NUnit項目。它有一個對NUnit的引用,並且是一個類庫。如果您的本機測試可以從NUnit項目運行,那麼您可以將它們組合起來。但是,您將無法在Xamarin的測試雲中運行本機測試。

    如果本機測試項目不使用NUnit,那麼您不能將它們與UITest項目組合。

1

關於點4

目前,運行鍼對Xamarin.Forms控制檯單元測試,即在UI的隔離測試視圖模型,命令和導航需要建立公平一點。在完全隔離Xamarin.Forms框架的情況下測試ViewModels將不允許跨多個ViewModel進行測試。

例如,測試在完全隔離的登錄視圖模型,其中:

  • 用戶輸入用戶名/密碼,
  • 點擊登錄按鈕
  • 重定向到他們的數據驗證屏幕填充

    將不起作用,因爲這需要視圖模型導航上的鉤子,因此測試可以在Login ViewModel上進行身份驗證,然後導航並初始化Authenticated ViewModel。

所以我把出的NuGet庫,允許簡單地實現這一點,並且還使用specflow提供BDD。測試在vs測試shell或任何nunit控制檯運行程序(例如在Team City等Build Server中)上作爲nunit測試運行。

實施例:

public class GeneralSteps : TestStepBase 
{ 
    public GeneralSteps(ScenarioContext scenarioContext) 
     : base(scenarioContext) 
    { 
     // you need to instantiate your steps by passing the scenarioContext to the base 
    } 

    [Given(@"I am on the main view")] 
    public void GivenIAmOnTheMainView() 
    { 
     Resolver.Instance.Resolve<INavigationService>().PushAsync<MainViewMode>();   
     Resolver.Instance.Resolve<INavigationService>().CurrentViewModelType.ShouldEqualType<MainViewModel>(); 
    } 

    [When(@"I click on the button")] 
    public void WhenIClickOnTheButton() 
    { 
     GetCurrentViewModel<MainViewModel>().GetTextCommand.Execute(null); 
    } 

    [Then(@"I can see a Label with text ""(.*)""")] 
    public void ThenICanSeeALabelWithText(string text) 
    {   
     GetCurrentViewModel<MainViewModel>().Text.ShouldEqual(text); 
    } 
} 

步說明here NuGet包here