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

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

[code lang=”csharp”]
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());
}
[/code]

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

[code lang=”csharp”]
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"));
}
}
[/code]

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

[code lang=”csharp”]
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);
}
}
}
[/code]

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?

Share