使用 unittest 检查“--help”标志输出
Using unittest to check "--help" flag output
我有一些使用 argparse 解析命令行选项的代码。
例如:
# mycode.py
import argparse
def parse_args():
parser = argparse.ArgumentParser('my code')
# list of arguments
# ...
# ...
return vars(parser.parse_args())
if __name__ == "__main__":
parse_args()
我想用 unittest 检查帮助函数的输出。除非没有其他解决方案,否则我也不想更改实际代码。
帮助操作在打印到标准输出后内置了一个 SystemExit
调用,所以我不得不尝试在单元测试中捕获它。
这是我的单元测试代码,包含以下步骤:
1) 设置 sys.argv
列表以包含 -h
标志。
2) 在上下文管理器中包装函数调用以防止 SystemExit
被视为错误。
3) 暂时将 sys.stdout
切换为 io.StringIO
对象,这样我就可以检查它而无需将其打印到屏幕上。
4) 在 try...finally
块中调用函数,因此 SystemExit
不是致命的。
5) 将 sys.stdout
切换回真正的 stdout
.
6) 打开我之前保存帮助文本的文件(通过在终端中输入 python mycode.py -h > help_out.txt
)以验证它与从 StringIO
捕获的输出相同。
import unittest
import mycode
import sys
import io
class TestParams(unittest.TestCase):
def setUp(self):
pass
def test_help(self):
args = ["-h"]
sys.argv[1:] = args
with self.assertRaises(SystemExit):
captured_output = io.StringIO()
sys.stdout = captured_output
try:
mycode.parse_args()
finally:
sys.stdout = sys.__stdout__
with open("help_out.txt", "r") as f:
help_text = f.read()
self.assertEqual(captured_output, help_text)
def tearDown(self):
pass
此代码有效,但 captured_output
StringIO
对象为空,因此测试失败。
我正在寻找有关捕获的输出出了什么问题的解释 and/or 替代解决方案。
我很亲近。 captured_output
实际上并不是空的——我只是没有正确访问内容。
在我的示例代码中用 captured_output.get_value()
代替 captured_value
,它运行得很好。
我有一些使用 argparse 解析命令行选项的代码。
例如:
# mycode.py
import argparse
def parse_args():
parser = argparse.ArgumentParser('my code')
# list of arguments
# ...
# ...
return vars(parser.parse_args())
if __name__ == "__main__":
parse_args()
我想用 unittest 检查帮助函数的输出。除非没有其他解决方案,否则我也不想更改实际代码。
帮助操作在打印到标准输出后内置了一个 SystemExit
调用,所以我不得不尝试在单元测试中捕获它。
这是我的单元测试代码,包含以下步骤:
1) 设置 sys.argv
列表以包含 -h
标志。
2) 在上下文管理器中包装函数调用以防止 SystemExit
被视为错误。
3) 暂时将 sys.stdout
切换为 io.StringIO
对象,这样我就可以检查它而无需将其打印到屏幕上。
4) 在 try...finally
块中调用函数,因此 SystemExit
不是致命的。
5) 将 sys.stdout
切换回真正的 stdout
.
6) 打开我之前保存帮助文本的文件(通过在终端中输入 python mycode.py -h > help_out.txt
)以验证它与从 StringIO
捕获的输出相同。
import unittest
import mycode
import sys
import io
class TestParams(unittest.TestCase):
def setUp(self):
pass
def test_help(self):
args = ["-h"]
sys.argv[1:] = args
with self.assertRaises(SystemExit):
captured_output = io.StringIO()
sys.stdout = captured_output
try:
mycode.parse_args()
finally:
sys.stdout = sys.__stdout__
with open("help_out.txt", "r") as f:
help_text = f.read()
self.assertEqual(captured_output, help_text)
def tearDown(self):
pass
此代码有效,但 captured_output
StringIO
对象为空,因此测试失败。
我正在寻找有关捕获的输出出了什么问题的解释 and/or 替代解决方案。
我很亲近。 captured_output
实际上并不是空的——我只是没有正确访问内容。
在我的示例代码中用 captured_output.get_value()
代替 captured_value
,它运行得很好。