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

时间:2016-07-05 15:07:21

标签: python unit-testing pycharm command-line-arguments

我想为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完成吗?或者我还需要其他东西吗?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

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

其中一个症状是您有外部依赖项,如sys.argv,难以控制。通常,您希望将类似的依赖项注入类中。这是面向对象编程的优势之一 - 您可以隔离依赖关系并最大限度地降低对象本身的复杂性。

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

答案 1 :(得分:1)

对于命令行参数,我建议您使用argparse软件包(包含在纯Python中)。

__main__部分将包含主方法的解析和调用。

您可以分别测试两个:

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