Xamarin.Forms
BDD-eenheid testen in Xamarin.Forms
Zoeken…
Opmerkingen
- De DI Container / resolver die we intern in deze bibliotheek gebruiken, is Autofac.
- Het testraamwerk is NUnit 3x.
- U zou deze bibliotheek met elk Xamarin.Forms-framework moeten kunnen gebruiken
- Bron- en voorbeeldproject hier beschikbaar
Eenvoudige Specflow om commando's en navigatie te testen met NUnit Test Runner
Waarom hebben we dit nodig?
De huidige manier om unit-testen uit te voeren in Xamarin.Forms is via een platformrunner, dus je test moet worden uitgevoerd in een ios-, Android-, Windows- of Mac UI-omgeving: tests uitvoeren in de IDE
Xamarin biedt ook geweldige UI-tests met het Xamarin.TestCloud- aanbod, maar wanneer u BDD-ontwikkelpraktijken wilt implementeren en de mogelijkheid hebt om ViewModels en Commando's te testen, terwijl goedkoop op een unit testlopers lokaal of op een build-server wordt uitgevoerd, is er geen op de juiste manier gebouwd.
Ik heb een bibliotheek ontwikkeld die het mogelijk maakt om Specflow te gebruiken met Xamarin.Forms om uw functies eenvoudig te implementeren van uw scenariodefinities tot het ViewModel, onafhankelijk van elk MVVM-framework dat voor de app wordt gebruikt (zoals XLabs , MVVMCross , Prism )
Als u BDD nog niet kent , vink dan Specflow out aan.
Gebruik:
Als u dit nog niet hebt, installeert u de specflow visual studio-extensie vanaf hier (of van uw visual studio IDE): https://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6
Voeg een klassenbibliotheek toe aan uw Xamarin.Forms-project. Dat is jouw testproject.
Voeg het SpecFlow.Xamarin.Forms-pakket van nuget toe aan uw testprojecten.
Voeg een klasse toe aan uw testproject dat 'TestApp' erft, en registreer uw views / viewmodels en voeg een DI-registratie toe, zoals hieronder:
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(); } }
- Voeg een klasse SetupHook toe aan uw testproject om u Specflow-haken toe te voegen. U moet de testapplicatie bootstrap zoals hieronder, met de klasse die u hierboven hebt gemaakt, en het initiële weergavemodel van uw app:
[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>(); } }
- U moet een vangblok toevoegen aan uw xamarin.forms-weergaven codebehind om het kader van xamarin.forms te negeren waardoor u wordt gedwongen de app-ui uit te voeren (iets wat we niet willen doen):
public YourView() { try { InitializeComponent(); } catch (InvalidOperationException soe) { if (!soe.Message.Contains("MUST")) throw; } }
Voeg een specflow-functie toe aan uw project (met behulp van de vs specflow-sjablonen die worden geleverd met de vs specflow-extensie)
Maak / genereer een stapklasse die TestStepBase overneemt en de parameter scenarioContext doorgeeft aan de basis.
Gebruik de navigatieservices en helpers om te navigeren, opdrachten uit te voeren en uw weergavemodellen te testen:
[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); } }
Geavanceerd gebruik voor MVVM
Om aan het eerste voorbeeld toe te voegen, om navigatie-instructies die in de applicatie voorkomen te testen, moeten we het ViewModel voorzien van een haak naar de navigatie. Om dit te behalen:
- Voeg het pakket SpecFlow.Xamarin.Forms.IViewModel van nuget toe aan uw PCL Xamarin.Forms project
- Implementeer de IViewModel-interface in uw ViewModel. Hiermee wordt eenvoudig de Xamarin.Forms INavigation-eigenschap zichtbaar:
-
public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
- Het testraamwerk zal dat oppikken en de interne navigatie beheren
- U kunt elke MVVM-frameworks voor uw toepassing gebruiken (zoals XLabs , MVVMCross , Prism om er een paar te noemen. Zolang de IViewModel-interface in uw ViewModel is geïmplementeerd, zal het framework dit oppakken.