Saturday, December 10, 2011

Последовательное написание своего фреймверка для автоматизированного тестирования на Python

Основная часть
Продолжение

Как мы все прекрасно понимаем, автоматизация тестирования это далеко не только UI часть, по сему сегодня я предлагаю рассмотреть часть по созданию платформы для тестирования Rest API сервисов.



Что же такое Rest API.

Wiki
Передача состояния представления (Representational State Transfer (REST)) — это стиль архитектуры программного обеспечения для распределенных гипермедиа систем, подобных Всемирной паутине. Термин Передача состояния представления введен и определен в 2000 году Роем Филдингом в его кандидатской диссертации. Филдинг является одним из основных авторов спецификации протокола передачи гипертекста (HTTP) версий 1.0 и 1.1.
Соответствие ограничениям REST называется «RESTful»

По сути же своей это передача данных по средствам HTTP запросов, таких как Get, Post, Put и Delete.
Насколько сталкивался я, так передают данные в виде JSON, но это для нас не так важно.

Так вот – наша основная цель запрограммировать эти запросы и научить наш фреймверк с ними работать.

GET – простой сетевой запрос направленный на получение какой-то информации, и при этом не содержащий никого тела, GET запрос можно просто выполнить вбив ссылку с нужными параметрами в URL.

Для написания на Python я выбрал одну из стандартных библиотек версии 2,7 urllib2 (в 3-й версии ее разнесли по двум другим)

Начнем.
Как мы узнали в Get достаточно передать URL, но нет, ему так же нужны и Cookie, в которых хранится сессия. Очевидно, что Cookie эта та часть которую мы тоже должны научиться получать, но об этом позже.

Python code:
def getter(url, cookie):
   gh_url = url
   response = urllib2.Request(gh_url)
   response.add_header('Host',’
some host’)
   response.add_header('Accept','
some encoding')
   response.add_header('Content-Type','
some content-type')
   response.add_header('Cookie',
cookie)
   return urllib2.urlopen(response, timeout = 30).read()

Вот где-то так. На выходе мы получим именно то что нам вернет запрос в браузере, а с полученной информацией мы можем делать все что угодно.

Как я говорил ранее, нам нужно получить Cookie. И тут мы подходим к методу POST, который зачастую используется для авторизации и при этом возвращает Cookie, а точнее Set-Cookie как один из параметров Header.
Вот собственно код данного метода

def loginForSecCookie(self, login, password):
   gh_url = TempDataStorage.basic_url+'/authenticate/'
   values = '{"user":"'+login+'","password":"'+password+'"}'
   response = urllib2.Request(gh_url, values, self.setHeaders())
   return urllib2.urlopen(response).info().getheader('Set-Cookie')

Все просто до нельзя – закидываем логин и пароль в формате JSON (ну вот так, у вас при этом может быть другой JSON) и получаем назад Cookie которые подставляем туда куда нам надо.
PUT и DELETE не отличаются от POST и GET почти ни чем, за исключением названия.
По сему просто вставлю куски кода
def putter(self, url, body, cookie):
   gh_url = 'http://'+
some_host+url
   header = {'Host':
some_host
                    'Accept':'some accept’,
                    'Content-Type':'
some content-type',
                    'Cookie' :
cookie}
   response = urllib2.Request(gh_url, body, header
   response.get_method = lambda: 'PUT'
   return urllib2.urlopen(response, timeout = 30).read()

def deleter(self,url, cookie):
   gh_url = 
'http://'+some_host+url
   response = urllib2.Request(gh_url)
   responce.add_header('Host',’
some_host’)
   responce.add_header('Accept','
some encoding')
   responce.add_header('Content-Type','
some content-type')
   responce.add_header('Cookie',
cookie)
   response.get_method = lambda: 'DELETE'
   return urllib2.urlopen(response, timeout = 30).read()

Ну вот где-то так, это на сегодня все. В следующий раз расскажу как связать эти части – Google Docs и RestAPI

No comments:

Post a Comment