使用异常参数列表测试python函数

时间:2017-02-21 15:38:25

标签: python testing

我对测试一无所知,所以需要你的帮助。

有一个不时更改的python函数。 还有一个参数列表,该函数应该处理没有异常。 所以问题 - 如何为此做出正确的简单测试。

我需要像

这样的东西
for arg in args:
    cmd = 'python script.py %s' % arg
    p = subprocess.Popen(cmd, shell = True, 
        stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    output, err = p.communicate()
    if err:
        print arg
        print err

使用这样的自编脚本是否可以,或者是否有任何特殊模块?

或者处理它的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

理想情况下,模块script.py包含一个函数main(),当您将script.py作为脚本调用时会调用该函数,并使用通常的习惯用法

import sys

def main(arg1, arg2, arg3):
    print(arg1, arg2, arg3)
    return 42

if __name__ == "__main__":
    main(*sys.argv[1:])

在这种情况下,你可以简单地导入函数main并在没有所有子进程麻烦的情况下进行测试:

from script import main as testsubject

assert testsubject(1, 2, 3) == 42

如果script.py不在python搜索路径中,则可能需要手动添加:

import sys
sys.path.append("/path/to/folder/containing/script.py")

from script import main

有一个名为unittest的软件包作为标准库的一部分,专门用于测试此类函数,并附带可读的文档,因此我强烈建议您尝试一下。

使用uittest,测试可能如下所示:

import unittest

import script

class Test_Script(unittest.TestCase):

    def test_return_value(self):
        answer = script.main(1, 2, 3)
        self.assertEqual(answer, 42)

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

已编辑添加:

如果你的函数没有返回值,而你想知道的是你的函数是否抛出异常,那么你的测试函数就可以简单地写成

    def test_runs_without_exception(self):
        script.main(1, 2, 3)

如果script.main()抛出异常,则unittest将捕获该异常并打印相应的失败消息。

如果您只想测试一个脚本,那么使用unittest可能会有点矫枉过正,而且您可以使用更简单的

import time

import script

try:
    sript.main(1, 2, 3)
except Exception as e:
    print("An Exception occured!")
    with open("script_log.txt", "a") as logfile:
        logfile.write(str(time.time()) + "\t" + str(e))
    raise e
else:
    print("Everything is fine.")

如果您可以控制script.py,则可能需要直接在script.py中包含一些日志记录工具。在这种情况下,您可能需要查看包logging