【问题标题】:Python 2.6 Unittest assistance with parameters and argparse, how to solve?Python 2.6 Unittest 辅助参数和argparse,如何解决?
【发布时间】:2019-08-23 08:05:21
【问题描述】:

我正在尝试在 Python 2.6 上运行一个基本的单元测试,该测试采用 argparse 参数。

我的环境受到限制,无法安装任何其他库或使用任何模块进行测试,但 unittest。

但我相信答案就在这里:

How do you write tests for the argparse portion of a python module?

但是,我无法用我的代码重构提供的主要答案。

如果不重构我提供的示例代码,有人可以向我展示一下如何为下面的代码编写一个单元测试,它可以即时使用 -H 和 -S 吗?

提前致谢。


#!python
import argparse
import sys

try:
    HOSTNAME = sys.argv[2]
    SOMESTRING = sys.argv[3]
except IndexError:
    print "Please Enter the Hostname and Somestring"


def argparse_msg():
    return "testscript_example -H somehost -S somestring"


def check_arg(args=None):
    parser = argparse.ArgumentParser(description="A Test Example", usage=argparse_msg())
    parser.add_argument("-H", "--host",
                        help="HostName",
                        required=True)

    parser.add_argument("-S", "--somestring",
                        help="HostName",
                        required=True)

    results = parser.parse_args(args)

    return (results.host, results.somestring)


def message_test():
    print HOSTNAME + " " + SOMESTRING


def main():
    message_test()


if __name__ == "__main__":
    HOSTNAME, SOMESTRING = check_arg(sys.argv[1:])
    main()

【问题讨论】:

标签: python unit-testing argparse python-unittest parameterized-unit-test


【解决方案1】:

为了方便测试类,我将代码修改如下:

  • 删除了全局变量(例如:HOSTNAMESOMESTRING
  • 向函数传递参数
  • 从函数而不是打印返回的字符串(来自message_testmain

更新代码receiver.py:

#!python
import argparse
import sys


def argparse_msg():
    return "testscript_example -H somehost -S somestring"


def check_arg(args=None):
    parser = argparse.ArgumentParser(description="A Test Example", usage=argparse_msg())
    parser.add_argument("-H", "--host",
                        help="HostName",
                        required=True)
    parser.add_argument("-S", "--somestring",
                        help="HostName",
                        required=True)
    results = parser.parse_args(args)
    return (results.host, results.somestring)


def message_test(HOSTNAME, SOMESTRING):
    return "{} {}".format(HOSTNAME, SOMESTRING)


def main(HOSTNAME, SOMESTRING):
    return message_test(HOSTNAME, SOMESTRING)


if __name__ == "__main__":
    HOSTNAME, SOMESTRING = check_arg(sys.argv[1:])
    print(main(HOSTNAME, SOMESTRING))

运行receiver.py的输出:

python receiver.py -H localhost -S demo
localhost demo

测试文件(test_receiver.py):

from receiver import check_arg
import unittest

class ParserTest(unittest.TestCase):

    def test_main(self):
        HOSTNAME, SOMESTRING = check_arg(['-H', 'test', '-S', 'sample string'])
        self.assertEqual(HOSTNAME, 'test')
        self.assertEqual(SOMESTRING, 'sample string')        

if __name__ == '__main__':
    unittest.main()

运行test_receiver.py的输出:

python test_receiver.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 2016-06-19
    • 2012-10-08
    • 2013-02-26
    • 1970-01-01
    • 2016-05-30
    • 2018-12-14
    • 2016-05-18
    • 2018-12-12
    相关资源
    最近更新 更多