如何在unittest中结合argparse使用自定义参数避免冲突?
解决unittest与自定义命令行参数冲突的优雅方案
unittest.main()会默认解析所有命令行参数,遇到自定义参数就会报错,你当前通过删除sys.argv元素的方式确实不够严谨,以下是几个更优的实现方案:
方案1:用argparse的parse_known_args()分离参数
这个方法会自动区分已识别的自定义参数和unittest需要的参数,返回解析后的参数对象,以及未识别的剩余参数列表,直接把剩余参数传给unittest.main()即可,完全无需修改全局的sys.argv:
import sys import argparse import unittest # 你的测试用例类定义示例 class CalTest(unittest.TestCase): def test_add(self): self.assertEqual(1+1, 2) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Test correction') parser.add_argument('--plot-results', help='Plot results of cal test', action='store_true') # 用parse_known_args替代parse_args,拆分参数 args, remaining_args = parser.parse_known_args() # 将绘图标记传递给测试类(按需使用) CalTest.plot_results = args.plot_results # 把剩余参数传给unittest.main,保留脚本名作为第一个参数 unittest.main(argv=[sys.argv[0]] + remaining_args)
方案2:手动过滤参数后传给unittest.main()
如果不想用parse_known_args,也可以直接过滤掉自定义参数,再传递给unittest.main()的argv参数,避免修改全局sys.argv:
import sys import argparse import unittest # 测试用例类... if __name__ == '__main__': parser = argparse.ArgumentParser(description='Test correction') parser.add_argument('--plot-results', action='store_true') args = parser.parse_args() # 过滤掉自定义参数,生成unittest专用的参数列表 unittest_argv = [arg for arg in sys.argv if arg not in ('--plot-results',)] unittest.main(argv=unittest_argv)
方案3:将绘图逻辑集成到测试生命周期
如果绘图依赖测试结果,可以把触发逻辑放到测试类的生命周期方法中,比如tearDownClass(所有测试用例执行完毕后):
import sys import argparse import unittest plot_results_flag = False class CalTest(unittest.TestCase): @classmethod def tearDownClass(cls): if plot_results_flag: # 这里执行你的绘图逻辑,比如读取测试结果、生成图表 print("Generating test result plots...") if __name__ == '__main__': parser = argparse.ArgumentParser(description='Test correction') parser.add_argument('--plot-results', action='store_true') args, remaining_args = parser.parse_known_args() plot_results_flag = args.plot_results unittest.main(argv=[sys.argv[0]] + remaining_args)
内容的提问来源于stack exchange,提问作者Tim Wescott
相关产品推荐
相关产品推荐

