Pytest:如何在测试中创建和读取文件

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

我有测试环境。 因此,我的测试调用了一个在

output_file
内生成文件的函数,我需要在测试期间检查该文件。

但我不知道为什么我的文件在 pytest 完成工作后保存在

output_file
中,而我的测试总是失败。

我有两个测试功能: 第一个是调用函数来生成我需要检查的文件。 第二个功能是阅读它。

发生这种情况,如果我只运行第一个测试函数 - 一切正常......文件保存在output_file目录中 但是,如果我运行所有脚本(使用两个 test_functions),第二个函数找不到第一个测试的文件,并且当所有脚本完成时,我的文件被保存。

这是有原因的吗? 我无法更改将文件保存到其他位置的功能。 pytest 如何允许我的函数在执行测试期间以我可以读取的方式将文件保存在 output_file 中? 有固定装置吗?

|-睾丸
|--输出文件
|--我的测试

test_function_one()
   pid = os.getpid()
   call_function_to_test('cliente',pid)
   assert 
test_function_second()
   with open('output_file/'mydoc.csv')as ...

引发 FileNotFoundError

testing pytest
1个回答
5
投票

如果我理解得很好:你有两个函数要测试(两个UUT)。 如果是这种情况,并且您有两个函数要测试,那么在单元测试中您应该编写两个不同的测试,因为每个测试都应该是隔离的。

为此,您应该为第二次测试重新创建文件。

但是:因为您“不能”使用第一个函数来创建文件(否则您依赖于程序的函数进行测试,所以如果您更改此函数,则会破坏测试) 我强烈建议在这里使用pytest装置

特别是内置的 tmp_path 固定装置,它将免费为您提供一个临时目录,并将在测试套件运行结束时将其清空。

因此,就您而言,我建议保留第一个测试(创建文件)现在的样子(因为它通过了)。 此测试仅用于测试您的函数是否创建文件。

对于第二个测试,您只想测试该函数是否能够按预期读取文件。因此,请使用 pytest 固定装置,这将为您创建文件:

import os
import pytest

@pytest.fixture
def output_file(tmp_path):
    # create your file manually here using the tmp_path fixture
    # or just import a static pre-built mock file
    # something like : 
    target_output = os.path.join(tmp_path,'mydoc.csv')
    with open(target_output, 'w+'):
        # write stuff here
    return target_output


def test_function_second(output_file):
   with open(output_file) as ...

另外: 如果您需要在不同的单元测试之间共享每个夹具,则应将它们保存(或导入)在

conftest.py
中(请阅读文档此处

© www.soinside.com 2019 - 2024. All rights reserved.