====== xUnit.net Framework ======
**xUnit.net** je open-source testovací nástroj pro .NET aplikace (včetně .NET Core, 5/6/7/8+). Je navržen tak, aby podporoval moderní vývojové postupy, jako je [[it:sw:unit_testing#tdd|TDD]], a vynucoval čistý design testovacího kódu.
===== 1. Klíčové rozdíly oproti jiným frameworkům =====
xUnit přichází s architekturou, která se zbavuje historických nánosů a zbytečných atributů:
* **Izolace testů:** Pro každý jednotlivý test (metodu) se vytvoří **zcela nová instance** testovací třídy. To zaručuje, že testy jsou na sobě nezávislé a nesdílejí stav.
* **Žádné [SetUp] a [TearDown]:** Namísto speciálních atributů se používá standardní **konstruktor** (pro přípravu) a rozhraní **IDisposable** (pro úklid).
* **Žádné [TestFixture]:** Třída obsahující testy nemusí mít žádný speciální atribut, stačí, když jsou testovací metody veřejné.
---
===== 2. Základní stavební kameny: Fact a Theory =====
V xUnit rozlišujeme dva základní typy testovacích metod:
==== [Fact] ====
Představuje invariantní test – tedy takový, který je vždy pravdivý a nevyžaduje žádné parametry.
[Fact]
public void OvereniVypoctu_Vzdy_VraciSpravnyVysledek() {
// Arrange
var calc = new Calculator();
// Act
var result = calc.Add(10, 20);
// Assert
Assert.Equal(30, result);
}
==== [Theory] ====
Představuje test, který je pravdivý pro konkrétní sadu dat. Umožňuje spustit stejnou testovací logiku s různými vstupy.
[Theory]
[InlineData(1, 2, 3)]
[InlineData(-1, 1, 0)]
[InlineData(0, 0, 0)]
public void Sctiani_RuznaData_VraciOcekavanySoucet(int a, int b, int ocekavany) {
var calc = new Calculator();
var vysledek = calc.Add(a, b);
Assert.Equal(ocekavany, vysledek);
}
---
===== 3. Práce s Assertací =====
Třída `Assert` v xUnit poskytuje širokou škálu metod pro ověření výsledků:
^ Metoda ^ Účel ^
| `Assert.Equal(exp, act)` | Ověří rovnost hodnot. |
| `Assert.True(bool)` | Ověří, zda je výraz pravdivý. |
| `Assert.NotNull(obj)` | Ověří, že objekt není null. |
| `Assert.Throws(...)` | Ověří, že kód vyvolá konkrétní výjimku typu T. |
| `Assert.Contains(val, coll)` | Ověří, že kolekce nebo řetězec obsahuje danou hodnotu. |
---
===== 4. Sdílení kontextu (Fixtures) =====
Protože xUnit vytváří pro každý test novou instanci třídy, pro sdílení "drahých" prostředků (např. databázové spojení) používáme tzv. **Class Fixtures**:
1. Vytvoříte třídu (např. `DbFixture`), která se postará o inicializaci.
2. Testovací třída implementuje rozhraní `IClassFixture`.
3. xUnit vytvoří instanci `DbFixture` pouze jednou pro celou testovací třídu a předá ji do konstruktoru.
---
===== 5. Integrace a spouštění =====
Testy xUnit lze spouštět mnoha způsoby:
* **IDE:** Integrovaný Test Explorer ve Visual Studiu nebo Rideru.
* **CLI:** Pomocí příkazu `dotnet test`.
* **CI/CD:** Automatizované spouštění v rámci GitHub Actions, Azure DevOps nebo Jenkins.
----
//Související články://
* [[it:sw:unit_testing|Unit Testing a kvalita kódu]]
* [[it:sw:mocking|Mockování v .NET (Moq, NSubstitute)]]
* [[it:sw:solid|Principy SOLID]]
//Tagy: {{tag>programming dot-net testing xunit unit-test csharp}}//