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.