如何存储Python nosetests的测试数据?

4 投票
2 回答
2411 浏览
提问于 2025-04-16 04:12

我想为一个用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__))

可能是你能得到的最好的方法,这也不算差。:-)

撰写回答