2010-11-16 16 views
21

(Estoy usando Python 2.6 y nose.)Python: ¿Cómo puedo crear archivos temporales en mi banco de pruebas?

Estoy escribiendo pruebas para mi aplicación Python. Quiero una prueba para abrir un nuevo archivo, cerrarlo y luego eliminarlo. Naturalmente, prefiero que esto ocurra dentro de un directorio temporal, porque no quiero trash el sistema de archivos del usuario. Y, debe ser cross-OS.

¿Cómo lo hago?

Respuesta

12

Consulte el módulo tempfile en la biblioteca estándar, debería ser todo lo que necesita.

25

Fwiw usando py.test puede escribir:

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

Cada función de prueba utilizando el "tmpdir" argumento de la función recibirá un directorio vacío y limpio, creado como un subdirectorio de "/ tmp/PYtest-NUM "(linux, win32 tiene una ruta diferente) donde NUM se incrementa para cada ejecución de prueba. Los últimos tres directorios se mantienen para facilitar la inspección y los más antiguos se eliminan automáticamente. También puede establecer el directorio temp básico con py.test --basetemp=mytmpdir.

El objeto es un objeto tmpdir py.path.local que también se puede utilizar como esto:

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

Pero también es bien para simplemente convertirlo en un camino "cadena":

tmpdir = str(tmpdir) 
+0

¿Se puede utilizar 'tmpdir' funcarg con los métodos setup/teardown xUnit en py.test? Por ejemplo, cambiar de 'def setup_method (self, method)' a 'def setup_method (self, method, tmpdir)'? – KomodoDave

+0

tmpdir se puede usar si decora su método de configuración con '' @ pytest.fixture (autouse = True) '', en cuyo caso '' setup_method'' puede recibir accesorios como accesorios normales de Pytest. Consulte los documentos de los dispositivos para conocer el significado del dispositivo de autouso. – hpk42

4

En lugar de usar tempfile directamente, sugiero usar un contenedor de administrador de contexto para ello - el gestor de contexto se encarga de eliminar el directorio en todos los casos (éxito/error/excepción), básicamente sin texto repetitivo.

Así es cómo se puede utilizar:

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... 

He estado usando una versión de cosecha propia (la aplicación es bastante corto - menos de 20 líneas) hasta el punto, cuando tenía que usar en alguna parte else también, entonces miré a mi alrededor si hay un paquete listo para instalar, y efectivamente está: tempdir

+0

tempdir no está en lib estándar: '' 'ImportError: ¡Ningún módulo llamado tempdir''' – dashesy

+0

el paquete no puede ser encontrado por pip! 'pip3 search tempdir' no muestra nada. – kap

+0

Lo tengo al intentarlo: AttributeError: __exit__ –

Cuestiones relacionadas