如何从argparse子解析器获取父解析器?或更优测试方案
验证argparse子解析器与父解析器的关联方法
方法一:直接访问内部私有属性
argparse的ArgumentParser虽然没有公开的parents属性,但内部维护了一个_parent_parsers列表,存储了所有关联的父解析器实例。你可以直接通过这个属性验证子解析器是否关联了目标父解析器:
import argparse import unittest class TestParserInheritance(unittest.TestCase): def setUp(self): self.verbose_quiet_parent_parser = argparse.ArgumentParser(add_help=False) self.verbose_quiet_parent_parser.add_argument('-v', '--verbose', action='store_true') self.verbose_quiet_parent_parser.add_argument('-q', '--quiet', action='store_true') self.child_parser = argparse.ArgumentParser(parents=[self.verbose_quiet_parent_parser]) def test_child_parser_associated_with_parent(self): self.assertIn(self.verbose_quiet_parent_parser, self.child_parser._parent_parsers) if __name__ == '__main__': unittest.main()
注意:这是依赖argparse内部实现的方式,_parent_parsers是私有属性,未来Python版本可能会变更,但在测试环境稳定的情况下,这种方式最直接高效。
方法二:行为验证(更稳健)
如果不想依赖内部实现,更推荐通过验证父解析器的参数是否被正确继承来间接确认关联关系——这属于行为测试,更符合测试的核心目标(验证功能正确性而非实现细节):
import argparse import unittest class TestParserInheritance(unittest.TestCase): def setUp(self): self.verbose_quiet_parent_parser = argparse.ArgumentParser(add_help=False) self.verbose_quiet_parent_parser.add_argument('-v', '--verbose', action='store_true') self.verbose_quiet_parent_parser.add_argument('-q', '--quiet', action='store_true') self.child_parser = argparse.ArgumentParser(parents=[self.verbose_quiet_parent_parser]) def test_child_inherits_parent_arguments(self): # 验证能解析父级的verbose参数 args = self.child_parser.parse_args(['-v']) self.assertTrue(args.verbose) self.assertFalse(args.quiet) # 验证能解析父级的quiet参数 args = self.child_parser.parse_args(['-q']) self.assertTrue(args.quiet) self.assertFalse(args.verbose) # 验证无参数时的默认值 args = self.child_parser.parse_args([]) self.assertFalse(args.verbose) self.assertFalse(args.quiet) if __name__ == '__main__': unittest.main()
这种方法虽然需要测试参数行为,但能确保父解析器的功能确实被子解析器继承,即使argparse内部实现变化,只要继承逻辑正常,测试依然有效。
内容的提问来源于stack exchange,提问作者Suhas Srivastava
相关产品推荐
相关产品推荐

