È possibile che i metodi di installazione e rimozione vengano eseguiti solo per le unittests specifiche?

3

Al momento ho una classe di test con un metodo setUp per la creazione di un file temporaneo e un metodo tearDown per l'eliminazione di un file temporaneo.

Tuttavia, solo alcuni dei metodi test_ in quella classe richiedono questa funzionalità.

È possibile ignorare quei 2 metodi per i casi di test che non lo richiedono o chiamare solo quei 2 metodi per i casi di test che lo richiedono?

Sembra un po '"sbagliato" chiamare questi 2 metodi per ogni test anche se il file temporaneo non viene utilizzato in ciascuno di essi.

    
posta Cybran 13.03.2014 - 12:36
fonte

3 risposte

2

It feels a bit 'wrong' to call these 2 methods for every test even if the temp file is not getting used in each one.

Quindi il codice sarà più semplice quando si lascia il file temporaneo creato e cancellato in tutti i casi? E immagino che il successo della performance sia trascurabile? Quindi quello che stai provando è solo una forma di ottimizzazione prematura . Non farlo (almeno, non fino a quando la differenza di rendimento non ha un impatto ragionevole sul tuo flusso di lavoro).

    
risposta data 13.03.2014 - 12:49
fonte
11

Metti questi test specifici in una nuova classe TestCase :

class TestsWithTemporaryFile(TestCase):
    def setUp(self):
         # set up temporary file

    def tearDown(self):
         # clean up temporary file

    def test_foo(self):
         # ...

    def test_bar(self):
         # ...


class TestsWithoutTemporaryFile(TestCase):
    def test_spam(self):
         # ...

    def test_eggs(self):
         # ...

Il test runner troverà entrambi i casi di test; niente dice che devi mettere tutti i tuoi test in un TestCase .

    
risposta data 13.03.2014 - 12:40
fonte
1

La soluzione di Martijn Pieters di dividere i test per classe non sempre funziona per me perché ho diviso i test in base a criteri diversi da quello di setUp e tearDown di cui hanno bisogno.

Quindi per questo tipo di situazione generalmente utilizzo un gestore di contesto come questo:

import contextlib
@contextlib.contextmanager
def temp_dir():
    tmpdir = tempfile.mkdtemp(dir="whatever")
    try:
        yield tmpdir
    finally:
        shutil.rmtree(tmpdir)

E poi usalo dove mi serve:

def test_whatever(self):
    with temp_dir() as whatever:
        something_or_other() 

Creo una directory temporanea in cui inserire tutti i miei file temporanei. In questo modo la directory ottiene un nome casuale ma i file in esso hanno nomi costanti. Trovo più facile da gestire se ho bisogno di eseguire diagnosi sui file temporanei. Ho solo bisogno di ottenere il nome della directory temporanea invece di dover calcolare il nome di più file.

    
risposta data 27.03.2014 - 01:59
fonte

Leggi altre domande sui tag