使用 unittest 和 argparse 测试参数解析
Testing arguments parsing with unittest and 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。测试现在正在运行。
在 assertTrue
语句中,您传递的是一个非空 string
,它始终计算为 True
。
如果 paramParser.main
returns 它的参数,你应该这样做:
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
module and check out this question - How do you write tests for 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。测试现在正在运行。
在 assertTrue
语句中,您传递的是一个非空 string
,它始终计算为 True
。
如果 paramParser.main
returns 它的参数,你应该这样做:
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
module and check out this question - How do you write tests for argparse?
。