[英]Python unit test case for mocking directory and generating test files
我們可以在 python 單元測試用例中模擬測試目錄和幾個文件嗎?
掃描.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'
有人可以幫我模擬以下項目,以便我可以實施單元測試或幫助我對 scan.py 進行任何示例單元測試
1. mocking directory path
2. Generating few test files
3. mocking item.is_symlink()
4. mocking item.is_dir()
一種方法是我們可以使用 path.object,我猜這是調用 output 的方法來設置的。
只需使用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 文檔了解更多信息。
您還可以使用faker-file ,它允許您更好地控制生成的內容,支持更多文件類型(DOCX、PDF 等)和遠程存儲(例如 AWS S3、Azure Cloud Storage 和 Google Cloud Storage) .
faker-file
安裝pip install faker-file[common]
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")
創建一個 ZIP 文件,其中包含 3 個包含隨機生成的虛假內容的 DOCX 文件
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 文檔了解更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.