Approval test for your public API

Approval test for your public API
Approval test for your public API

Vyvíjate .NET knižncicu a chcete mať istotu, že verejné API vašej knižnice je stále konzistentné a verziované správne?
Ako kontrolujete či zmeny nespôsobili zmenu vo verejnom API vašej knižnice?

Ja som na to vyskúšal kombinánciu knižnie
PublicApiGenerator a approval testov (v mojom prípade Verify).
Táto kombinácia mi zaručí, že ak sa zmení verejné API mojej knižnice, tak sa o tom dozviem a som nútený zamyslieť sa:

  • či je táto zmena v súlade s víziou knižnice
  • či nová public vec neznamená, že sa o ňu budem musieť starať (tak či tak budem 😊)
  • či je zmena správne zdokumentovaná
  • či je správne zvolená verzia knižnice (nenastala breaking change?)
  • ...

Majme jednoduchú knižnicu, ktorá obsahuje jednu triedu Calculator s jednou metódou Add:

public class Calculator
{
    public int Add(int a, int b) => a + b;
}

Do testovacieho projektu si pridajme PublicApiGenerator a Verify (u mňa je to Verify.XUnit):

dotnet add package PublicApiGenerator
dotnet add package Verify.Xunit

A napíšme test, ktorý zistí, či sa verejné API knižnice nezmenilo:

public class ApiVersionChangeTest
{
    [Fact]
    public Task ApproveApiVersion()
    {
        var publicApi = typeof(Calculator)
            .Assembly
            .GeneratePublicApi(); // 👈 Generate Public API string

        return Verify(publicApi); // 👈 Verify public API
    }
}

Keď pridáme novú metódu Subtract do Calculator triedy:

public class Calculator
{
    public int Add(int a, int b) => a + b;
    public int Subtract(int a, int b) => a - b;
}

Test zlyhá a my uvidíme, že sa zmenilo verejné API:

 ········public·Calculator()·{·}
 ········public·int·Add(int·a,·int·b)
+········public·int·Subtract(int·a,·int·b)·{·}