【问题标题】:Using Pytest to test a Python Program使用 Pytest 测试 Python 程序
【发布时间】:2021-11-24 03:37:36
【问题描述】:

TI 对 Python 编程非常陌生,并且有一个关于使用 Pytest 进行测试的问题。概括地说,我有一个程序,它接受 3 条用户输入并最终生成一个文本文件。对于我的测试,我想基本上比较我的程序输出的文件和它应该是什么。

现在,我不确定如何进行测试。该程序本身不接受任何参数,但仅依赖于 3 条用户输入,我将使用 monkeypatch 来模拟。我是否创建了一个名为 program_test.py 的新 python 文件并在此处有调用原始程序的方法?我已经尝试过了,但是我在实际调用原始程序并发送模拟输入时遇到了麻烦。或者,我是否在原始程序中进行了测试(这对我来说没有多大意义)。

我想要这样的东西:

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)

这似乎只是在运行原始程序,我认为它与 import 语句有关,即它从未运行 test_1(),可能是因为我从未调用它?任何帮助将不胜感激!

【问题讨论】:

    标签: python python-3.x testing pytest monkeypatching


    【解决方案1】:

    如果不提供您的 my_program 代码,就很难知道发生了什么。

    既然你提到import 问题,我猜你没有定义main() 和if __name__ == "__main__"。

    这里有一个小例子来说明如何测试它。

    首先,将my_program 构造为包含代码的main 函数,然后添加if __name__ == "__main__",如果my_program 直接执行,则可以运行main 函数,但也可以导入@987654332 @ 作为其他文件的模块(不运行它,更多信息请参见:What does if name == "main": do?)。

    我的程序:

    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文件并测试my_program的main函数:

    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 并生成随机临时文件,这些文件将在您的测试后自动删除。

    【讨论】:

    • 感谢这有很大帮助!我从中得到的主要方面是用 if name == "main": 包含 my_program ,然后在我的测试函数中调用 my_program.main() 。调用 .main() 非常重要,也是我想不到的。
    • @KoonjPatel 不客气。我很高兴能帮上忙!
    猜你喜欢
    • 2022-01-12
    • 2019-02-08
    • 2023-04-01
    • 1970-01-01
    • 2020-12-16
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多