【问题标题】:How to unit test a python script accepting arguments如何对接受参数的python脚本进行单元测试
【发布时间】:2020-11-17 09:57:24
【问题描述】:

我有以下 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 是我要进行单元测试的方法。它应该准确地返回传递给它的字符串。

问题:
如何对这个脚本进行单元测试?我应该简单地编写一个脚本来调用DoSomething 并断言返回值吗?既然它接受参数,那么python中是否有更广泛的东西来对脚本进行单元测试?

【问题讨论】:

    标签: python python-2.7 unit-testing python-unittest


    【解决方案1】:

    将命令行入口点包装在一个可选择接受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()
    

    然后你可以测试 main 函数,传递参数为你喜欢的。下面的脚本可能会使用Py.test 测试运行器按原样运行。

    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..."
    

    【讨论】:

    • test_main 可以通过参数调用main。这就是我要找的。谢谢
    • test_main 中,foo 是正在测试的python 脚本的名称吗?我现在为我的问题中的脚本命名。如果你愿意,也许你可以改进你的答案
    • 没关系,因此元句法占位符foosys.argv(这是argparse 通常会读取的内容)包含脚本名称作为第一项,但argparse 仅将其用于格式化帮助。
    猜你喜欢
    • 2011-08-22
    • 2011-03-08
    • 1970-01-01
    • 2017-06-24
    • 2018-12-14
    • 2021-09-25
    • 2017-06-10
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多