2016-07-05 42 views
2

我想为Python脚本编写单元测试。脚本本身正确运行。Python:如何单元测试读取命令行arg的类?

脚本由一个类组成,它从命令行读取一个值到类变量中。

当我将类导入到测试文件中时,在类从sys.argv []读取的位置出现'列表索引超出范围'的错误。

我是新来的测试,在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完成吗?还是我需要别的东西?

任何帮助将不胜感激!

+1

我认为这是非常相关的:[如何设置sys.argv,以便我可以单元测试它?](http://stackoverflow.com/questions/18668947/how-do-i-set-sys-argv -SO-I-罐单元测试-它) – alecxe

回答

2

一般来说,单元测试有助于弄清楚你的类的边界。如果你的班级很难进行单元测试,你应该考虑:“我怎样才能让测试更容易?”几乎总是会导致更好的结构化类。

其中一种症状是您有外部依赖性,如sys.argv,难以控制。通常你想把这样的依赖注入到类中。这是面向对象编程的优点之一 - 您可以分离依赖关系并最小化对象本身的复杂性。

__main__块非常适合命令行特定逻辑,如sys.argv。我建议读取那里的变量,并将其传递给构造函数Bongo。然后你可以单元测试Bongo作为一个具有两个变量的类,并且它对sys.argv一无所知。