我对测试一无所知,所以需要你的帮助。
有一个不时更改的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
使用这样的自编脚本是否可以,或者是否有任何特殊模块?
或者处理它的最佳方法是什么?
答案 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
。