【问题标题】:How to call function with argparse arguments in unittests?如何在单元测试中使用 argparse 参数调用函数?
【发布时间】:2021-04-29 09:15:10
【问题描述】:

请帮我编写单元测试:

我有一个带有一个函数的简单程序,当运行带有 argparse 参数 --double 的程序时,它只返回双倍的“name”。否则返回单个名称

    # code.py
    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument("name")
    parser.add_argument('-d', '--double', action="store_true")
    
    args = parser.parse_args()
    
    def double_name(new_name):
      if args.double:
        return new_name + new_name
      else:
        return new_name
    
    print(double_name(args.name))
  1. 在cmd中运行python code.py test-name我有结果:test-name
  2. 在cmd中运行python code.py test-name -d我有结果:test-nametest-name

我想编写 unittest 来检查这个函数,但我不知道如何在单元测试中使用 argparse 参数调用这个函数

    # test_code.py
    import unittest
    import code
    
    class Test_Code(unittest.TestCase):
    
      def test_double_name(self):
        # without -d
        self.assertEqual(code.double_name('test-name'), 'test-name')
        # with -d
        self.assertEqual(code.double_name('test-name'), 'test-nametest-name')
    
    if __name__ == "__main__":
      unittest.main()

这个测试的run命令应该怎么看?如果我添加到代码:

    code.args = code.parser.parse_args(["test-name", "-d"])

标准命令python -m unittest test_code.py raise AttributeError

AttributeError: 'module' 对象没有属性 'py'

【问题讨论】:

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


    【解决方案1】:

    在函数外访问解析后的数据,把数据传入。那么数据从哪里来就无所谓了:

    def double_name(new_name, double):
      if double:
        return new_name + new_name
      else:
        return new_name
    
    print(double_name(args.name, args.double))
    

    然后:

    self.assertEqual(code.double_name('test-name', False), 'test-name')
    

    【讨论】:

      【解决方案2】:

      你可以用你自己的参数列表调用parse_args,让它产生一个合适的值来使用。这需要稍微重写code 以避免在导入时调用parse_arg

      # code.py
      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument("name")
      parser.add_argument('-d', '--double', action="store_true")
      
      
      def double_name(new_name):
        if args.double:
          return new_name + new_name
        else:
          return new_name
      
      
      if __name__ == "__main__":
          args = parser.parse_args()
          print(double_name(args.name))
      

      然后

      # test_code.py
      import unittest
      import code
      
      
      class Test_Code(unittest.TestCase):
      
        def test_double_name(self):
          code.args = code.parser.parse_args([])
          self.assertEqual(code.double_name('test-name'), 'test-name')
      
          code.args = code.parser.parse_args(["-d"])
          self.assertEqual(code.double_name('test-name'), 'test-nametest-name')
      
      
      if __name__ == "__main__":
        unittest.main()
      

      在您的测试函数中,您需要确保设置了code.args 的值,因为这是code.double_name 使用的变量。

      【讨论】:

        猜你喜欢
        • 2019-11-15
        • 1970-01-01
        • 2023-01-06
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多