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?

Jedna myśl nt. „10Things – Jak zacząć pisać testy z użyciem xUnit

  1. Pingback: dotnetomaniak.pl

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *