如何在我的测试套件中使用 click 只获得 commands/subcommands 的列表?

How do I get just a list of commands/subcommands using click in my test suite?

我构建了一个使用分组命令和子命令的 CLI 应用程序。一切正常。但是,我想确保这种情况在未来继续存在,所以我想确保我的所有命令和子命令都已正确加载。

我首先想到的是 运行

commands = ["config", "othercommand"]
runner = CliRunner()
result = runner.invoke(cli.main)
for command in commands:
    assert command in result.output

从我的角度来看,这有一些缺陷。

我的申请是这样布局的:

@click.group()
def main():
    """My entry point"""

@click.group()
def config():
    """config group"""

@config.command()
def add_config():
    """this is a subcommand to config"""

@click.group()
def othercommand():
    """othercommand group"""

@othercommand.command()
def do_thing():
    """this is a subcommand to othercommand"""

我的问题:有没有办法获取我可以使用的所有命令(和子命令)的列表,并从我的测试套件中执行此操作?最好没有周围的一切帮助测试,这样我就可以消除错误的结果。

可以内省 cli 以获取其结构,如:

代码:

def command_tree(obj):
    if isinstance(obj, click.Group):
        return {name: command_tree(value)
                for name, value in obj.commands.items()}

测试代码:

import click

@click.group()
def main():
    """My entry point"""

@main.group()
def config():
    """config group"""

@config.command()
def add_config():
    """this is a subcommand to config"""

@main.group()
def othercommand():
    """othercommand group"""


@othercommand.command()
def do_thing():
    """this is a subcommand to othercommand"""


print(command_tree(main))

结果:

{'config': {'add_config': None}, 'othercommand': {'do_thing': None}}