使用 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 测试参数解析的主要内容,如果未能解决你的问题,请参考以下文章