使用pytest读写文件的模式

克里斯蒂安·布洪(Cristthian Boujon)

constants.py

import os

BASE_PATH = os.path.abspath(os.path.dirname(__file__))
INPUT_PATH = os.path.join(BASE_PATH, 'input')
FILE_INPUT1_PATH = os.path.join(INPUT_PATH, 'input1.csv')
FILE_INPUT2_PATH = os.path.join(INPUT_PATH, 'input2.csv')
PROCESSED_PATH = os.path.join(BASE_PATH, 'processed')
FILE_PROC1_PATH = os.path.join(PROCESSED_PATH, 'processed1.pkl')
FILE_PROC2_PATH = os.path.join(PROCESSED_PATH, 'processed2.pkl')

结构目录

root
  |__ constant.py
  |__ input
          |__ input1.csv
          |__ input2.csv 
  |__ process
          |__ processed1.pkl
          |__ processed2.pkl

data_handling.py

from constants import FILE_INPUT1_PATH, FILE_INPUT2_PATH, FILE_PROC1_PATH, FILE_PROC2_PATH

def foo(*args):
    file = FILE_INPUT1_PATH
    # Here it is doing staff
    # Finally I write data into FILE_PROC1_PATH

def bar(*args):
    file = FILE_INPUT2_PATH
    # Here it is doing staff
    # Finally I write data into FILE_PROC2_PATH

目前,我正在尝试使用pytest和测试foo()bar()但是由于输入文件和已处理的文件太大,并且测试过程不会覆盖已处理的文件因此我不知道如何进行操作。一种方法是将定义更改bar()bar(path)然后调用,bar(FILE_INPUT2_PATH)但是在代码中没有意义,因为bar始终需要读取FILE_INPUT2_PATH并且在很多地方都调用了它。foo()和bar()的单元测试将测试是否创建了处理后的文件,因为它依赖*args

所以...问题是我怎么解决呢?这种情况是否存在模式/良好做法?我应该在代码中进行哪些更改?

9只狗

输入文件和已处理文件太大,测试过程不会覆盖已处理文件

是的,测试非常适合这种工作。通用方法是创建测试数据(可以是原始数据的子集,其中包括边缘案例),并将其放置在测试附近的某个位置,例如:

├───tests
│   │   test_bar.py
│   │   test_foo.py
│   │
│   └───data
│           input_1.dat
│           input_2.dat
│           expected_1.pkl
│           expected_2.pkl

然后,如果测试功能接受输入作为常量而不是参数,unittest.mock.patch请在测试运行中使用更改常量(有关快速参考,请参见此出色的答案)。为了存储输出,可以使用常规文件或临时文件。

import tempfile
from pathlib import Path
from unittest.mock import patch

import foo_module


TEST_DATA_DIR = Path(__file__).resolve().parent / 'data'


@patch('foo_module.FILE_INPUT1_PATH', TEST_DATA_DIR / 'input_1.dat')
@patch('foo_module.FILE_PROC1_PATH', tempfile.mktemp())
def test_foo(tmpdir):
    """Process input and check result."""
    foo_module.foo()
    result = open(foo_module.FILE_PROC1_PATH, 'rb').read()
    expected = open(TEST_DATA_DIR / 'expected_1.pkl', 'rb').read()
    assert result == expected

注意: tempfile.mktemp()已弃用,因为未在mktemp()调用时创建文件,因此可以被另一个进程锁定。随意建议替代方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章