Python CGI FieldStorage 测试工具

标签 python testing cgi

如何为 Python CGI 脚本设置一个小型测试工具?我不想为了测试它而运行服务器,但我确实想为我的测试提供各种 GET/POST 输入。

在我看来,FieldStorage(或它背后的对象)是完全不可变的,所以我看不出如何在 harness 中即时提供 CGI 数据。

最佳答案

您可以使用模拟库,例如 Mock做这项工作。例如,假设您想从 CGI 脚本中测试 function_to_test 函数,您可以编写 unittest class像这样:

import unittest
import cgi

from mock import patch

def function_to_test():
    form = cgi.FieldStorage()
    if "name" not in form or "addr" not in form:
        return "<H1>Error</H1>\nPlease fill in the name and address.\n"
    text = "<p>name: {0}\n<p>addr: {1}\n"
    return text.format(form["name"].value, form["addr"].value)

@patch('cgi.FieldStorage')
class TestClass(unittest.TestCase):
    class TestField(object):
        def __init__(self, value):
            self.value = value

    FIELDS = { "name" : TestField("Bill"), "addr" : TestField("1 Two Street") }

    def test_cgi(self, MockClass):
        instance = MockClass.return_value
        instance.__getitem__ = lambda s, key: TestClass.FIELDS[key]
        instance.__contains__ = lambda s, key: key in TestClass.FIELDS
        text = function_to_test()
        self.assertEqual(text, "<p>name: Bill\n<p>addr: 1 Two Street\n")

    def test_err(self, MockClass):
        instance = MockClass.return_value
        instance.__contains__ = lambda self, key: False
        text = function_to_test()
        self.assertEqual(text,
            "<H1>Error</H1>\nPlease fill in the name and address.\n")

如果我将此代码作为单元测试运行,我会得到:

..
----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

关于Python CGI FieldStorage 测试工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8483088/

相关文章:

python - 摆脱Python pandas中的SettingWithCopyWarning

python - SQLite - 检查创建时的表格式并根据需要删除

Angular Testing - 如果计时器在组件初始化中,则 Tick 不起作用

linux - 在不解压缩的情况下操作 zip 文件 ( linux && (bash || cgi script) ) 中的文件夹结构

python - 如何检查lxml元素树字符串?

python - 将括号放入字符串python

java - 使用 Mockito 从链式方法中捕获参数

java - 测试时如何在 JOptionPane 上自动单击“确定”?

python - 如何使用 `python -m SimpleHTTPServer 8000` 或 `python -m CGIHTTPServer 8000` 托管 python cgi 脚本?

cgi - 如何在cgi-bin中执行shell脚本?