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

Ren*_*lli 2 testing pytest

我有环境可以测试。因此,我的测试调用了一个在内部生成文件的函数output_file,并且我需要在测试期间检查该文件。

但我不知道为什么我的文件在output_filepytest 完成工作后保存在里面,而我的测试总是失败。

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

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

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

|-teste
|--输出文件
|--mytest

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

引发 FileNotFoundError

jos*_*faz 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 ...

Run Code Online (Sandbox Code Playgroud)

另外:如果您需要在不同的单元测试之间共享每个固定装置,则应保存(或导入)它们(请阅读此处的conftest.py文档)