如何对接受参数的 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..."
我有以下 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..."