Miesięczne archiwum: Marzec 2017

Jak zacząć pisać testy z użyciem xUnit

10Things – Jak zacząć pisać testy z użyciem xUnit

Test-Driven Development jest tzw. dobrą praktyką programistyczną dzisiaj chciałbym przedstawić jak zacząć pisać testy z użyciem xUnit. Wszystko omówię na przykładzie aplikacji 10Things tworzonej w Xamarin Forms.

Test-Driven Development – Wprowadzenie

Według definicji z Wikipedia jest to

Test-driven development (TDD) – technika tworzenia oprogramowania, zaliczana do metodyk zwinnych. Pierwotnie była częścią programowania ekstremalnego (ang. extreme programming), lecz obecnie stanowi samodzielną technikę. Polega na wielokrotnym powtarzaniu kilku kroków:

1. Najpierw programista pisze automatyczny test sprawdzający dodawaną funkcjonalność. Test w tym momencie nie powinien się udać.
2. Później następuje implementacja funkcjonalności. W tym momencie wcześniej napisany test powinien się udać.
3. W ostatnim kroku programista dokonuje refaktoryzacji napisanego kodu, żeby spełniał on oczekiwane standardy.

Technika została stworzona przez Kenta Becka. Można jej też używać do poprawiania istniejącego kodu.

Testy w mobile

Jeżeli chodzi o testy na mobile możemy je podzielić na kilka typów:

  • Testy modeli MVVM, serwisów
  • Testy specyficzne dla każdej z platform: obsługa WiFi, bluetooth
  • Testy UI

Dzisiaj skupimy się na testach jednostkowych modeli, serwisów itp elementów aplikacji.

Na platformie Xamarin mamy do dyspozycji kilka opcji do wyboru ja skupiłem się na użyciu xUnit. O xUnit możecie sobie poczytać na stronie xunit.github.io. Ja go wybrałem ze względu na koncepcje w nim użyte.

Nie mamy tutaj metod typu SetUp lub TearDown, każdy test stanowi odrębny element i jest niezależnie inicjalizowany.

Jak zacząć pisać testy z użyciem xUnit – Wprowadzenie

    public class DataServiceTests
    {
        private readonly IDataService service;

        [Fact]
        public async Task CanGetProblemByDateAsync()
        {
            await Task.Run(() => throw new NotImplementedException());
        }

        [Fact]
        public async Task CanGetDailyIdeasByDateAsync()
        {
            await Task.Run(() => throw new NotImplementedException());
        }

Jest to fragment klasy do testów serwisu pobierającego dane z internetu. Ale jak to wszystko odpalić i skonfigurować?

W 10Things do testów Core używam biblioteki .Net Standard w wersji 1.4
Jak zacząć pisać testy z użyciem xUnit

Kolejnym krokiem był import pakietu NuGet

Install-Package xunit

Teraz możemy zająć się napisaniem naszego pierwszego testu

public class SimpleUnitTest
{
 [Fact]
 public async Task PositiveUnitTest()
 {
   await Task.Run(() => Assert.True(true));
 }
 
 [Fact]
 public async Task NegativeUnitTest()
 {
   await Task.Run(() => throw new Exception("boom"));
 } 
}

Jest to nasz pierwszy bardzo prosty test w xUnit. No dobra ale jak to uruchomić?

Tutaj z pomocą przychodzą nam xUnit Runners, a dokładniej

  • xunit.runner.visualstudio – odpowiadający za uruchamianie testów w Visual Studio
  • xunit.runner.devices – odpowiadający za uruchamianie testów na urządzeniu lub emulatorze

A więc tworzymy nowy pusty projekt Xamarin Android i importujemy pakiet NuGet xunit.runner.devices

Install-Package xunit.runner.devices

Uwaga jest problem z tym pakietem przynajmniej na mojej maszynie, a mianowicie musiałem ręcznie zaimportować pakiet NuGet xunit.assert

Install-Package xunit.assert

Następnym krokiem jest nadpisanie zawartości klasy MainActivity treścią z pliku MainActivity.cs.txt. Finalnie powinno to wyglądać następująco

using Android.App;
using Android.OS;
using TenThings.Core.Tests.PageModels;
using TenThings.Core.Tests.Services;
using Xunit.Runners.UI;
using Xunit.Sdk;

namespace TenThings.Droid.TestsRunner
{
    [Activity(Label = "xUnit Android Runner", MainLauncher = true, Theme = "@android:style/Theme.Material.Light")]
    public class MainActivity : RunnerActivity
    {

        protected override void OnCreate(Bundle bundle)
        {
            // tests can be inside the main assembly
            AddTestAssembly(typeof(DataServiceTests).Assembly);

            AddExecutionAssembly(typeof(ExtensibilityPointFactory).Assembly);
            // or in any reference assemblies			

            //AddTestAssembly(typeof(PortableTests).Assembly);
            // or in any assembly that you load (since JIT is available)

#if false
			// you can use the default or set your own custom writer (e.g. save to web site and tweet it 😉
			Writer = new TcpTextWriter ("10.0.1.2", 16384);
			// start running the test suites as soon as the application is loaded
			AutoStart = true;
			// crash the application (to ensure it's ended) and return to springboard
			TerminateAfterExecution = true;
#endif
            // you cannot add more assemblies once calling base
            base.OnCreate(bundle);
        }
    }
}

Ważnym elementem jest tutaj metoda

AddTestAssembly

odpowiada ona za załadowanie naszych testów.

Podsumowanie

Jak widzicie testy jednostkowe w aplikacjach pisanych w Xamarin Forms są bardzo dobrą praktyką. Umożliwiają one sprawdzenie w szybki sposób całej aplikacji. xUnit jest za to frameworkiem sprawdzonym w boju i jest używany przez team Microsoft np. w .Net Core.
A czy wy w swojej codziennej pracy używacie testów jednostkowych?

Podsumowanie tygodnia odc.3

Podsumowanie tygodnia odc.3

A więc mamy już piątek 24.03 więc czas na podsumowanie tygodnia odc.3. Za nami trzeci tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.3

Co się udało

  • Kupić samochód – tak odkładałem to w czasie, a w końcu wyszło tak, że kupiłem już teraz. Strasznie mnie to wytrąciło z moich torów\planów i teraz nie mogę się pozbierać.
  • Obrączki – Kolejny ważny punkt na liści, odebraliśmy wreszcie obrączki.

Co się nie udało

  • 10Things – Założony plan z podpięcie testów xUnit legł w gruzach. Patrz punkty powyżej.

Ciekawe linki tygodnia

Xamarin

Różne

Podsumowanie

Od najbliższego tygodnia wracam do gry i mam nadzieję, że uda mi się przyśpieszyć pracę nad projektem.

Podsumowanie tygodnia odc.2

Podsumowanie tygodnia odc.2

A więc mamy już piątek 17.03 więc czas na podsumowanie tygodnia odc.2. Za nami drugi tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.2

Co się udało

  • 10Things – prace nad projektem nabierają powoli tempa. Udało mi się zrobić nawigację i zacząłem podłączać testy jednostkowe xUnit.
  • Praca – chyba „przekopałem się” przez cały gąszcz zgłoszeń od klienta i opanowałem sytuację w projekcie.
  • Odpoczynek – znalazłem przyczynę ostatniego zmęczenia (brak lub niedobory snu). Czas na wdrożenie nowego planu tygodnia.

Co się nie udało

  • Praca – chciałem żeby projekt wyszedł lepiej ale nie zawsze się projekty udają :).

Ciekawe linki tygodnia

Xamarin

Architektura

Enterprise

10Things - Implementacja kontenera IoC

10Things – Implementacja kontenera IoC

Ciąg dalszy pracy na projektem 10Things. W dzisiejszym odcinku chciałbym opisać szczegóły implementacji kontenera IoC, oraz dalszy plan prac.

Implementacja kontenera IoC

W 10Things używam FreshMVVM, który ma zaimplementowany kontener IoC o nazwie FreshIoC. Pod spodem nie jest to nic innego jak TinyIoC ze zmienionymi namespace.

