TestRail. Некоторые
возможности интеграции.
как помочь ручному тестированию
Голов Антон
skype: golov.anton
email: lilac@cn.ru
● Что такое test rail?
● Как можно автоматизировать общение с ним?
● Некоторые полезные возможности.
● С чем можно интегрировать?
О чем будем говорить
Немного теории
Test case — это проверка. "Выполни тест-кейс по вводу отрицательных значений" =
проведи проверку такую-то и проверь, что результат будет такой-то.
Test suit - набор кейсов объединенных по какому-то принципу, как правило
логическому.
Test plan- план тестирования, помимо кейсов содержит конфигурации тестирования,
сроки проведения и ответственного.
Что такое TestRail
Система хранения и управления тест кейсами как ручными так и автоматическими, для
автотестов можно использовать вместо git и хранитьобновлять кейсы и наборы кейсов
Что можно делать и как применять?
● Необходимо описать и стандартизировать процесс тестирования в вашем
проекте.
● Выбрать ключевые точки где необходимо применять автоматизацию.
● Автоматизировать. :-)
Как можно автоматизировать общение с ним?
С помощью Python и не только:-)
Плюсы:
● Rest API
○ С доступом к каждой
сущности проекта
● Очень простое API
● API отдает json
Минусы:
● Очень простое API - мало методов, есть
только базовые.
Некоторые полезные возможности
● Импорт из файла или
googledocs.
● Экспорт в googledocs по
формату
● Подготовка test run
● Выполнение test run
Импорт из файла, googledocs.
Для импорта будем
использовать следующую
карту импорта:
case.map
title -> Title
custom_steps -> Steps
custom_expected -> Expected Result
estimate -> Estimate
custom_preconds -> Preconditions
Метод для загрузки карты импорта:
def ImportCaseMap(mapfile):
result_map = []
filemap = open(mapfile)
for line in filemap:
split_line = line.split("->")
split_line[0] = split_line[0].strip()
split_line[1] = split_line[1].strip()
result_map.append(split_line)
filemap.close()
return result_map
Собственно сама загрузка в testrail
def ImportCases(self, cases, section_id, map):
map_list = ImportCaseMap(map)
good_case = {}
good_cases = []
for case in cases:
for item in map_list:
good_case[item[0]] = case[item[1]]
good_cases.append(good_case.copy())
good_case.clear()
for case in good_cases:
self.send_post("add_case/" + str(section_id),
case)
return None
● кейсы в виде списка словарей
● список полей карты импорта
● ID секции
Экспорт в гугл по формату. Готовим данные
def PrepareUtest(self, temp_cases):
# prepare cases for u test
temp_cases = self.send_get("get_cases/" + get_project + "&suite_id="
+ get_suite)
result = []
int_case = {}
i = 1
Экспорт в гугл по формату. Готовим данные
for temp_case in temp_cases:
if temp_case["custom_steps_separated"] is not None:
for item_2 in temp_case["custom_steps_separated"]:
int_case["#"] = i
int_case["Title"] = temp_case["title"]
int_case["Section"] = section_name(temp_case
["section_id"])
int_case["Precondition"] = temp_case
["custom_preconds"]
int_case["Steps"] = item_2["content"]
int_case["Result"] = item_2["expected"]
int_case["Estimate"] = temp_case["estimate"]
result.append(int_case.copy())
i += 1
int_case.clear()
Экспорт в гугл по формату. Готовим данные
else:
int_case["#"] = i
int_case["Title"] = temp_case["title"]
int_case["Section"] = section_name(temp_case["section_id"])
int_case["Precondition"] = temp_case["custom_preconds"]
int_case["Steps"] = temp_case["custom_steps"]
int_case["Result"] = temp_case["custom_expected"]
int_case["Estimate"] = temp_case["estimate"]
result.append(int_case.copy())
i += 1
int_case.clear()
return result
Экспорт в гугл по формату. Отдаем гуглу
def PutCasesToGoogle(filename, key, current_case):
# Google put in test cases by u-test format
json_key = json.load(open(key))
scope = ['https://spreadsheets.google.com/feeds']
credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'].encode(), scope)
gc = gspread.authorize(credentials)
wks = gc.open(filename).sheet1
i = 10
for case in current_case:
wks.update_acell("A" + str(i), case["#"])
wks.update_acell("B" + str(i), case["Title"])
wks.update_acell("C" + str(i), case["Section"])
wks.update_acell("D" + str(i), case["Precondition"])
wks.update_acell("E" + str(i), case["Steps"])
wks.update_acell("F" + str(i), case["Result"])
wks.update_acell("H" + str(i), case["Estimate"])
i += 1
return None
Подготовка TestRun
def AddTestPlan(self, project_id, suits, plan_name=str):
testruns = {}
testruns['entries'] = []
testruns['name'] = plan_name
for item in suits:
testruns['entries'].append({"suite_id": item, "name":
self.section_name(item), "include_all": True})
result = self.send_post("add_plan/" + str(project_id),
testruns)
return result
Что передаем:
● идентификатор проекта
● набор тестсьютов
● название тест плана
Что получаем:
● id тест плана и его данные.
Закрытие TestRun. Получение тестов.
def GetTestPlan(self, plan_id):
tests = []
run_ids = []
testplan = self.send_get("get_plan/" + str(plan_id))
for item in testplan['entries']:
for run in item['runs']:
run_ids.append(run['id'])
for item in run_ids:
tests.append(self.send_get("get_tests/" + str(item)))
return tests
Что передаем:
● номер тест плана в системе
● разбираем ответ сервера и
возвращаем список тестов для
выполнения
Что получаем:
● список словарей с тестами
Закрытие TestRun. Передача результатов тестов.
def PutTestResults(self, TestResults):
result = []
for item in TestResults:
result.append(self.send_post("add_result/" + str(item.
pop('case_id')), item))
return result
Что передаем:
● Список результатов тестов из
вашей системы тестирования в
виде списка словарей где указан
идентификатор прогона и тесты с
результатами.
● Идентификатор плана
Что получаем:
● ответ от Testrail
Пример использования. Получаем кейсы из
гуглодока.
import testrail, json, gspread, random
from oauth2client.client import SignedJwtAssertionCredentials
#get cases from file
json_key = json.load(open("My Project-5244905c20f9.json"))
scope = ['https://spreadsheets.google.com/feeds']
credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'].encode(),
scope)
gc = gspread.authorize(credentials)
my_spreadsheet = gc.open_by_url("https://docs.google.com/spreadsheets/d/1W753C_9CpNwN7_vFPYv-
uL5X64kFKwA7eyRFBMT2ExE/edit#gid=580422902")
my_rows = my_spreadsheet.get_worksheet(0).get_all_records()
Пример использования. создаем подключение, импортируем кейсы и
создаем тестплан
# get connect
client = testrail.APIClient("http://localhost:8888/testrail")
client.user = "lilac@cn.ru"
client.password = "12345"
# import cases
client.ImportCases(my_rows[0:2], 2, 'case.map')
client.AddTestPlan(1, suits, "testing plan")
tests = client.GetTestPlan(1)
TestResults = []
case = {}
state = [1, 2, 4, 5]
Пример использования. Получаем результат Проверок и отдаем в тестрейл.
for item in tests:
for item_2 in item:
case['case_id'] = item_2['id']
case['status_id'] = random.choice(state)
case['comment'] = 'test comment ' + str(random.randrange(1, 5, 1))
case['actual'] = 'test result ' +str(random.randrange(1, 20, 1))
TestResults.append(case.copy())
case.clear()
print TestResults
print client.PutTestResults(TestResults)
Выполненный тест план.
С Чем можно интегрировать?
Есть REST API, методы кастомирузуются, значит ИНТЕГРУЕТСЯ СО ВСЕМ ПОДРЯД"
Полезные ссылки.
● http://www.gurock.com/testrail/
● http://docs.gurock.com/testrail-api2/start
● https://github.com/burnash/gspread
Вопросы?
Голов Антон
lilac@cn.ru
skype: golov.anton

TestRail. Некоторые возможности интеграции.

  • 1.
    TestRail. Некоторые возможности интеграции. какпомочь ручному тестированию Голов Антон skype: golov.anton email: lilac@cn.ru
  • 2.
    ● Что такоеtest rail? ● Как можно автоматизировать общение с ним? ● Некоторые полезные возможности. ● С чем можно интегрировать? О чем будем говорить
  • 3.
    Немного теории Test case— это проверка. "Выполни тест-кейс по вводу отрицательных значений" = проведи проверку такую-то и проверь, что результат будет такой-то. Test suit - набор кейсов объединенных по какому-то принципу, как правило логическому. Test plan- план тестирования, помимо кейсов содержит конфигурации тестирования, сроки проведения и ответственного.
  • 4.
    Что такое TestRail Системахранения и управления тест кейсами как ручными так и автоматическими, для автотестов можно использовать вместо git и хранитьобновлять кейсы и наборы кейсов
  • 5.
    Что можно делатьи как применять? ● Необходимо описать и стандартизировать процесс тестирования в вашем проекте. ● Выбрать ключевые точки где необходимо применять автоматизацию. ● Автоматизировать. :-)
  • 6.
    Как можно автоматизироватьобщение с ним? С помощью Python и не только:-) Плюсы: ● Rest API ○ С доступом к каждой сущности проекта ● Очень простое API ● API отдает json Минусы: ● Очень простое API - мало методов, есть только базовые.
  • 7.
    Некоторые полезные возможности ●Импорт из файла или googledocs. ● Экспорт в googledocs по формату ● Подготовка test run ● Выполнение test run
  • 8.
    Импорт из файла,googledocs. Для импорта будем использовать следующую карту импорта: case.map title -> Title custom_steps -> Steps custom_expected -> Expected Result estimate -> Estimate custom_preconds -> Preconditions Метод для загрузки карты импорта: def ImportCaseMap(mapfile): result_map = [] filemap = open(mapfile) for line in filemap: split_line = line.split("->") split_line[0] = split_line[0].strip() split_line[1] = split_line[1].strip() result_map.append(split_line) filemap.close() return result_map
  • 9.
    Собственно сама загрузкав testrail def ImportCases(self, cases, section_id, map): map_list = ImportCaseMap(map) good_case = {} good_cases = [] for case in cases: for item in map_list: good_case[item[0]] = case[item[1]] good_cases.append(good_case.copy()) good_case.clear() for case in good_cases: self.send_post("add_case/" + str(section_id), case) return None ● кейсы в виде списка словарей ● список полей карты импорта ● ID секции
  • 10.
    Экспорт в гуглпо формату. Готовим данные def PrepareUtest(self, temp_cases): # prepare cases for u test temp_cases = self.send_get("get_cases/" + get_project + "&suite_id=" + get_suite) result = [] int_case = {} i = 1
  • 11.
    Экспорт в гуглпо формату. Готовим данные for temp_case in temp_cases: if temp_case["custom_steps_separated"] is not None: for item_2 in temp_case["custom_steps_separated"]: int_case["#"] = i int_case["Title"] = temp_case["title"] int_case["Section"] = section_name(temp_case ["section_id"]) int_case["Precondition"] = temp_case ["custom_preconds"] int_case["Steps"] = item_2["content"] int_case["Result"] = item_2["expected"] int_case["Estimate"] = temp_case["estimate"] result.append(int_case.copy()) i += 1 int_case.clear()
  • 12.
    Экспорт в гуглпо формату. Готовим данные else: int_case["#"] = i int_case["Title"] = temp_case["title"] int_case["Section"] = section_name(temp_case["section_id"]) int_case["Precondition"] = temp_case["custom_preconds"] int_case["Steps"] = temp_case["custom_steps"] int_case["Result"] = temp_case["custom_expected"] int_case["Estimate"] = temp_case["estimate"] result.append(int_case.copy()) i += 1 int_case.clear() return result
  • 13.
    Экспорт в гуглпо формату. Отдаем гуглу def PutCasesToGoogle(filename, key, current_case): # Google put in test cases by u-test format json_key = json.load(open(key)) scope = ['https://spreadsheets.google.com/feeds'] credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'].encode(), scope) gc = gspread.authorize(credentials) wks = gc.open(filename).sheet1 i = 10 for case in current_case: wks.update_acell("A" + str(i), case["#"]) wks.update_acell("B" + str(i), case["Title"]) wks.update_acell("C" + str(i), case["Section"]) wks.update_acell("D" + str(i), case["Precondition"]) wks.update_acell("E" + str(i), case["Steps"]) wks.update_acell("F" + str(i), case["Result"]) wks.update_acell("H" + str(i), case["Estimate"]) i += 1 return None
  • 14.
    Подготовка TestRun def AddTestPlan(self,project_id, suits, plan_name=str): testruns = {} testruns['entries'] = [] testruns['name'] = plan_name for item in suits: testruns['entries'].append({"suite_id": item, "name": self.section_name(item), "include_all": True}) result = self.send_post("add_plan/" + str(project_id), testruns) return result Что передаем: ● идентификатор проекта ● набор тестсьютов ● название тест плана Что получаем: ● id тест плана и его данные.
  • 15.
    Закрытие TestRun. Получениетестов. def GetTestPlan(self, plan_id): tests = [] run_ids = [] testplan = self.send_get("get_plan/" + str(plan_id)) for item in testplan['entries']: for run in item['runs']: run_ids.append(run['id']) for item in run_ids: tests.append(self.send_get("get_tests/" + str(item))) return tests Что передаем: ● номер тест плана в системе ● разбираем ответ сервера и возвращаем список тестов для выполнения Что получаем: ● список словарей с тестами
  • 16.
    Закрытие TestRun. Передачарезультатов тестов. def PutTestResults(self, TestResults): result = [] for item in TestResults: result.append(self.send_post("add_result/" + str(item. pop('case_id')), item)) return result Что передаем: ● Список результатов тестов из вашей системы тестирования в виде списка словарей где указан идентификатор прогона и тесты с результатами. ● Идентификатор плана Что получаем: ● ответ от Testrail
  • 17.
    Пример использования. Получаемкейсы из гуглодока. import testrail, json, gspread, random from oauth2client.client import SignedJwtAssertionCredentials #get cases from file json_key = json.load(open("My Project-5244905c20f9.json")) scope = ['https://spreadsheets.google.com/feeds'] credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'].encode(), scope) gc = gspread.authorize(credentials) my_spreadsheet = gc.open_by_url("https://docs.google.com/spreadsheets/d/1W753C_9CpNwN7_vFPYv- uL5X64kFKwA7eyRFBMT2ExE/edit#gid=580422902") my_rows = my_spreadsheet.get_worksheet(0).get_all_records()
  • 18.
    Пример использования. создаемподключение, импортируем кейсы и создаем тестплан # get connect client = testrail.APIClient("http://localhost:8888/testrail") client.user = "lilac@cn.ru" client.password = "12345" # import cases client.ImportCases(my_rows[0:2], 2, 'case.map') client.AddTestPlan(1, suits, "testing plan") tests = client.GetTestPlan(1) TestResults = [] case = {} state = [1, 2, 4, 5]
  • 19.
    Пример использования. Получаемрезультат Проверок и отдаем в тестрейл. for item in tests: for item_2 in item: case['case_id'] = item_2['id'] case['status_id'] = random.choice(state) case['comment'] = 'test comment ' + str(random.randrange(1, 5, 1)) case['actual'] = 'test result ' +str(random.randrange(1, 20, 1)) TestResults.append(case.copy()) case.clear() print TestResults print client.PutTestResults(TestResults)
  • 20.
  • 21.
    С Чем можноинтегрировать? Есть REST API, методы кастомирузуются, значит ИНТЕГРУЕТСЯ СО ВСЕМ ПОДРЯД"
  • 22.
    Полезные ссылки. ● http://www.gurock.com/testrail/ ●http://docs.gurock.com/testrail-api2/start ● https://github.com/burnash/gspread
  • 23.