3 najważniejsze słowa w xUnit

Posted by Maciej Gos on Monday, April 24, 2017

TOC

Aplikacje stają się coraz bardziej skomplikowane, zawierają mnóstwo logiki biznesowej dlatego testy jednostkowe w naszych aplikacjach są ich ważnym aspektem. Dzisiaj chciałbym wam przedstawić 3 najważniejsze słowa w xUnit.

3 najważniejsze słowa w xUnit

Fact, Theory, Assert – Arrange, Act, Assert

Każdy test powinien mieć odpowiednią strukturę. Dlatego ja zawsze dziele je na etap inicjalizacji Arrange, etap wykonania Act i etap porównania wyników Assert.

Przykładowa metoda do testów może mieć następującą strukturę
[code lang=”csharp”]
public void TestMethod1()
{
//Arrange

//Act

//Assert
}
[/code]

Fact

Jest to podstawowy typ testu w xUnit. W porównaniu do innych framework-ów każdy test stanowi odrębną jednostkę. W każdym z nich należy zainicjalizować wymagane komponenty jak również zapewnić obsługę rollback.

Poniższy przykład ma na celu przetestowanie warstwy serwisu naszej aplikacji i mechanizmu pobierania danych na konkretną datę.

Metoda ta składa się z sekcji inicjalizacji Arrang, wykonania Act, oraz sprawdzenia warunku Assert.
[code lang=”csharp”]
[Fact]
public async void CanGetProblemForDate_20170415()
{
//Arrange
DateTime expected = new DateTime(2017, 04, 15);
DateTime actual = DateTime.Today;
IDataService service = new MockDataService();

//Act
Problem problem = await service.GetProblemByDateAsync(new DateTime(2017, 04, 15));
actual = problem.CreationDate;

//Assert
Assert.Equal(expected, actual);
}
[/code]

Theory

Co w sytuacji kiedy chcemy przetestować kolekcję przypadków testowych? Z pomocą przychodzi nam słówko Theory umożliwia ono nam dostarczenie parametrów wejściowych dla metody testowej.

Przykład użycia możecie zobaczyć na listingu poniżej.
[code lang=”csharp”]
[Theory]
[InlineData(“2017-04-15”)]
[InlineData(“2017-04-16”)]
[InlineData(“2017-04-17”)]
public async void CanGetDifferentProblemsForEachDayWhichIsNotNull(DateTime currentDate)
{
//Arrange
IDataService service = new MockDataService();

//Act
Problem problem = await service.GetProblemByDateAsync(currentDate);

//Assert
Assert.NotNull(problem);
}
[/code]

Jeżeli jest nam potrzebny bardziej zaawansowany sposób użycia Theory w którym przekazujemy nasz obiekt jako parametr wejściowy możemy użyć do tego klasy TheoryData.

Przykład użycia na poniższym listingu testuje nam dodawanie kolejnych TodoItem do naszej warstwy serwisu.
[code lang=”csharp”]
public class DataServiceTests
{
private static TodoItem[] todoItems = new TodoItem[]
{
new TodoItem { Id = Guid.NewGuid(), Name = “Buy a milk”, Done = false, DueDate = null},
new TodoItem { Id = Guid.NewGuid(), Name = “Buy a TV”, Done = false, DueDate = null},
new TodoItem { Id = Guid.NewGuid(), Name = “Buy a new iPhone”, Done = false, DueDate = DateTime.Today},
new TodoItem { Id = Guid.NewGuid(), Name = “Buy a pomodoro”, Done = false, DueDate = null},
new TodoItem { Id = Guid.NewGuid(), Name = “Buy a bread”, Done = false, DueDate = null}
};

public static TodoTheoryData TodoItemsData { get; } = new TodoTheoryData(todoItems);

[Theory]
[MemberData(“TodoItemsData”)]
public async void InStorageAreFiveItems(TodoItem item)
{
//Arrange
DataService service = new DataService();
await service.AddTodoItemAsync(item);

//Act
IEnumerable todoItems = await service.GetAllAsync();

//Assert
Assert.Equal(5, todoItems.Count());
}
}

public class TodoTheoryData : TheoryData
{
public TodoTheoryData(IEnumerable data)
{
foreach (T t1 in data)
{
Add(t1);
}
}
}
[/code]

Assert

Klasa Assert dostarcza nam implementację różnych metod wykorzystywanych do sprawdzania naszych wyników, oraz np. oczekiwanych wyjątków.

Podsumowanie

Jak widzicie w prosty sposób można testować aplikacje Xamarin.Forms z użyciem xUnit. Kolejny punkt na liście projektu 10Things to dodanie źródła danych offline z wykorzystaniem bazy SQLite lub Realm.

Tutaj pytanie do czytelników, która baza oferuje lepszy mechanizm synchronizacji offline-online.

Maciej Gos

真诚赞赏,手留余香

使用微信扫描二维码完成支付


comments powered by Disqus