Python 如何对读取命令行arg的类进行单元测试?

Python 如何对读取命令行arg的类进行单元测试?,python,unit-testing,pycharm,command-line-arguments,Python,Unit Testing,Pycharm,Command Line Arguments,我想为Python脚本编写单元测试。脚本本身运行正常 该脚本由一个类组成,该类将命令行中的值读入类变量 当我将该类导入到测试文件中时,在该类从sys.argv[]读取的点处出现错误“列表索引超出范围” 我不熟悉Python和一般的测试。在过去的几天里,我读了很多关于这一点的文档 代码如下: 文件bongo.py-- 文件bongo_test.py-- 运行python bongo_test.py的输出是 Traceback (most recent call last): File "bon

我想为Python脚本编写单元测试。脚本本身运行正常

该脚本由一个类组成,该类将命令行中的值读入类变量

当我将该类导入到测试文件中时,在该类从sys.argv[]读取的点处出现错误“列表索引超出范围”

我不熟悉Python和一般的测试。在过去的几天里,我读了很多关于这一点的文档

代码如下:

文件bongo.py--

文件bongo_test.py--

运行
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
回溯(最近一次呼叫最后一次):
文件“bongo_test.py”,第2行,在
从邦戈进口邦戈
文件“/home/me/class\u for\u testing/bongo.py”,第4行,在
邦戈班:
文件“/home/me/class_for_testing/bongo.py”,第6行,在bongo中
my_int=int(sys.argv[1])
索引器:列表索引超出范围
我已经尝试了我能想到的一切;我一直在PyCharm Pro 2016.1中使用Py 2.7, 但是使用Py3.4或从命令行运行的结果没有什么不同

这可以使用unittest完成吗?或者我还需要别的什么


任何帮助都将不胜感激

通常,单元测试有助于确定类的边界。如果你的类很难进行单元测试,你应该想:“我怎样才能使它更容易测试?”这几乎总是导致更好的结构化类

其中一个症状是您具有难以控制的外部依赖项,如sys.argv。通常,您希望像这样将依赖项注入到类中。这是面向对象编程的优点之一——您可以隔离依赖项并最小化对象本身的复杂性


\uuuu main\uuuu
块非常适合命令行特定逻辑,如sys.argv。我建议读取那里的变量,并将其传递到
Bongo
的构造函数中。然后您可以将Bongo作为一个包含两个变量的类进行单元测试,并让它不知道sys.argv。

对于命令行args,我建议您使用argparse包(包含在普通Python中)

\uuuuu main\uuuuu
部分将包含解析by和main方法的调用

您可以分别测试以下两项:

  • arg解析
  • 具有给定参数的业务逻辑

我认为这是非常相关的:
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()
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