【问题标题】:How to load data from a file, for a unit test, in python?如何在 python 中从文件中加载数据以进行单元测试?
【发布时间】:2011-11-08 08:34:27
【问题描述】:

我编写了一个专门的 HTML 解析器,我想用我下载的几个示例网页对其进行单元测试。

在 Java 中,我使用类资源将数据加载到单元测试中,而不必依赖它们位于文件系统上的特定路径中。有没有办法在 Python 中做到这一点?

我找到了doctest.testfile() 函数,但这似乎是特定于文档测试的。我只想获得一个文件句柄,指向一个特定的 HTML 文件,它是相对于当前模块的。

提前感谢您的任何建议!

【问题讨论】:

    标签: python unit-testing file-io


    【解决方案1】:

    要从 unittest 中的文件加载数据,如果 testdata 与 unittests 位于同一目录中,则一种解决方案:

    TESTDATA_FILENAME = os.path.join(os.path.dirname(__file__), 'testdata.html')
    
    
    class MyTest(unittest.TestCase)
    
       def setUp(self):
           self.testdata = open(TESTDATA_FILENAME).read()
    
       def test_something(self):
           ....
    

    【讨论】:

    • 使用'new' python pathlib这个命令变成:TEST_FILE = pathlib.Path(__file__).parent.joinpath("testdata.html")然后TEST_FILE.open()。请记住import pathlib 并请注意@LeilaHC 答案中的建议以再次正确关闭测试文件,例如在 tearDown 方法中。
    • pkg_resourcessetuptools自带的工具。如果安装了一个包,即使只有pip install -e./setup.py develop,那么pkg_resources只要知道__name__就可以找到资源文件。
    【解决方案2】:

    这是基于 Ferran 的回答,但它会在 MyTest.tearDown() 期间关闭文件以避免出现“资源警告:未关闭的文件”:

    TESTDATA_FILENAME = os.path.join(os.path.dirname(__file__), 'testdata.html')
    
    
    class MyTest(unittest.TestCase)
    
       def setUp(self):
           self.testfile = open(TESTDATA_FILENAME)
           self.testdata = self.testfile.read()
    
       def tearDown(self):
           self.testfile.close()
    
       def test_something(self):
           ....
    

    【讨论】:

    • 为了可见性,最好在添加后编辑 Ferran 的答案。
    【解决方案3】:

    您还可以使用 StringIO 或 cStringIO 将包含文件内容的字符串模拟为文件。

    【讨论】:

    • 是的,我想到了,但这需要我将所有 HTML 作为字符串放入 python 文件中,我不喜欢它,因为它的长度超过 3k 行
    【解决方案4】:

    我猜你的任务归结为here 获取当前文件的内容。然后通过指向您的 HTML 文件和 open 的路径扩展该路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多