如何运行单元测试来测试具有 argparse 属性的脚本?

Posted

技术标签:

【中文标题】如何运行单元测试来测试具有 argparse 属性的脚本?【英文标题】:How to run unit test which testing the script with argparse attributes? 【发布时间】:2021-05-03 03:39:42 【问题描述】:

我有一个带有 argparse 的简单程序 my_code.py 和带有测试代码的 test_code.py。请帮助我了解如何正确运行 test_code.py。当我尝试基本命令时,出现如下错误:

测试python -m unittest test_code.py

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

测试用例python -m unittest test_code.Test_Code

python -m unittest: 错误:参数太少

测试方法python -m unittest test_code.Test_Code.test_double_name

python.exe -m unittest: 错误:需要以下参数:名称


    # my_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 my_code
    
    class Test_Code(unittest.TestCase):
    
      def test_double_name(self):
        my_code.args = my_code.parser.parse_args([])
        self.assertEqual(my_code.double_name('test-name'), 'test-name')
    
        my_code.args = my_code.parser.parse_args(["test-name", "-d"])
        self.assertEqual(my_code.double_name('test-name'), 'test-nametest-name')
    
    if __name__ == "__main__":
      unittest.main()

【问题讨论】:

code 是 Python 中的包名 - 不要将它用于您的模块。 另外,将 arg 解析代码与您的函数分开,例如将 arg 解析的结果传递给函数。如果您也想测试,也可以将 arg 解析放在一个单独的函数中。 【参考方案1】:

您好,您的解析器使用不正确,无法调用变量

code.py

code.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument(
    "--name",
    metavar="name",
    type=str,
)
parser.add_argument(
    "--double",
    metavar="double",
    type=str,
)


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))

测试 argparse,您可以查看This Post

【讨论】:

以上是关于如何运行单元测试来测试具有 argparse 属性的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单元测试期间测试所需的 argparse 参数?

如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?

如何测试我的代码是不是引发了适当的 argparse 异常?

Argparse 单元测试:禁止显示帮助消息

带有 argparse 的 Python 单元测试

用于argparse的python单元测试