【问题标题】:How to unittest a class that reads a command line arg?如何对读取命令行参数的类进行单元测试?
【发布时间】:2016-11-07 11:52:47
【问题描述】:

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

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

当我将类导入我的测试文件时,在类从 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 或从命令行运行的结果没有什么不同。

这可以使用单元测试来完成吗?还是我需要别的东西?

任何帮助将不胜感激!

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    对于命令行参数,我建议你使用 argparse 包(包含在普通 Python 中。)

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

    你可以分别测试:

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

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2016-09-08
      • 1970-01-01
      相关资源
      最近更新 更多