So, I wanted to do some very simple functional tests using a real-ish webserver, but I didn’t want to have to depend on twisted.web or an external setup. So I did this:

from wsgiref.simple_server import make_server
from multiprocessing import Process, Queue

class TestPosting(unittest.TestCase):
    # FIXME: THIS IS TERROBLE

    def setUp(self):
        self.q = Queue()
        self.p = Process(target=self.serve, args=(self.q,))
        self.p.start()
        self.port = self.q.get()

    def serve(self, q):
        httpd = make_server('', 0, simple_app_maker(q))
        port = httpd.server_port
        q.put(port)
        httpd.serve_forever()

    def tearDown(self):
        self.p.terminate()

    def test_something(self):
        url = "http://locahost:%s/whatever" % self.port
        ...
        result = self.queue.get()
        # make some assertions on the results

def simple_app_maker(queue):
    def simple_app(environ, start_response):
        post_env = environ.copy()
        post_env['QUERY_STRING'] = ''
        post = cgi.FieldStorage(
            fp=environ['wsgi.input'],
            environ=post_env,
            keep_blank_values=True
        )
        q.put(...) # put the relevant stuff in the queue
        status = '200 OK'
        response_headers = [('Content-type','text/plain')]
        start_response(status, response_headers)
        return ['Hello world!\n']
    return simple_app

just have the simple_app function put whatever you want to check in the queue, and your tests pull it out and make some assertions. Super nasty, but it actually works!