用于模拟目录和生成测试文件的Python单元测试用例

4nkexdtk  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(137)

我们可以在python单元测试用例中模拟测试目录和几个文件吗?
scan.py:

import re
from pathlib import Path

class Scan():

    def scan_files(self, dir_path, filter_regex=None):
        for item in Path(dir_path).iterdir():
            if not item.is_symlink():
                if item.is_dir():
                    for child_item in self.scan_files(item, filter_regex=filter_regex):
                        yield child_item
                else:
                    if filter_regex is None:
                        yield item
                    elif filter_regex:
                        if re.match(filter_regex, item.name, re.IGNORECASE):
                            yield item
                    else:
                        pass

测试_扫描.py:

import unittest
from mock import patch
from scan import Scan

class TestScan(unittest.TestCase):
    def setUp(self) -> None:
        """Unit Test default 
        """
        pass

    def instantiate_scan_class(self):
        scan = Scan()

        return scan

    def test_scan_files(self):
        dir_path = "/my/test/path"
        
        # Create the UploadWatchService object
        scan = self.instantiate_scan_class()

        result = scan.scan_files(dir_path=dir_path)
        for item in result:
            print(item)



if __name__ == '__main__':
    unittest.main()

我在下面跑

python3 -m unittest discover

我收到以下错误:

======================================================================
ERROR: test_scan_files (test_scan.TestScan)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/vcimalap/code/watchservice/src/main/test_scan.py", line 24, in test_scan_files
    for item in result:
  File "/Users/vcimalap/code/watchservice/src/main/scan.py", line 12, in scan_files
    for item in Path(dir_path).iterdir():
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/pathlib.py", line 1160, in iterdir
    for name in self._accessor.listdir(self):
FileNotFoundError: [Errno 2] No such file or directory: '/my/test/path'

有人能帮我模拟以下项目吗?这样我就可以实现单元测试或帮助我进行www.example.com的任何示例单元测试scan.py

1. mocking directory path
 2. Generating few test files
 3. mocking item.is_symlink()
 4. mocking item.is_dir()

一种方法是我们可以使用path.object,我想这是为了方法调用输出来设置的。

kx1ctssn

kx1ctssn1#

创建测试目录和空文件

只需使用tempfile(来自标准库)。

import tempfile

tempfile.TemporaryDirectory().name  
# output: '/tmp/tmpr6ugakay'

因为这些都是文件操作,所以我不建议你模仿,而是使用tempfile创建临时目录(和文件),在系统重启时(或者根据相应的系统策略)刷新。
tempfile.TemporaryDirectory类似,还有一个tempfile.NamedTemporaryFile

tempfile.NamedTemporaryFile(prefix="my_temp_file", suffix=".txt").name  
# output: '/tmp/my_temp_file8aq0dsoo.txt'

使用Faker创建包含虚假内容的测试文件

要为测试文件生成虚假内容,可以使用Faker

安装

pip install faker

Faker使用情况

    • 导入和初始化**
import tempfile
from pathlib import Path

from faker import Faker

FAKER = Faker()
    • 创建包含虚假内容的TXT文件**
file = Path(tempfile.NamedTemporaryFile(suffix=".txt").name)
file.write_text(FAKER.text())
    • 创建带有虚假内容的PNG文件**
file = Path(tempfile.NamedTemporaryFile(suffix=".png").name)
file.write_bytes(FAKER.image())
    • 使用虚假内容创建ZIP文件**
file = Path(tempfile.NamedTemporaryFile(suffix=".zip").name)
file.write_bytes(FAKER.zip())

查看faker docs了解更多信息。

使用faker-file创建包含虚假内容的测试文件

您还可以使用faker-file,它允许您对生成的内容进行更多的控制,支持更多的文件类型(DOCX、PDF等),与ORM(DjangoSQLAlchemy)和factory_boy完美集成,甚至支持远程存储(如AWS S3、Azure云存储和Google云存储)。

安装

pip install faker-file[all]

faker-file使用情况

    • 导入和初始化**
from faker import Faker

from faker_file.providers.docx_file import DocxFileProvider
from faker_file.providers.pdf_file import PdfFileProvider
from faker_file.providers.txt_file import TxtFileProvider
from faker_file.providers.zip_file import ZipFileProvider
# many more formats supported, check the docs

from faker_file.providers.helpers.inner import create_inner_docx_file

FAKER = Faker()
FAKER.add_provider(DocxFileProvider)
FAKER.add_provider(PdfFileProvider)
FAKER.add_provider(TxtFileProvider)
FAKER.add_provider(ZipFileProvider)
    • 使用随机生成的虚假内容创建TXT文件**
file = FAKER.txt_file()
    • 使用提供的内容创建TXT文件**
file = FAKER.txt_file(content="Lorem ipsum dolor sit amet")
    • 使用随机生成的虚假内容创建PDF文件**
file = FAKER.pdf_file()
    • 使用提供的内容创建PDF文件**
file = FAKER.pdf_file(content="Lorem ipsum dolor sit amet")
    • 用随机生成的虚假内容创建一个DOCX文件**
file = FAKER.docx_file()
    • 使用提供的内容创建DOCX文件**
file = FAKER.docx_file(content="Lorem ipsum dolor sit amet")
    • 创建一个包含3个DOCX文件的ZIP文件,其中包含随机生成的虚假内容**
file = FAKER.zip_file(
    options={
        "count": 3,
        "create_inner_file_func": create_inner_docx_file,
        "create_inner_file_args": {
            "max_nb_chars": 1_024,
        },
    }
)
    • 创建一个ZIP文件,其中包含1个DOCX文件以及提供的内容**
file = FAKER.zip_file(
    options={
        "count": 1,
        "create_inner_file_func": create_inner_docx_file,
        "create_inner_file_args": {
            "content": "Lorem ipsum dolor sit amet",
        },
    }
)

查看faker-file docs了解更多信息。

相关问题