我想为Python脚本编写单元测试。脚本本身运行正常。
该脚本由一个类组成,该类从命令行读取一个值到类变量中。
当我将类导入我的测试文件时,我在类从sys.argv []读取的位置得到错误'list index out of range'。
我不熟悉Python和一般的测试。在过去的几天里,我已经阅读了很多关于此的文档和SO页面。
以下是代码:
档案bongo.py -
import sys
class Bongo:
my_int = int(sys.argv[1])
def __init__(self, n):
self.n = n
def get_sum(self):
return self.n + Bongo.my_int
if __name__ == '__main__':
bongo = Bongo(5)
m = bongo.get_sum()
print('bongo.get_sum() returns {}'.format(m))
文件bongo_test.py -
import unittest
from bongo import Bongo
class TestBongoMethods(unittest.TestCase):
def setUp(self):
self.bongo = Bongo(10)
self.bongo.my_int = 5
def test_get_n(self):
self.assertEqual(self.bongo.get_sum(), 15)
if __name__ == '__main__':
unittest.main()
正在运行python bongo_test.py
的输出是
Traceback (most recent call last):
File "bongo_test.py", line 2, in <module>
from bongo import Bongo
File "/home/me/class_for_testing/bongo.py", line 4, in <module>
class Bongo:
File "/home/me/class_for_testing/bongo.py", line 6, in Bongo
my_int = int(sys.argv[1])
IndexError: list index out of range
我已经尝试过我能想到的一切;我一直在PyCharm Pro 2016.1中使用Py 2.7, 但是使用Py 3.4或从命令行运行结果没有什么不同。
可以使用unittest完成吗?或者我还需要其他东西吗?
非常感谢任何帮助!
答案 0 :(得分:2)
通常,单元测试有助于确定类的边界。如果你的课很难进行单元测试,你应该想:“我怎样才能让它更容易测试?”几乎总是这会导致更好的结构化类。
其中一个症状是您有外部依赖项,如sys.argv,难以控制。通常,您希望将类似的依赖项注入类中。这是面向对象编程的优势之一 - 您可以隔离依赖关系并最大限度地降低对象本身的复杂性。
__main__
块非常适合命令行特定逻辑,例如sys.argv。我建议在那里读取变量,并将其传递给Bongo
的构造函数。然后你可以将Bongo单元测试为一个带有两个变量的类,让它不知道sys.argv。
答案 1 :(得分:1)
对于命令行参数,我建议您使用argparse软件包(包含在纯Python中)。
__main__
部分将包含主方法的解析和调用。
您可以分别测试两个: