使用unittest和argparse测试参数解析

3

我正在为我的Python脚本编写一些单元测试。该脚本允许用户覆盖参数的值。

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

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

脚本会读取文件,如果其中存在该参数,则会获取其值,并将其写入带有新值的另一个文件中。

从命令行运行此代码可以成功覆盖参数的值。

以下是我的代码:

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()中添加一个return。现在测试已经有效。


3
你正在要求测试评估非空字符串是否为真值,它总是会是。你是否阅读了unittest的实际文档? - jonrsharpe
2
assertTrue 的第一个参数是一个可以转换为 bool 的对象,而不是您提供的字符串形式的布尔语句(这是您正在提供的)。看起来 assertEqual 对前两个可能更有用。 - cdarke
可以查看 argparse 单元测试文件以获取更多的想法,位于 Lib/test/test_argparse.py - 不过它包含的内容可能比你的代码需要的要多。 - hpaulj
1个回答

2
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模块的内容并查看此问题 - 如何为Python模块的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__' 的错误。这个方法对于另一个人是有效的(可以在我的编辑中看到)。 - user825023

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接