Jakie ma plus FreshIoC <-> TinyIoC?

  • Mały rozmiar – bibliotek FreshIoC waży tylko 42 Kb co czyni ją jedną z najlżejszych implementacji kontenera IoC
  • Prostota – robi tylko to co od niej oczekujemy, nie ma tutaj różnych „wodotrysków”
  • Szybkość – ze względu na rozmiar i prostotę jest bardzo szybki

Jakie ma minusy  FreshIoC < – > TinyIoC?

  • Wodotryski – brakuje w nim różnych zaawansowanych funkcjonalności kontenerów IoC

No dobra ale co sam autor twierdzi\pisze o tej bibliotece? Jako, że nie ma szczegółowego opisu FreshIoC będę się wspierał opisem TinyIoC.

Witaj TinyIoC

Welcome to TinyIoC – an easy to use, hassle free, Inversion of Control Container. TinyIoC has been designed to fulfil a single key requirement – to lower the „level of entry” for using an IoC container; both for small projects, and developers who are new to IoC who might be „scared” of the „big boys”!

To that end, TinyIoC attempts to stick to the following core principals:

  • Simplfied Inclusion – No assembly to reference, no binary to worry about, just a single cs file you can include in your project and you’re good to go. It even works with both Mono and MonoTouch for iPhone development!
  • Simplified Setup – With auto-resolving of concrete types and an „auto registration” option for interfaces setup is a piece of cake. It can be reduced to 0 lines for concrete types, or 1 line if you have any interface dependencies!
  • Simple, „Fluent” API – Just because it’s „Tiny”, doesn’t mean it has no features. A simple „fluent” API gives you access to the more advanced features, like specifying singleton/multi-instance, strong or weak references or forcing a particular constructor.

Tak autor określa funkcjonalność TinyIoC. Ale co nam po długich opisach, ahah i ochach nad biblioteką. Pora na porcję kodu jak tego w ogóle użyć.

Implementacja kontenera IoC. Mięcho, czyli Inversion Of Control po polsku

Mi osobiście bardziej podchodzi implementacja bez użycia Fluent API jak również wolę używać instancji jako Singleton.
Według Wiki Singleton to

Singleton – kreacyjny wzorzec projektowy, którego celem jest ograniczenie możliwości tworzenia obiektów danej klasy do jednej instancji oraz zapewnienie globalnego dostępu do stworzonego obiektu. Niekiedy wzorzec uogólnia się do przypadku wprowadzenia pewnej maksymalnej liczby obiektów, jakie mogą istnieć w systemie[1]. Niektórzy programiści uznają go za antywzorzec, ponieważ łamie zasady projektowania obiektowego, często bywa nadużywany[2] lub sprowadza się do stworzenia obiektowego zamiennika dla zmiennej globalnej[3][4].

Prosta rejestracja interfejsu w kontenerze

FreshIOC.Container.Register<IDataService, MockDataService); //As Singleton
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance); //As Singleton

Można użyć również Fluent API do rejestracji

FreshIOC.Container.Register<IDataService, MockDataService>().AsSingleton();
FreshIOC.Container.Register<IUserDialogs>(UserDialogs.Instance).AsMultiInstance();

Wstrzykiwanie zależności z użyciem konstruktora i nie tylko

W 10Things używam wstrzykiwania zależności za pomocą konstruktora co według mnie jest dobrą praktyką programistyczną. Znacznie lepszą niż użycie słówka Resolve.

Przykładem na użycie może być

public class MainViewPageModel
{
readonly IDataService dataService;
readonly IUserDialogs userDialogs;

public MainViewPageModel(IDataService dataService, IUserDialogs userDialogs)
{
this.dataService = dataService;
this.userDialogs = userDialogs;
}
}

Można to również zaimplementować używając słówka Resolve.

public class MainViewPageModel
{
readonly IDataService dataService;
readonly IUserDialogs userDialogs;

public MainViewPageModel()
{
this.dataService = FreshIOC.container.Resolve<IDataService>();
this.userDialogs = FreshIOC.container.Resolve<IUserDialogs>();
}
}

