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

问题描述 投票:0回答:1

我有一个单元测试类,它正在测试txt文件中的内容。我在pytest中使用tmpdir固定装置。这是我目前的课程:

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

我想摆脱重复的代码,并每次使用我注释掉的灯具my_filepath传递相同的路径。当我尝试使用my_parser pytest固定装置时,出现错误,说:

ScopeMismatch: You tried to access the 'function' scoped fixture 'tmpdir' with a 'module' scoped request object, involved factories   
unit_tests\test_TicketCounter.py:12: 

所以您不能将pydir与tmpdir一起使用?是因为tmpdir是固定装置吗?关于如何切出重复的代码并使用函数或固定装置传递路径的任何想法?

python unit-testing file pytest fixtures
1个回答
0
投票

如错误消息所述,tmpdir是基于功能的灯具,例如它为每个测试创建一个新的临时目录,并在测试后将其删除。因此,您不能在模块作用域的夹具中使用它,该夹具只能在模块加载后实例化一次。如果可以这样做,则在第一次测试后将删除您的临时目录,并且在下一个测试中将无法访问它。

[在您当前的代码中,tmpdir灯具用作函数范围的灯具,因此将为每个测试创建一个新目录-通常需要使用该目录。如果删除模块范围,则可以使用您的灯具而不会出现问题:

@pytest.fixture
    def my_filepath(self, tmpdir):
    return tmpdir.mkdir("sub").join("testCurrentTicketCount.txt")

如果由于某种原因要在每个测试中使用same临时目录,则不能使用tmpdir灯具。在这种情况下,您可以创建自己的tmp目录,例如:

import os
import tempfile
import shutil

@pytest.fixture(scope="module")
def my_filepath(self):
    tmpdir = tempfile.mkdtemp()
    subdir = os.path.join(tmpdir, "sub")
    os.mkdir(subdir)
    yield os.path.join(subdir, "testCurrentTicketCount.txt")
    shutil.rmtree(tmpdir)
© www.soinside.com 2019 - 2024. All rights reserved.