使用 unittest 和 argparse 测试参数解析

Posted

技术标签:

【中文标题】使用 unittest 和 argparse 测试参数解析【英文标题】:Testing arguments parsing with unittest and argparse [duplicate] 【发布时间】:2016-06-19 10:30:45 【问题描述】:

我正在为我的 python 脚本写一些unit tests。该脚本允许用户覆盖参数的值。

python paramParser.py -d C:\\Path\\to\\yourfile\\xxx.m -p 'xxxParamName' -v 20

-d 文件名,可以包含参数名称和值-p 参数名称-v 参数值

脚本读取文件,如果参数存在,它将获取其值并将其写入具有新值的另一个文件。

command-line 运行它成功地覆盖了参数的值。

这是我的代码:

import unittest
import paramParser

class Tests(unittest.TestCase):

  def testOneIntValue(self):
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v 3"])
    self.assertTrue('xxxParamName.Value= 3', result)

  def testMultipleIntValues(self):
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v 3"])
    self.assertTrue('[ xxxParamName.Value = [ 1 2 3 ]', result)

  def testTrueBoolean(self):
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v true"])
    self.assertTrue('xxxParamName.Value = true', result)

if __name__ == '__main__':
    unittest.main()

测试总是通过,知道我做错了什么吗?

编辑 我试着和这个人一样做:argparse fails when called from unittest test

def testOneValue(self):
    parsed = paramParser.main(["-d","C:\\Path\\to\\yourfile\\xxx.m", "-p", "xxxParamName", "-v", "3"])
    self.assertEqual(parsed["d"], "C:\\Path\\to\\yourfile\\xxx.m")
    self.assertEqual(parsed["p"], "xxxParamName")
    self.assertEqual(parsed["v"], "3")

虽然他的传球(借助 [] 并分隔参数)我的传球没有。我收到此错误:

TypeError: 'NoneType' object has no attribute '__getitem__'

只是关于上一期的快速更新。我忘了在我的 def main() 中添加一个返回值。测试现在正在运行。

【问题讨论】:

您要求测试评估一个非空字符串是否为真,它总是。您是否阅读过unittest 的实际文档? assertTrue 的第一个参数是一个可以转换为bool 的对象,而不是作为字符串的布尔语句(这是您提供的)。看起来assertEqual 可能对前两个更有用。 查看argparse unittest 文件以获取更多想法,Lib/test/test_argparse.py - 虽然这涵盖的内容超出了您的代码所需的内容。 【参考方案1】:

assertTrue 语句中,您传递了一个非空string,它的计算结果始终为True

如果paramParser.main 返回它的参数,你应该这样做:

def testOneIntValue(self):
    result = paramParser.main(["-d C:\\Path\\to\\yourfile\\xxx.m", "-p 'xxxParamName'", "-v 3 "])
    self.assertEqual(result.xxxParamName, 3)   # access xxxParamName here the way you pass it

另外,您可能想了解unittest 模块并查看这个问题 - How do you write tests for argparse?

【讨论】:

我尝试了另一种写法:def testOneValue(self): parsed = paramParser.main(["-d","C:\\Path\\to\\yourfile\\xxx.m", "-p", "xxxParamName", "-v", "3"]) self.assertEqual(parsed["d"], "C:\\Path\\to\\yourfile\\xxx.m") self.assertEqual(parsed["p"], "xxxParamName") self.assertEqual(parsed["v"], "3"),但我得到了TypeError: 'NoneType' object has no attribute '__getitem__' 这适用于另一个人(可以在我上面的编辑中看到)

以上是关于使用 unittest 和 argparse 测试参数解析的主要内容,如果未能解决你的问题,请参考以下文章

带有 argparse 的 Python 单元测试

使用 unittest 检查“--help”标志输出

带有命令行参数的单元测试

使用 Pytest 框架进行 Argparse 测试

如何在单元测试中使用 argparse 参数调用函数?

你如何为 python 模块的 argparse 部分编写测试?