Jak widzicie użycie kontenera IoC nie musi być skomplikowane i trudne. Można to zrobić dużo prościej, przyjemniej. Podsumowując kontenerów Inversion Of Control jest tyle co grzybów po deszczu i każdy może znaleźć coś dla siebie. Ja wolę używać czegoś co jest lekkie i ma to co jest mi obecnie potrzebne.

10Things – co dalej

Będę rozwijał kolejne funkcjonalości aplikacji. Obecnie w planach mam dodanie obsługi menu (master detail), oraz stworzenie kontrolki kalendarza from scratch lub użycie gotowej. Chociaż wszystko wyjdzie w trakcie pracy.

Podsumowanie tygodnia

Podsumowanie tygodnia odc.1

A więc mamy już piątek 10.03 więc czas na podsumowanie tygodnia. Za nami pierwszy tydzień zmagań w Daj Się Poznać jak i również premiera Visual Studio 2017.

Poniżej garść moich osiągnięć i porażek, oraz co wydało mi się interesujące w minionym tygodniu.

Co się udało

  • 10Things – ruszyłem wreszcie z projektem i zacząłem implementację MVVM, oraz pierwszych stron
  • Uporałem się w pracy z dość „trudnym” tematem 🙂
  • Mój super tajny projekt „prezentu” na urodziny idzie zgodnie z planem

Co się nie udało

  • Ten tydzień był pasmem porażek ale wyniosłem z nich sporo wiedzy. Pamiętajcie, że można się zawsze czegoś nauczyć na swoich błędach
  • Nie udało mi się utrzymać mojego planu tygodnia
  • Nie udało mi się pisać na blog-a tak często jakbym chciał

Ciekawe linki tygodnia

GitHub

Xamarin

Różne i różniste

10Things nawigacja

10Things nawigacja – implementacja w mobile

A więc mamy kolejny tydzień konkursu, plan jaki sobie założyłem to implementacja nawigacji w 10Things. Jako, że aplikacja będzie korzystać z FreshMVVM dlatego też zacząłem zgłębiać tajniki nawigacji tego framework-a.

FreshMVVM daje nam 3 możliwe opcje nawigacji z pudełka „Basic navigation”, „Tabbed navigation” i „Master Detail navigation”.

Postaram się pokrótce przedstawić każdą z opcji, oraz jak ich użyć w aplikacji.

Jak zaimplementować – basic navigation

Jest to najprostsza i najczęściej spotykana forma nawigacji page-by-page. Zasada jej działania jest oparta na stosie FIFO. W implementacji jest ona bardzo prosta wystarczy zainicjować instancję FreshNavigationContainer.

Przykład

var page = FeshPageModelResolver.ResolvePageModel&lt;MainViewPageModel&gt;();
var navContaincer = new FreshNavigationContainer(page);
MainPage = navContainer;

Jak zaimplementować – master detail navigation

Jest to rodzaj nawigacji często spotykany w postaci szerokiej maści menu i nawigacjach typu rodzic dziecko. Pod maską do obsługi używa Dictionary<string, Page> do przechowania instancji PageModels.

Przykład

var navContainer = new FreshMasterDetailNavigationContainer();
navContainer.Init("Menu");
navContainer.AddPage&lt;MainViewPageModel&gt;("Ideas", null);
navContainer.AddPage&lt;SettingsViewPageModel&gt;("Settings", null);
MainPage = navContainer;

Jak zaimplementować – tabbed navigation

Tabbed navigation jest kolejnym często spotykanym rodzajem nawigacji w aplikacjach mobilnych. W Android jest to pasek zakładek wyświetlany na górze, natomiast w iOS pojawia się on na dole. Implementacja i użycie jest bardzo proste wystarczy utworzyć instancję FreshTabbedNavigationContainer.

Przykład

var navContainer = new FreshTabbedNavigationContainer();
navContainer.AddTab&lt;MainViewPageModel&gt;("Ideas", null);
navContainer.AddTab&lt;SettingsViewPageModel&gt;("Settings", null);
MainPage = navContainer;

Co dalej?

