Python 如何在pytest.fixture中使用tmpdir?

Python 如何在pytest.fixture中使用tmpdir?,python,unit-testing,file,pytest,fixtures,Python,Unit Testing,File,Pytest,Fixtures,我有一个单元测试类,它测试txt文件中的内容。我将tmpdir夹具与pytest一起使用。这是我目前的课程: from objects.TicketCounter import TicketCounter from objects.ConfigReader import ConfigReader import os import pytest class TestTicketCounter(): # @pytest.fixture(scope="module")

我有一个单元测试类,它测试txt文件中的内容。我将tmpdir夹具与pytest一起使用。这是我目前的课程:

from objects.TicketCounter import TicketCounter
from objects.ConfigReader import ConfigReader
import os
import pytest
 
class TestTicketCounter():

    # @pytest.fixture(scope="module") #<---Could I use this instead of passing tmpdir each time?
    # def my_filepath(self, tmpdir):
    #     return tmpdir.mkdir("sub").join("testCurrentTicketCount.txt")

    def test_createNewTicketCountFile(self, tmpdir):
        x = tmpdir.mkdir("sub").join("testCurrentTicketCount.txt") #<----Repeated
        ticketCounter = TicketCounter(x)
        assert os.path.getsize(x) > 0

    def test_addOneTicketCounter(self, tmpdir):
        x = tmpdir.mkdir("sub").join("testCurrentTicketCount.txt") #<----Repeated
        ticketCounter = TicketCounter(x)
        beforeCount = int(ticketCounter.readTicketCountFromFile())
        ticketCounter.addOneTicketCounter()
        afterCount = int(ticketCounter.readTicketCountFromFile())
        assert beforeCount + 1 == afterCount

    def test_readTicketCountFromFile(self, tmpdir):
        x = tmpdir.mkdir("sub").join("testCurrentTicketCount.txt") #<----Repeated
        ticketCounter = TicketCounter(x)
        print(ticketCounter.readTicketCountFromFile())
        assert int(ticketCounter.readTicketCountFromFile()) >= 0
所以您不能将tmpdir与pytest夹具一起使用?是因为tmpdir是一个固定装置吗?
有没有想过如何删除重复的代码并使用函数或fixture来传递路径?

正如错误消息所说,tmpdir是一个基于函数的fixture,例如,它为每个测试创建一个新的temp dir,并在测试后将其删除。因此,您不能在模块范围的装置中使用它,该装置在模块加载后仅实例化一次。如果您可以这样做,您的temp dir将在第一次测试后被删除,并且您将无法在下一次测试中访问它

在您当前的代码中,tmpdir fixture用作函数范围的fixture,因此为每个测试创建一个新的目录——这是通常需要的。如果删除模块范围,则可以毫无问题地使用夹具:

@pytest.fixture def my_filepathself,tmpdir: 返回tmpdir.mkdirsub.jointTestCurrentTicketCount.txt 如果出于某种原因希望在每个测试中使用相同的temp dir,则不能使用tmpdir装置。在这种情况下,您可以创建自己的tmp目录,例如:

导入操作系统 导入临时文件 进口舒蒂尔 @pytest.fixturescope=模块 定义我的文件路径自身: tmpdir=tempfile.mkdtemp subdir=os.path.jointmpdir,sub os.mkdirsubdir 生成os.path.joinsubdir,testCurrentTicketCount.txt shutil.rmtreetmpdir
正如错误消息所说,tmpdir是一个基于函数的fixture,例如,它为每个测试创建一个新的temp dir,并在测试后删除它。因此,您不能在模块范围的装置中使用它,该装置在模块加载后仅实例化一次。如果您可以这样做,您的temp dir将在第一次测试后被删除,并且您将无法在下一次测试中访问它

在您当前的代码中,tmpdir fixture用作函数范围的fixture,因此为每个测试创建一个新的目录——这是通常需要的。如果删除模块范围,则可以毫无问题地使用夹具:

@pytest.fixture def my_filepathself,tmpdir: 返回tmpdir.mkdirsub.jointTestCurrentTicketCount.txt 如果出于某种原因希望在每个测试中使用相同的temp dir,则不能使用tmpdir装置。在这种情况下,您可以创建自己的tmp目录,例如:

导入操作系统 导入临时文件 进口舒蒂尔 @pytest.fixturescope=模块 定义我的文件路径自身: tmpdir=tempfile.mkdtemp subdir=os.path.jointmpdir,sub os.mkdirsubdir 生成os.path.joinsubdir,testCurrentTicketCount.txt shutil.rmtreetmpdir
非常感谢。这很有帮助!很高兴我能帮忙!非常感谢。这很有帮助!很高兴我能帮忙!
ScopeMismatch: You tried to access the 'function' scoped fixture 'tmpdir' with a 'module' scoped request object, involved factories   
unit_tests\test_TicketCounter.py:12: