Friday, December 2, 2011

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

Короткая приамбула.

Как раз сейчас занимаюсь разработкой очередного фреймверка для автоматизированного тестирования, по сему это будут, так сказать, записки с линии фронта.

Основа для будущего фреймверка
Часть первая
Так как это фреймверк для автоматизированного тестирования, ключевое слово тестирование, то начну с непосредственной процедуры написание тестов.
Как ни странно ни с какого-то решения типа Selenium или xUnit или еще чего-то, а именно с процесса создания, хранения и считывания тестов.



1. По моему мнению тесты должны храниться отдельно от кода.

  • Почему?
  • Да банально потому что так их легче поддерживать.

2. Где должны храниться тесты?

  • текстовые документы - плохо, в ручную писать структуры для тестов, сложно, скучно и все такое
  • xml и все что угодно более-менее структурированное - в принципе, почему бы и нет, за исключением того, что надо будет еще что-то чтоб эти тесты туда удобно заносить и считывать, ну не люблю я кучи тегов
  • электронные таблицы - это уже лучше - тут как бы и структура есть, и самое любимое место жизни тест кейсов это excel. excel/open office что угодно, надо устанавливать, чтоб иметь возможность отредактировать тесты.
  • googledocs - мой выбор. Для того чтоб тестировать web я почень редко (один раз) сталкивался с ситуацией когда web сайт есть, а интернета про этом нет. Используя гугл докс не нужно ничего ставить и таблица тоже есть. Опять же немаловажный факт - совместное использование и версионирование (svn позволяет и с xls такое делать, но вот незадача, он воспринимает xls как бинарник и с версионированием там грусть в таком случае)


3. Ну ок, googleDocs, так googleDocs.
Теперь давайте смотреть как к нему доступиться. Об этом собсно и будет сегодняшняя статья, как работать с гугловой электронной таблицей.

Все я надеюсь знаю как ее создать и смогут что-то там написать.

Давайте по очереди с кодом (это Python если что):

1. Создать сессию для клиента по работае со spreadsheets:
gd_client = gdata.spreadsheet.service.SpreadsheetsService()
gd_client.email = ‘
Ваш гугловый мейл user@gmail.com
gd_client.password = ‘Ваш гугловый пароль p@$$w0rd
gd_client.ProgrammaticLogin()
Вот это вас, как бы, логинит в этот самый клиент для последующей работы.

2. Теперь создаем инстанс работы с Google Spreadsheets
q = gdata.spreadsheet.service.DocumentQuery()
3. Ну и собсно конектимся к нашему spreadsheet
q['title'] = ‘Полное имя нашего spreadsheet типа SomeMySpread
q['title-exact'] = 'true'
feed = gd_client.GetSpreadsheetsFeed(query=q)
Как ни странно, почти все тут построенно на такой штуке как feed по сему работа со списками гугловых документов мало чем отличается от работы с worksheet в том же spreadsheet или с рядками в последнем.

4. Для того чтоб получить именно наш spreadsheet в работу берем его из вышеописанного фида (не смущайтесь если что он там всего один)
spreadsheet_id = feed.entry[0].id.text.rsplit('/',1)[1]
Дальше начинаем копаться внутри него.

5. Берем список worksheets которые есть в нашем документе

feed = gd_client.GetWorksheetsFeed(spreadsheet_id)

Я предполагаю использование большого количества worksheets в будущем по сему закладываю это сразу, при построении последующего парсера.

for wsCount, entry in enumerate(feed.entry):
worksheet_id = feed.entry[wsCount].id.text.rsplit('/',1)[1]
currentWorkBookName = feed.entry[wsCount].title.text
currentWorkВookName я буду использовать как название тестового сценария

6. Теперь мне нужно получить строки и считывать с них данные
rows = gd_client.GetListFeed(spreadsheet_id, worksheet_id)
Это все строки которые есть, но все они мне не очень то нужны, они мне нужны одна за другой
for rowCount, entry in enumerate(rows.entry):
row = rows.entry[rowCount]
row – это одна строка, но мне ее нужно разобрать, она состоит не только из того что в ней написано но и из идентификатора для каждой ячейки

Идентификатор это Method, ParamX, etc.
Надо разбирать
params = []
""" Creating list of data for one step """
for key in row.custom:
if row.custom[key].text != None:
params.append(key);
params.append(row.custom[key].text);
Юмор ситуации заключается в том, что row.custom возвращает ячейки в каком ему вздумается порядке, при чем никак при этом не уважая того в каком порядке их выставили создатели. По сему я в массив и загоняю значение ячейки и ключ (идентификатор), для того чтоб в последствии работать как с HashMap в java.

7. Как вы видите по картинке googleDoc у нас есть Method и есть параметры, не сложно предположить, что с программной точки зрения это будет так же – метод и в него полетят параметры. Для этого нужно все содержимое массива params разбросать по нужным ящичкам
execMethod=""
paramArray=[]
if len(params) > 0:

execMethod = params[params.index('method')+1]
if len(params)>2:
for element in range(0, (len(params)/2)-1):
try:
tmpParam = params[params.index('param'+str(element+1))+1]
paramArray.append(tmpParam)
except:
e = sys.exc_info()[1]
print "Something wrong: \n" + e


Вот собственно у вас уже и есть кусок который будет парсить googledocs spreadsheet. В конце такого кода вы получите execMethod - то что должно запуститься и массив paramArray - то что туда надо передать.

Как запускать методы разберем немного позже

Пока.

Ах да, чуть не забыл - цельный кусок кода


import gdata.spreadsheet.service

import gdata.service
import atom.service
import gdata.spreadsheet
import atom
import sys


def paramsParcer (params):
    paramArray = []
    for element in range(0, (len(params)/2)-1):
            try:
                tmpParam = params[params.index('param'+str(element+1))+1]
                paramArray.append(tmpParam)
            except:
                e = sys.exc_info()[1]
                print "Something wrong: \n" + e
    return paramArray

entryPoint = methodsEntryPoint()
getAllConfigValues (entryPoint)

gd_client = gdata.spreadsheet.service.SpreadsheetsService()
gd_client.email = 'Ваше Мыло в гугле'
gd_client.password = 'Ваш гуглопароль'

gd_client.ProgrammaticLogin()

q = gdata.spreadsheet.service.DocumentQuery()
q['title'] = 'Имя вашего дока'
q['title-exact'] = 'true'
feed = gd_client.GetSpreadsheetsFeed(query=q)
spreadsheet_id = feed.entry[0].id.text.rsplit('/',1)[1]

"""Title of SpreadSheet"""
print feed.entry[0].title.text
feed = gd_client.GetWorksheetsFeed(spreadsheet_id)
logger = logger()

""" Getting all worksheets one by one """
for wsCount, entry in enumerate(feed.entry):
    worksheet_id = feed.entry[wsCount].id.text.rsplit('/',1)[1]
    """ Printing name of the WorkSheet """
    TempDataStorage.currentWorkBookName = feed.entry[wsCount].title.text
    logger.reportFileGenerator()
    rows = gd_client.GetListFeed(spreadsheet_id, worksheet_id)
    for rowCount, entry in enumerate(rows.entry):
        row = rows.entry[rowCount]
        params = []
        """ Creating list of data for one step """
        for key in row.custom:
            if row.custom[key].text != None:
                params.append(key);
                params.append(row.custom[key].text);
                
        """Splitting list of data for one step for Execution """
        execMethod=""
        paramArray=[]
        if len(params) > 0:
            execMethod = params[params.index('method')+1]
            if len(params)>2:
                paramArray = paramsParcer(params)
        

No comments:

Post a Comment