使用unittest和argparse测试参数解析

时间:2016-03-05 17:19:06

标签: python unit-testing argparse

我正在为我的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()中添加一个return。测试现在正在运行。

1 个答案:

答案 0 :(得分: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模块并查看此问题 - How do you write tests for argparse?