Secondo me i test di integrazione sono i test più importanti, perché sono quelli che ti dicono se l'applicazione in realtà funziona quando è tutto messo insieme.
Tuttavia, hanno alcuni aspetti negativi
- richiedono un sistema in esecuzione con tutte le dipendenze da testare contro
- sono lenti da eseguire
- alcuni test sono necessariamente distruttivi e quindi non possono essere eseguiti contro ambienti live.
- tendono ad essere test di "livello superiore". ti diranno che c'è qualcosa che non va, ma non quello che è.
I test unitari non hanno questi aspetti negativi, puoi eseguire rapidamente centinaia di unit test su una macchina di sviluppo senza distribuire l'intera app.
Quindi non saltare i test unitari solo perché hai un test di integrazione e non saltare i test di integrazione perché hai dei test unitari.
Un trucco che puoi fare per salvare un po 'di codice è far sì che i tuoi test funzionino sia come unità sia come integrazione, consentendo loro di prendere in giro o di non prendere in giro le dipendenze a seconda di un input o di un'impostazione.
Ciò consente di eseguire rapidamente i test come test di unità per verificare il codice. Quindi come integrazione per verificare l'installazione e la distribuzione.
Modifica: esempio di come combinare integrazione e test unitari senza duplicazione del codice.
public class AuthServiceTests
{
[TestCase("api.myapp.com/auth", "databaseuser", true, Category="Integration")]
[TestCase("mock", "mockuser", true, Category="Unit")]
public void IsUserTest(string target, string username, bool expected)
{
//SetUp
if(target != "mock")
{
httpClient = new HttpClient(target);
}
else
{
httpClient = new MockHttpClient();
}
var authService = new AuthService(httpClient);
var actual = authService.IsUser(user);
//obvs this might fail if the databases changes in the integration version
//or the db isnt setup right, or the connection string in the api is wrong etc
//the mock one will only fail if the code has a bug of some kind, say it doesnt work with long usernames, or emoticons or something
Assert.AreEqual(expected, actual);
}
}