2010-11-16 43 views
21

(J'utilise Python 2.6 et nose.)Python: Comment créer des fichiers temporaires dans ma suite de tests?

J'écris des tests pour mon application Python. Je veux un test pour ouvrir un nouveau fichier, fermez-le, puis supprimez-le. Naturellement, je préfère que cela se produise dans un répertoire temporaire, car je ne veux pas détruire le système de fichiers de l'utilisateur. Et, il doit être cross-OS.

Comment faire?

Répondre

12

Voir le module tempfile dans la bibliothèque standard - devrait être tout ce dont vous avez besoin.

25

FWIW utilisant py.test vous pouvez écrire:

def test_function(tmpdir): 
    # tmpdir is a unique-per-test-function invocation temporary directory 

Chaque fonction de test en utilisant l'argument de la fonction "tmpdir" va obtenir un répertoire vide propre, créé comme un sous-répertoire de «/tmp/pytest-NUM "(linux, win32 a un chemin différent) où NUM est augmenté pour chaque test. Les trois derniers répertoires sont conservés pour faciliter l'inspection et les plus anciens sont automatiquement supprimés. Vous pouvez également définir le répertoire temp de base avec py.test --basetemp=mytmpdir.

L'objet tmpdir est un objet py.path.local qui peut également utiliser comme ceci:

sub = tmpdir.mkdir("sub") 
sub.join("testfile.txt").write("content") 

Mais il est aussi très bien pour convertir juste un chemin « string »:

tmpdir = str(tmpdir) 
+0

Est-ce que funcarg peut être utilisé avec les méthodes setup/teardown xUnit dans py.test? Ainsi, par exemple passer de 'def setup_method (self, method)' à def setup_method (self, méthode, tmpdir) '? – KomodoDave

+0

tmpdir peut être utilisé si vous décorez votre méthode d'installation avec '' @ pytest.fixture (autouse = True) '', auquel cas '' setup_method'' peut recevoir des fixtures comme des fixtures de pyest normales. Voir les docs de l'appareil pour la signification de l'appareil autouse. – hpk42

4

Au lieu d'utiliser tempfile directement, je suggère d'utiliser un wrapper de gestionnaire de contexte pour cela - le gestionnaire de contextes s'occupe de supprimer le répertoire dans tous les cas (succès/échec/exception) avec pratiquement aucun passe-partout.

Voici comment il peut être utilisé:

from tempdir import TempDir 
... 

# in some test: 
with TempDir() as d: 
    temp_file_name = os.path.join(d.name, 'your_temp_file.name') 
    # create file... 
    # ... 
    # asserts... 

J'utilise une version développée à domicile (la mise en œuvre est assez court - moins de 20 lignes) jusqu'au point, quand je devais l'utiliser quelque part d'autre aussi, donc j'ai regardé autour s'il y a un paquet prêt à installer, et en effet il y a: tempdir

+0

tempdir n'est pas dans la lib standard: '' 'ImportError: aucun module nommé tempdir''' – dashesy

+0

le paquet ne peut pas être trouvé par pip! 'pip3 search tempdir' ne montre rien. – kap

+0

Je l'ai eu en l'essayant: AttributeError: __exit__ –