使用Pytest测试一个程序蟒蛇

0

的问题

TI我很新Python编程,并有一个问题,在试验使用Pytest. 在一个高水平,我有一个程序,需要3条的用户输入和产生的文本文件中结束。 对我的测试,我想基本上比较的文件,我的程式输出,它应该是什么。

现在,我不知道该如何去测试。 该程序本身没有争论,但是,仅仅依靠3条的用户输入的,这我将使用monkeypatch模拟。 我创建一个新的文件,叫蟒蛇program_test.py 和有办法在这里呼吁原来的计划? 我已经尝试了这个,但我有麻烦的实际调用原始程序和发送的模拟投入。 或者,我必须试验原计划(其中并没有多大意义,我).

我想事情是这样的:

import my_program

def test_1():
    inputs = iter(['input1', 'input2', 'input3'])
    monkeypatch.setattr('builtins.input', lambda x: next(inputs))
    my_program
    # now do some assertion with some file comparison
    # pseudocode
    assert filecompare.cmp(expectedfile, actualfile)

这似乎只是运行原来的计划,我认为它与进口的声明,即它永远不会运行test_1(),可能是因为我永远不会叫它? 任何帮助,将不胜感激!

monkeypatching pytest python python-3.x
2021-11-24 03:37:36
1

最好的答案

2

没有提供你的 my_program 代码这很难说这是怎么回事。

既然你提到 import 问题,我猜你不确定 main()if __name__ == "__main__".

这里有一个小的例子你怎么可以测试。

第一,结构你 my_programmain 功能,其中包含的代码然后添加 if __name__ == "__main__" 它会让你跑 main 如果功能 my_program 是直接执行,而且还要导入 my_program 作为模块的其他文件(没有运行,为更多信息,请见: 什么是如果 =="主要":做?).

my_program:

def main():
    x = input()
    y = input()
    z = input()
    with open("test", "w") as f_out:
        f_out.write(f"{x}-{y}-{z}")


if __name__ == "__main__":
    main()

现在,您可以创建一个 test.py 文件和测试的 main 功能 my_program:

import os
import filecmp
import my_program


def test_success(monkeypatch):
    inputs = ["input1", "input2", "input3"]
    monkeypatch.setattr("builtins.input", lambda: next(iter(inputs)))
    my_program.main()
    with open("expected", "w") as f_out:
        f_out.write("-".join(inputs))
    assert filecmp.cmp("expected", "test")
    os.remove("test")
    os.remove("expected")


def test_fail(monkeypatch):
    inputs = ["input1", "input2", "input3"]
    monkeypatch.setattr("builtins.input", lambda: next(iter(inputs)))
    my_program.main()
    with open("expected", "w") as f_out:
        f_out.write("something-else-test")
    assert not filecmp.cmp("expected", "test")
    os.remove("test")
    os.remove("expected")

这是一个例子,所以我用 os.remove 删除的文件。 理想的情况是你确定装置在测试中的使用 tempfile 并产生随机的临时文件,这些文件将被自动删除后你的测试。

2021-11-27 23:57:25

谢谢这帮助了很多! 主要的方面,我从这是为了涵盖my_program如果 =="主要",那么呼叫my_program.主()在我的测试职能。 呼吁。主()很重要的东西我无法想到的。
Koonj Patel

@KoonjPatel你是受欢迎的。 我很高兴我帮助!
Vlad Siv

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................