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

使用异常参数列表测试python函数,python,testing,Python,Testing,我对测试一无所知,所以需要你的帮助 获取了一个python函数,该函数正在不断更改。 还有一个参数列表,这个函数应该处理,没有例外。 所以问题是——如何对此进行正确的简单测试 我需要像这样的东西 for arg in args: cmd = 'python script.py %s' % arg p = subprocess.Popen(cmd, shell = True, stdout = subprocess.PIPE, stderr = subproces

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

获取了一个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
    def test_runs_without_exception(self):
        script.main(1, 2, 3)
用这样的自编脚本可以吗?或者有什么特殊的模块吗


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

理想情况下,模块
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
的包,专门用于测试此类函数,并且有一个可读的文档,因此我强烈建议您尝试一下

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

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()
编辑以添加:

如果您的函数没有返回值,并且您只想知道函数是否抛出异常,那么您的测试函数可以简单地编写为

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
    def test_runs_without_exception(self):
        script.main(1, 2, 3)
如果
script.main()

如果您只想简单地测试一个脚本,那么使用
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
中包含一些日志记录功能。在这种情况下,您可能需要查看包
日志记录

,问题是我的函数不返回任何内容。它只是打印了大量的信息。所以我不需要检查平等性;我想确保没有例外扩展了答案以包括没有返回值的函数的情况。