FreshMVVM daje nam dostęp do prostego API dzięki, któremu można w łatwy sposób zaimplementować niestandardową nawigację dziedzicząc po interfejsie IFreshNavigationService.

Przykład

public class CustomNavigationContainer : Xamarin.Forms.MasterDetailPage, IFreshNavigationService
{
....
}

var navContainer = new CustomNavigationContainer();
navContainer.AddPage&lt;MainViewPageModel&gt;("Ideas");
navContainer.AddPage&lt;SettingsViewPageModel&gt;("Settings");
MainPage = navContainer;

Podsumowanie

Jak widzicie implementacja nawigacji nie musi być wcale taka trudna bo można to zrobić lekko łatwo i przyjemnie. Niekoniecznie w takiej kolejności. Na chwilę obecną FreshMVVM wysunął się mocno na prowadzenie względem innych framework MVVM.

Ma on wiele zalet, a przede wszystkim jest bardzo lekki ok. 60kb.

Czy wy macie jakieś swoje ulubione framework MVVM? Jaka funkcjonalność jest dla was najfajniejsza?

Czym jest 10Things

Czym jest 10Things? I pierwszy commit

01.03.2017 to ważna data. Tego dnia rozpoczął się konkurs „Daj Się Poznać 2017” i powstał projekt 10Things. O samym konkursie nie będę się już rozpisywał oraz o tym czemu po co na co.

Wydażyła się również inna ważna rzecz, czyli pierwszy commit na GitHub w projekcie 10Things.

Chciałbym natomiast opisać trochę czym jest 10Things, czyli mój projekt, oraz jakich technologii chciałbym użyć.

Czym jest 10Things

10Things to aplikacja mobilna mająca za zadania stymulowanie naszego mózgu :). Dokładniej chce stworzyć produkt do rozwoju naszej kreatywności.

Cała idea jest opisana w książce „Become Idea Machine„. Sam pomysł na napisanie akurat takiej aplikacji został trochę zainspirowany przez Mirka Brunejko (za co mu wielkie dzięki).

Zasada działania samej aplikacji jest bardzo prosta. Każdego dnia będziemy dostawać jakiś losowy problem do „obróbki” na podstawie, którego będziemy wymyślać 10 pomysłów na jego rozwiązanie. Problemy mogą być abstrakcyjne np. „Jak rozwiązać problem głodu na świecie” lub trochę bardziej przyziemne np. „Jak wystartować działalność gospodarczą online w Czechach”.

Ale żeby nie było zbyt prosto to na każdych z tych problemów będziemy musieli wymyślić 10 pomysłów i dodatkowo będziemy mieli liczony czas.

Każdy dzień będziemy mogli później analizować w widoku kalendarza jak i w widoku statystyk. Na początku będzie ciężko ale później powinno być już tylko lepiej.

Rezultat jaki można osiągnąć po stosowaniu takich zabiegów to bardzo mocno rozwinięta pomysłowość.

Skąd się biorą problemy

No dobra dobra Maćku ale skąd się biorą te problem?

Będą je tworzyć ludzie.

Do tego celu powstanie strona przy pomocy, której ludzie będą mogli dodawać swoje pomysły na problem :). Trochę dziwnie to brzmi ale….cóż.

Będzie ona również służyć do głosowania na najlepsze pomysły.

Technologia

To co programiści lubią najbardziej technologia i gadżety :).

Jako, że jest to aplikacja mająca działać na wielu platformach będzie napisana w Xamarin.Forms. Platformami na które będzie dostępna to iOS i Android (nie koniecznie w tej kolejności) na razie nie planuje wersji na Windows.

Na część serwerową pomysł mam następujący

  • NoSQL prawdopodobnie wybór padnie na DocumentDB
  • React jako, że jest jednym z niewielu JS framework, które lubię
  • Docker jako, że od dawna mnie ciągnie w tą stronę. Tylko pytanie czy będzie mi faktycznie potrzebny

Podsumowując plany są duże i ambitne. Teraz pozostaje zakasać rękawy i jak mówi Gary Vaynerchuk

more more more

Lub bardziej po polsku i moja wersja

robić robić robić