Le persone usano i test unitari per formalizzare ipotesi nel codice?

6

Una delle cose con cui faccio fatica quando i test unitari stanno decidendo quali comportamenti effettivamente testare. Penso che parte della mia lotta derivi dal modo in cui la maggior parte delle esercitazioni di test di unità non utilizzano buoni esempi di cose che si vorrebbe realmente testare nella vita reale. Ad esempio, il tutorial che sto guardando ora ha un test sostanzialmente simile a questo:

[Test]
public void TestQuizIsInitializedCorrectly() {
  var question = QuizQuestion() { 
      Question = "What is your favorite color?",
      Answer = "Blue, no yelloooowwww........" }

  var game = new Game(new List<QuizQuestion>(new[] { question }));
  Assert.AreEqual(1, game.Questions.Count);
}

Qual è il punto di questo test? Per verificare che quando si inserisce un oggetto in una lista in C #, la Lista abbia ancora solo 1 oggetto? E 'sciocco e potrei passare un milione di anni a scrivere test unitari che convalidano cose semplici come mettere un oggetto in una lista e convalidare il conteggio delle liste è 1. Non finirei mai la mia app. Questi sono solo dei brutti esempi di cosa testare in modo che possiamo concentrarci su come testare nel tutorial?

Oppure le persone scrivono davvero test come questo? Forse test come questo non stanno testando il tuo codice, ma stanno formalizzando un'ipotesi su come ci aspettiamo che le persone usino la classe Game? Forse l'esempio precedente potrebbe essere scritto non tanto per verificare che la domanda sia stata inizializzata con successo nella Lista, ma piuttosto per formalizzare l'assunto che la classe Game può essere passata solo in domande, non può aggiungere domande di default. Potrei sapere che non lo sta facendo ora, ma metterlo in un test di unità lo rende così sappiamo subito se qualche sviluppatore futuro cambia la classe Game per invalidare tale ipotesi.

Si tratta di un caso di uso comune nei test unitari? Scrivere i test non tanto per testare il codice che è stato scritto, ma per formalizzare le ipotesi per la protezione da modifiche future?

    
posta lecrank 15.12.2016 - 14:19
fonte

3 risposte

9

To validate that when you put one object into a List in C#, that the List still has only 1 object?

No, non asserisce mai alcuna proprietà dell'elenco creato.

Verifica che

  • Il costruttore di Gioco che accetta un elenco di QuizQuestions funziona: non genera un'eccezione o un arresto anomalo e genera una partita con 1 domanda.
  • È possibile accedere al numero di domande di un gioco come game.Questions.Count

E sì, le persone scrivono test del genere.

    
risposta data 15.12.2016 - 14:25
fonte
1

"Una delle cose con cui faccio fatica quando i test unitari stanno decidendo quali comportamenti effettivamente testare"

Questo è il nocciolo del problema - dovrebbe essere chiaro nella tua mente perché stai testando. Incerto? Bene, ci sono un certo numero di approcci / temi comuni (N.B. non esaustivi):

Comportamento

Vuoi dimostrare che il codice fa quello che pensi che faccia. Nel tuo esempio, sì - vorresti verificare che l'aggiunta a una lista vuota produca un singolo membro. Tu (o qualcun altro) potresti averlo codificato per ottenere qualcosa in modo che sia un test perfettamente valido.

Copertura

Potresti usare i test per assicurarti che tutto il codice (o una proporzione decente) sia stato eseguito almeno una volta.

Requisiti

Potresti avere un elenco di regole aziendali specifiche che devi soddisfare. È quindi possibile scrivere test in uno stile Given ... When ... Then per dimostrare che sono soddisfatti. Se sei interessato a saperne di più su questo approccio, guarda a BDD che sposa TDD con DDHO IMHO.

Automazione

Potresti avere un gran numero di scenari di dati che vuoi coprire. I test automatici ti consentono di farlo. Alcuni framework di test unitari come Nunit ti permettono di impostare valori, intervalli e combinazioni casuali.

    
risposta data 15.12.2016 - 15:22
fonte
0

Penso che sia necessario separare il test di accettazione dai test unitari.

Un test di accettazione sarebbe guidato da ciò che il proprietario dell'app desidera. Nel tuo esempio di gioco, non sappiamo cosa sia esattamente perché è stato astratto nella lista delle domande con solo una domanda. Ti potrebbe essere chiesto di costruire un sito web che visualizza una "domanda del giorno". La visualizzazione di una sola domanda dovrebbe superare questo test.

Il proprietario / cliente / utente non dovrebbe dirti come effettivamente costruirlo. Puoi lavorare con un team di sviluppo che decide come farlo è mettere una domanda in un elenco di qualche tipo e assicurarti che ci sia solo un elemento. Questo è molto più ristretto. Potrebbero essere necessari diversi test unitari per verificare che i singoli pezzi del codice facciano ciò che intendete fare loro, e rimanere così, per completare il test di accettazione.

Può essere difficile per un libro o un esempio dirti come programmare o testare la tua applicazione. Potrebbe essere necessario trovare diverse risorse per imparare come:

  • crea un oggetto
  • inserisci un oggetto in un elenco
  • ottieni il conteggio degli elementi in un elenco
  • scrivi un test che confronta il conteggio con un altro valore

Spetta a te mettere tutto insieme.

    
risposta data 15.12.2016 - 14:44
fonte

Leggi altre domande sui tag