Xamarin.Forms
Testowanie jednostek BDD w Xamarin.Forms
Szukaj…
Uwagi
- Kontener / resolver DI, którego używamy wewnętrznie w tej bibliotece, to Autofac.
- Ramy testowe to NUnit 3x.
- Powinieneś być w stanie korzystać z tej biblioteki w dowolnym frameworku Xamarin.Forms
- Źródło i przykładowy projekt dostępny tutaj
Prosty Specflow do testowania poleceń i nawigacji za pomocą NUnit Test Runner
Dlaczego tego potrzebujemy?
Obecny sposób przeprowadzania testów jednostkowych w Xamarin.Forms odbywa się za pomocą platformy do uruchamiania, więc test będzie musiał zostać przeprowadzony w środowisku interfejsu użytkownika iOS, Android, Windows lub Mac: Uruchamianie testów w IDE
Xamarin zapewnia również niesamowite testy interfejsu użytkownika dzięki ofercie Xamarin.TestCloud , ale gdy chce się wdrożyć praktyki deweloperów BDD i mieć możliwość testowania ViewModels i poleceń, podczas gdy tani działa na testach jednostkowych lokalnie lub na serwerze kompilacji, nie ma zbudowany w sposób.
Opracowałem bibliotekę, która pozwala używać Specflow z Xamarin.Forms do łatwego wdrażania twoich funkcji, od definicji scenariuszy do ViewModel, niezależnie od dowolnej struktury MVVM używanej dla aplikacji (takich jak XLabs , MVVMCross , Prism )
Jeśli dopiero zaczynasz korzystać z BDD, sprawdź Specflow out.
Stosowanie:
Jeśli jeszcze go nie masz, zainstaluj rozszerzenie Visual Studio specflow stąd (lub od Ciebie IDE Visual Studio): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6
Dodaj bibliotekę klas do swojego projektu Xamarin.Forms. To twój projekt testowy.
Dodaj pakiet SpecFlow.Xamarin.Forms z Nuget do projektów badawczych.
Dodaj klasę do projektu testowego, który dziedziczy „TestApp”, i zarejestruj swoje pary widoków / modeli, a także dodaj dowolną rejestrację DI, jak poniżej:
public class DemoAppTest : TestApp
{
protected override void SetViewModelMapping()
{
TestViewFactory.EnableCache = false;
// register your views / viewmodels below
RegisterView<MainPage, MainViewModel>();
}
protected override void InitialiseContainer()
{
// add any di registration here
// Resolver.Instance.Register<TInterface, TType>();
base.InitialiseContainer();
}
}
- Dodaj klasę SetupHook do projektu testowego, aby dodać haki Specflow. Będziesz musiał uruchomić aplikację testową zgodnie z poniższym opisem, podając klasę utworzoną powyżej oraz początkowy model aplikacji:
[Binding]
public class SetupHooks : TestSetupHooks
{
/// <summary>
/// The before scenario.
/// </summary>
[BeforeScenario]
public void BeforeScenario()
{
// bootstrap test app with your test app and your starting viewmodel
new TestAppBootstrap().RunApplication<DemoAppTest, MainViewModel>();
}
}
- Konieczne będzie dodanie bloku catch do kodu widoków xamarin.forms w celu zignorowania frameworku xamarin.forms zmuszającego do uruchomienia interfejsu użytkownika aplikacji (czego nie chcemy robić):
public YourView()
{
try
{
InitializeComponent();
}
catch (InvalidOperationException soe)
{
if (!soe.Message.Contains("MUST"))
throw;
}
}
Dodaj funkcję specflow do swojego projektu (używając szablonów vs specflow dostarczonych z rozszerzeniem vs specflow)
Utwórz / Wygeneruj klasę kroków, która dziedziczy TestStepBase, przekazując parametr scenarioContext do bazy.
Użyj usług nawigacyjnych i pomocników do nawigacji, wykonywania poleceń i testowania modeli widoku:
[Binding]
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<MainViewModel>();
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);
}
}
Zaawansowane użycie MVVM
Aby dodać do pierwszego przykładu, aby przetestować instrukcje nawigacyjne występujące w aplikacji, musimy zapewnić ViewModel hak do Nawigacji. Osiągnąć to:
- Dodaj SpecFlow.Xamarin.Forms.IViewModel pakiet z Nuget do projektu PCL Xamarin.Forms
- Zaimplementuj interfejs IViewModel w swoim ViewModel. Spowoduje to po prostu ujawnienie właściwości Xamarin.Forms INavigation:
-
public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; } - Struktura testowa wykryje to i zarządza wewnętrzną nawigacją
- Możesz użyć dowolnego frameworka MVVM dla swojej aplikacji (takiego jak XLabs , MVVMCross , Prism, żeby wymienić tylko kilka. Tak długo, jak interfejs IViewModel jest zaimplementowany w twoim ViewModel, framework go odbierze.