2010-09-16 25 views
2

Je veux écrire quelques tests pour un extracteur de fonctionnalités python MFCC pour courir avec nosetest. En plus de certains tests de niveau inférieur, j'aimerais aussi pouvoir stocker certains fichiers d'entrée standard et de sortie attendue avec les tests unitaires.Comment puis-je stocker des données de test pour nosetests python?

Actuellement, nous codons en dur les chemins d'accès aux fichiers sur nos serveurs, mais je préférerais que les fichiers de test (input et expected-output) soient quelque part dans le référentiel de code afin qu'ils puissent être conservés contrôle à côté du code de test. Le problème que j'ai est que je ne suis pas sûr où le meilleur endroit pour mettre les fichiers de test serait, et comment savoir ce que ce chemin est quand nosetest appelle chaque fonction de test. En ce moment je pense à stocker les données de test dans le même dossier que les tests et en utilisant __file__ pour savoir où cela se passe (cela fonctionnerait-il?), Mais je suis ouvert à d'autres suggestions.

Répondre

4

Je pense qu'utiliser __file__ pour savoir où se trouve le test et stocker des données à côté de celui-ci est une bonne idée. Je fais de même pour certains tests que j'écris.

Ce:

os.path.dirname(os.path.abspath(__file__)) 

est probablement le meilleur que vous allez obtenir, et ce n'est pas mal. :-)

0

Basé sur l'idée d'utiliser __file__, peut-être que vous pourriez utiliser un module pour aider à la construction du chemin. Vous pouvez trouver tous les fichiers contenus dans le répertoire du module, rassembler leur nom et leur chemin dans un dictionnaire pour une utilisation ultérieure.

Créez un module accessible à vos tests, à savoir un répertoire en plus de votre test, tel que testData, dans lequel vous pouvez placer vos fichiers de données. Dans le __init__.py de ce module, insérez le code suivant.

import os 
from os.path import join,dirname,abspath 
testDataFiles = dict() 
baseDir = dirname(abspath(__file__)) + os.path.sep 
for root, dirs, files in os.walk(baseDir): 
    localDataFiles = [(join(root.replace(baseDir,""),name), join(root,name)) for name in files] 
    testDataFiles.update(dict(localDataFiles)) 

En supposant que vous avez appelé votre module testData et il contient un fichier appelé data.txt vous pouvez ensuite utiliser la construction suivante dans votre test pour obtenir le chemin d'accès au fichier. aFileOperation est supposée être une fonction qui prend un chemin de paramètre

import unittest 
from testData import testDataFiles 

class ATestCase(unittest.TestCase): 
    def test_Something(self): 
     self.assertEqual(0, aFileOperation(testDataFiles['data.txt']) 

Il vous permettra également d'utiliser des sous-répertoires tels que

def test_SomethingInASubDir(self): 
     self.assertEqual(0, aFileOperation(testDataFiles['subdir\\data.txt'])