Articoli di programmazione

3 piccole funzioni che ci aiutano a scrivere in modo uniforme i nostri test

Scrivere test chiari ed uniformi è cruciale per l'attività di un Team. Un buon modo è scriverli usando alcune funzioni di appoggio comuni a tutti gli sviluppatori.

given.png
Se non conosci BDD, ti consiglio di dare uno sguardo almeno alla pagina di Wikipedia che ne spiega molti aspetti: https://en.wikipedia.org/wiki/Behavior-driven_development
BDD ha influito molto anche su chi non ne fa uso, per primi i programmatori che usano TDD e che hanno apprezzato la potenza di "Given When Then" nei loro test.
Io stesso ho iniziato a implementare i test seguendo questo paradigma, perché è più facile iniziare a scrivere, è lineare proseguire ed è tutto più chiaro quando mesi dopo ti ritrovi a prendere in mano i test perché devi fixare qualcosa.

Dopo un po' che scrivevo i miei test con il nome Given_aNumber_When_theNumberIsOdd_Then_addOne ho capito che avrei potuto scrivere 3 funzioni per obbligarmi anche nel codice a seguire questo paradigma e soprattutto per rendere il codice uniforme in tutti i miei test.
Ho così scritto una semplice classe GivenWhenThenExtensions contenente i 3 famosi metodi Given When Then, da usare nei test. Ho riportato anche un esempio di utilizzo: per partire basta scrivere una stringa la descrizione del nostro scenario, successivamente si procede con l'implementazione dei metodi Given When Then a cascata.
Ecco di seguito di cosa si tratta:

public class Calculator
{
public int Add(int x, int y)
{
return x + y;
}
}

public static class GivenWhenThenExtensions
{
public static TRes Given(this string str, Func act)
{
return act();
}

public static TRes When(this T str, Func act)
{
return act(str);
}

public static void Then(this T input, Action act)
{
act(input);
}
}

[TestClass]
public class GivenWhenThen
{
[TestMethod]
public void GivenWhenThen_Example()
{
int expected = 5, x = 2, y = 3;

"Scenario 1 Description"
.Given(() => new Calculator())
.When(calculator => calculator.Add(x, y))
.Then(result => result.Should().Be.EqualTo(expected));
}
}


#TDD #BDD #csharp #testing #tips