如何存储Python nosetests的测试数据?
我想为一个用Python写的MFCC特征提取器编写一些测试,准备和nosetest一起使用。除了基本的测试外,我还希望能把一些标准的输入和预期输出文件和单元测试一起存储。
目前我们是直接在代码里写死了服务器上文件的路径,但我更希望这些测试文件(包括输入和预期输出)能放在代码库里,这样就能和测试代码一起进行版本控制。
我现在遇到的问题是,不太确定把测试文件放在哪里比较合适,以及在nosetest调用每个测试函数时,怎么知道那个路径。目前我在考虑把测试数据放在和测试代码同一个文件夹里,然后用__file__
来找出那个路径(这样可行吗?),但我也愿意听听其他建议。
2 个回答
0
根据使用 __file__
的想法,你可以用一个模块来帮助构建路径。这样你就可以找到模块目录下的所有文件,把它们的名字和路径收集到一个字典里,以便后续使用。
创建一个可以被你的测试访问的模块,也就是说,除了你的测试文件之外,创建一个像 testData 这样的目录,把你的数据文件放在里面。在这个模块的 __init__.py
文件中,插入以下代码。
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))
假设你把模块命名为 testData
,并且它里面有一个叫 data.txt
的文件,那么你可以在测试中使用以下代码来获取这个文件的路径。这里的 aFileOperation
是一个假设的函数,它需要一个路径作为参数。
import unittest
from testData import testDataFiles
class ATestCase(unittest.TestCase):
def test_Something(self):
self.assertEqual( 0, aFileOperation(testDataFiles['data.txt'] )
这也允许你使用子目录,比如说
def test_SomethingInASubDir(self):
self.assertEqual( 0, aFileOperation(testDataFiles['subdir\\data.txt'] )
6
我觉得用 __file__
来找出测试文件的位置,并把数据存放在一起是个不错的主意。我在写一些测试的时候也这样做。
这个:
os.path.dirname(os.path.abspath(__file__))
可能是你能得到的最好的方法,这也不算差。:-)