我如何在 pytest.fixture 中使用 tmpdir?
How do I use tmpdir with my pytest.fixture?
我有一个单元测试 class 用于测试 txt 文件中的内容。我在 pytest 中使用 tmpdir 夹具。这是我现在的 class:
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 fixture 时,出现错误,提示:
ScopeMismatch: You tried to access the 'function' scoped fixture 'tmpdir' with a 'module' scoped request object, involved factories
unit_tests\test_TicketCounter.py:12:
所以您无法将 tmpdir 与 pytest 夹具一起使用?是因为 tmpdir 是固定装置吗?
关于如何删除重复代码并使用函数或夹具传递路径的任何想法?
如错误消息所述,tmpdir
是一个基于函数的夹具,例如它为每个测试创建一个新的临时目录,并在测试后删除它。因此,您不能在模块范围的固定装置中使用它,它在模块加载后仅实例化一次。如果你能做到这一点,你的临时目录将在第一次测试后被删除,你将无法在下一次测试中访问它。
在您当前的代码中,tmpdir
fixture 用作函数范围的 fixture,因此会为每个测试创建一个新目录 - 这通常是需要的。如果删除模块范围,则可以毫无问题地使用夹具:
@pytest.fixture
def my_filepath(self, tmpdir):
return tmpdir.mkdir("sub").join("testCurrentTicketCount.txt")
如果出于某种原因想在每个测试中使用 same 临时目录,则不能使用 tmpdir
fixture。在这种情况下,您可以创建自己的 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)
我有一个单元测试 class 用于测试 txt 文件中的内容。我在 pytest 中使用 tmpdir 夹具。这是我现在的 class:
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 fixture 时,出现错误,提示:
ScopeMismatch: You tried to access the 'function' scoped fixture 'tmpdir' with a 'module' scoped request object, involved factories
unit_tests\test_TicketCounter.py:12:
所以您无法将 tmpdir 与 pytest 夹具一起使用?是因为 tmpdir 是固定装置吗? 关于如何删除重复代码并使用函数或夹具传递路径的任何想法?
如错误消息所述,tmpdir
是一个基于函数的夹具,例如它为每个测试创建一个新的临时目录,并在测试后删除它。因此,您不能在模块范围的固定装置中使用它,它在模块加载后仅实例化一次。如果你能做到这一点,你的临时目录将在第一次测试后被删除,你将无法在下一次测试中访问它。
在您当前的代码中,tmpdir
fixture 用作函数范围的 fixture,因此会为每个测试创建一个新目录 - 这通常是需要的。如果删除模块范围,则可以毫无问题地使用夹具:
@pytest.fixture
def my_filepath(self, tmpdir):
return tmpdir.mkdir("sub").join("testCurrentTicketCount.txt")
如果出于某种原因想在每个测试中使用 same 临时目录,则不能使用 tmpdir
fixture。在这种情况下,您可以创建自己的 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)