Come testare il codice di test per ottenere risultati diversi su piattaforme diverse

2

Ho notato alcuni codici duplicati in una base di codice su cui sto lavorando che ha aggiunto un nome file a un percorso di directory, quindi ho deciso di rifattorizzarlo nel suo metodo. L'applicazione su cui sto lavorando non è ancora ben testata; Ho appena installato i primi test di unità su di esso due giorni fa, quindi sono molto preoccupato di ottenere quanto più codice possibile da testare quando lo tocco.

Così ho iniziato a scrivere un test unitario come questo (pseudocodice):

Directory directory("a")
Expect(directory.prependPathToFilename("b")).toBeEqualTo("a/b")

Tuttavia, ho poi ricordato che l'applicazione è multipiattaforma. Così ho pensato a questo:

Directory directory("a")
String separator = "/" if (platform is *nix) else "\"
Expect(directory.prependPathToFilename("b")).toBeEqualTo("a" + separator + "b")

Ma mi sono ricordato che Roy Osherove dice nella sezione 7.1.2 ("Evitare la logica nei test") di The Art of Unit Testing (178):

If you have any of the following inside a test meethod, your test contains logic that should not be there:

  • switch, if, or else statements

  • foreach, for or while loops

A test that contains logic is usually testing more than one thing at a time, which isn't recommended, becauset he test is less readable and more fragile. But test logic also adds complexity that may contain a hidden bug.

Ora, non sembra che in questo caso sto testando più di una cosa alla volta. Questo sarebbe un caso di un blocco logico accettabile in un test? Esiste uno schema per testare in modo pulito comportamenti / risultati che attesi siano diversi su piattaforme diverse?

    
posta Kazark 29.03.2013 - 18:16
fonte

2 risposte

13

È contestato quanto sia religioso il test unitario - sicuramente c'è un qualche valore per i test anche se violano alcuni dei precetti dei Wise Elder di test (sicuramente più valore che non averli!).

Tuttavia, in questo caso non è necessario violare le regole se non si desidera. Nota che il tuo test sta testando solo uno dei possibili separatori, perché per definizione funziona solo su una piattaforma. Se rendi la routine di rilevamento della piattaforma discutibile, puoi scrivere diversi test e iniettarvi diverse pseudo-piattaforme. A ciascuno dei test non è quindi necessaria alcuna logica e si ottiene una copertura maggiore allo stesso tempo.

    
risposta data 29.03.2013 - 18:21
fonte
1

Per mantenere il tuo test dell'unità pulito e semplice, puoi estendere la libreria di test aggiungendo una nuova asserzione per i percorsi. Questa nuova asserzione sarebbe astratta dai diversi separatori di percorso. Il tuo test sembrerebbe quindi

Directory directory("a")
Expect(directory.prependPathToFilename("b")).toBeSamePathAs("a/b")

e - a seconda dell'implementazione - funzionano in modo identico quando si utilizza

Directory directory("a")
Expect(directory.prependPathToFilename("b")).toBeSamePathAs("a\b")
    
risposta data 29.03.2013 - 22:46
fonte

Leggi altre domande sui tag