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.
真诚赞赏,手留余香
使用微信扫描二维码完成支付
comments powered by Disqus