Python 在pytest函数中使用subprocess.run()会导致任何测试问题吗?

Python 在pytest函数中使用subprocess.run()会导致任何测试问题吗?,python,pytest,Python,Pytest,我有以下Python模块要测试: 导入系统 def greet(): 打印(f“Hello,{sys.argv[1]}!”) 我已将其设置为脚本入口点,以便: $greet World 你好,世界! 现在,我想测试一下 它可以创建一个包含以下内容的tests/test_greet.py文件: 导入子流程 进口问候 def test_greet_cli(): 结果=子流程。运行([“问候”,“世界”],捕获输出=真) 在result.stdout中断言b“你好,世界!” 这会引起什么问题吗

我有以下Python模块要测试:

导入系统 def greet(): 打印(f“Hello,{sys.argv[1]}!”) 我已将其设置为脚本入口点,以便:

$greet World
你好,世界!
现在,我想测试一下

它可以创建一个包含以下内容的
tests/test_greet.py
文件:

导入子流程
进口问候
def test_greet_cli():
结果=子流程。运行([“问候”,“世界”],捕获输出=真)
在result.stdout中断言b“你好,世界!”
这会引起什么问题吗

<> P>是否有其他测试方法,我应该考虑?


请随意浏览,我在其中记录了类似于上述内容的内容。我在那篇文章中建议了两种编写测试的方法,其中之一就是这种方法。如果它可能导致任何问题,我不想包含它。

您的根本问题是这个函数

def greet():
    print(f"Hello, {sys.argv[1]}!") 
当涉及到可测试性时,它是“坏的”,因为它依赖于全局变量。更好的版本应该是:

def greet(args=None):
    if args is None:
        args = sys.argv
    print(f"Hello, {args[1]}!") 

这将具有相同的功能,但更易于测试。

这不是最好的主意,但也不是最坏的。但是,所有cli工具(optpass、click和其他工具)都有用于执行cli应用程序内联测试的规定。(此外,这是基于意见的,不在stackoverflow的范围内)关于您的文章。。。它缺少旗帜处理。。也许你可以看看invoke?()@PaulBecotte,谢谢你指出这件事可能是基于观点的。我看看是否能改写这个问题。我真的在追求:这会打破什么,或者有我错过的功能,我可以使用吗?我喜欢这个对话。如果您认为sys.argv是一个全局变量,我不确定第二个示例是否删除了全局变量。在第二个例子中,您可以通过注入依赖项来测试函数。“依赖注入”只是一个花哨的名字,用于将外部需求作为参数传递给函数。请记住,您正在测试自己的代码,而不是sys.argv。。。您还可以通过模拟sys.argv来进行依赖项注入(pytest有一个monkeypatch装置可以实现这一点)。我只是觉得使用参数更直接(在创建测试时输入更少)。