如何对接受参数的 python 脚本进行单元测试

How to unit test a python script accepting arguments

我有以下 python 脚本,可以将其导入到模块中,也可以 运行 独立运行

# MyScrpt.py
import argparse

def DoSomething(s: str):
    return s

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Learning to unit test python')
    parser.add_argument('-myarg1', type=str, dest='myarg1', required=True, help='Help yourself')
    parser.add_argument("-myarg2", action='store_true')
    parser.add_argument("-myarg3", action='store_true')
    args = parser.parse_args()

    value = ''
    value = DoSomething(args.myarg1)
    print(value)

    if args.myarg2 == True:
        value = DoSomething('Something')
    
    print(value)

    if args.myarg3 == True:
        value = DoSomething('SomethingMore')
    
    print(value)

DoSomething 是我要单元测试的方法。它应该 return 正是传递给它的字符串。

问题:
我如何对这个脚本进行单元测试?我应该简单地编写一个脚本来调用 DoSomething 并断言 return 值吗?由于它正在接受参数,python 中是否有更广泛的内容来对脚本进行单元测试?

将命令行入口点包装在一个函数中,该函数可以选择接受 argv(就像 ArgumentParser.parse_args() 那样)。

import argparse


def DoSomething(s: str):
    return s


def main(argv=None):
    parser = argparse.ArgumentParser(description="Learning to unit test python")
    parser.add_argument("-myarg1", type=str, dest="myarg1", required=True, help="Help yourself")
    parser.add_argument("-myarg2", action="store_true")
    parser.add_argument("-myarg3", action="store_true")
    args = parser.parse_args(argv)

    value = ""
    value = DoSomething(args.myarg1)
    print(value)

    if args.myarg2 == True:
        value = DoSomething("Something")

    print(value)

    if args.myarg3 == True:
        value = DoSomething("SomethingMore")

    print(value)


if __name__ == "__main__":
    main()

然后你可以测试主函数,给它传递你喜欢的参数。下面的脚本可能 运行 与 Py.test 测试 运行ner.

一样
import io
import contextlib
from myscript import main

def test_main():
    stdout = io.StringIO()
    with contextlib.redirect_stdout(stdout):
        main(["foo", "-myarg1", "baz", "-myarg2"])
    assert stdout.getvalue() == "... something..."