Python 3.x WSGI Testing Framework

1

Учитывая, что веб-сайт, похоже, не имеет версии 3.x (или каких-либо планов ее разработки), существуют ли какие-либо решения для автоматического тестирования системы приложения WSGI? Я знаю unittest для модульного тестирования - меня больше интересует момент тестирования системных систем.

Я не ищу инструменты для разработки приложения - просто проверьте его.

  • 0
    просто чтобы вы знали, какова ситуация. веб-тест зависит от веб-сайта. Сейчас над webob ведется работа, чтобы заставить его работать на python 3. Не так уж сложно представить, что когда работа над webob завершена, webtest должен просто работать на python 3 или должен с минимальными усилиями. Поэтому не совсем правильно говорить «или какие-либо планы по его разработке», но теперь вы знаете ситуацию.
  • 0
    Приятно слышать. Может быть хорошей информацией для вики WebTest. Единственный пост, который я нашел даже частично связанным, был этот пост , в котором кто-то еще упомянул поддержку Python 3, но так и не получил ответа.
Показать ещё 1 комментарий
Теги:
python-3.x
testing
integration-testing
wsgi

1 ответ

2
Лучший ответ

В случае, если кто-то еще это понимает, я сам написал решение.
Здесь очень простой класс, который я использую - я просто наследую от WSGIBaseTest вместо TestCase и получаю метод self.request() который я могу передавать запросы.
Он хранит cookies и автоматически отправляет их в приложение по более поздним запросам (пока не будет self.new_session()).

import unittest
from wsgiref import util
import io

class WSGIBaseTest(unittest.TestCase):
    '''Base class for unit-tests. Provides up a simple interface to make requests
    as though they came through a wsgi interface from a user.'''
    def setUp(self):
        '''Set up a fresh testing environment before each test.'''
        self.cookies = []
    def request(self, application, url, post_data = None):
        '''Hand a request to the application as if sent by a client.
        @param application: The callable wsgi application to test.
        @param url: The URL to make the request against.
        @param post_data: A string.'''
        self.response_started = False
        temp = io.StringIO(post)
        environ = {
            'PATH_INFO': url,
            'REQUEST_METHOD': 'POST' if post_data else 'GET',
            'CONTENT_LENGTH': len(post),
            'wsgi.input': temp,
            }
        util.setup_testing_defaults(environ)
        if self.cookies:
            environ['HTTP_COOKIE'] = ';'.join(self.cookies)
        self.response = ''
        for ret in application(environ, self._start_response):
            assert self.response_started
            self.response += str(ret)
        temp.close()
        return response
    def _start_response(self, status, headers):
        '''A callback passed into the application, to simulate a wsgi
        environment.

        @param status: The response status of the application ("200", "404", etc)
        @param headers: Any headers to begin the response with.
        '''
        assert not self.response_started
        self.response_started = True
        self.status = status
        self.headers = headers
        for header in headers:
            # Parse out any cookies and save them to send with later requests.
            if header[0] == 'Set-Cookie':
                var = header[1].split(';', 1)
                if len(var) > 1 and var[1][0:9] == ' Max-Age=':
                    if int(var[1][9:]) > 0:
                        # An approximation, since our cookies never expire unless
                        # explicitly deleted (by setting Max-Age=0).
                        self.cookies.append(var[0])
                    else:
                        index = self.cookies.index(var[0])
                        self.cookies.pop(index)
    def new_session(self):
        '''Start a new session (or pretend to be a different user) by deleting
        all current cookies.'''
        self.cookies = []

Ещё вопросы

Сообщество Overcoder
Наверх
Меню