【问题标题】:Relative paths in unittest python to run tests individually and as a wholeunittest python中的相对路径,用于单独和整体运行测试
【发布时间】:2021-10-02 08:11:20
【问题描述】:

已经有几个关于这个主题的问题得到了回答,但实际上并没有解决我的问题。

我正在使用 PyCharm 2021.2,我希望能够单独和整体运行单元测试。这很重要,因为如果我有很多测试并且只有一些测试失败,我通常会调试我的代码并且只想运行我失败的测试以查看我的调试是否成功。只有这样我才想重新运行所有测试。

我的设置如下:

所以,例如,我想:

  1. 右键单击文件夹tests 并运行该文件夹中的所有测试(在我的示例屏幕截图中,只有一个test_MyClass.py,但通常这里会有很多这样的测试)。
  2. 右键单击单个测试,例如test_MyClass.py,并自行运行。

这两种可能性通常都可以正常工作。但是,当我的单个测试使用一些相对路径时,例如,读取一些测试资产(在我的情况下从文件夹 containing_folder/tests/testassets),只有选项 1)有效。选项 2) 遇到FileNotFoundError: No such file or directory

重现此行为的代码是:

MyClass.py:

class MyClass:
    _content = None

    def set_content(self, content):
        self._content = content

    def get_content(self):
        return self._content

test_MyClass.py:

import unittest
import io
from ..MyClass import MyClass


class MyClassTests(unittest.TestCase):
    myClassInstance = None

    @classmethod
    def setUpClass(cls):
        cls.myClassInstance = MyClass()

    def get_file(self, use_case):
        path_to_file = "testassets/" + use_case + ".txt"
        with io.open(path_to_file, 'r', encoding="utf-8") as file:
            file = file.read()
            return file

    def test_uc_file1(self):
        file_content = self.get_file("uc_1")
        self.myClassInstance.set_content(file_content)
        self.assertEquals("test1", self.myClassInstance.get_content())

    def test_uc_file2(self):
        file_content = self.get_file("uc_2")
        self.myClassInstance.set_content(file_content)
        self.assertEquals("test2", self.myClassInstance.get_content())

似乎path_to_file = "testassets/" + use_case + ".txt" 仅在 1) 选项中用作相对路径,但在 2) 选项中不起作用。

如何以编程方式识别我在 PyCharm 中开始测试的选项 1) 或 2)?然后我必须为选项 2) 选择哪条路径?我尝试了../testassets../../testassets../../、、../,但没有一个适用于选项 2)。

【问题讨论】:

    标签: python unit-testing path pycharm


    【解决方案1】:

    好的,我找到了实现我想要的方法。

    1. 首先,我在导入时去掉了相对路径。而不是from ..MyClass import MyClass,我只使用from MyClass import MyClass
    2. 其次,我的方法setUpClassget_file 现在看起来像这样:
        @classmethod
        def setUpClass(cls):
            cls.path = os.path.normpath(os.path.abspath(__file__))  # requires import os
            if os.path.isfile(cls.path):
                cls.path = os.path.dirname(cls.path)
            cls.myClassInstance = MyClass()
    
        def get_file(self, use_case):
            path_to_file = self.path + "/testassets/" + use_case + ".txt"
            with io.open(path_to_file, 'r', encoding="utf-8") as file:
                file = file.read()
                return file
    

    关键是os.path.abspath(__file__) 如果我选择选项 1) 来启动所有测试,则返回 目录 containing_folder/tests 的根路径或 文件名 @987654328 @如果我选择选项 2) 开始单个测试。在 if 语句中

    if os.path.isfile(cls.path):
       cls.path = os.path.dirname(cls.path)
    

    我概括了这两种特殊情况以获取所有测试的根目录,并轻松找到与它们相关的测试资产。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      相关资源
      最近更新 更多