От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внутренности JIRA

SQALab
SQALabSQALab
От Зефира в коробке к
Structure Zephyr
или
Как тест-менеджеру
перекроить внутренности JIRA
Никита Налютин
Experian
Предупреждение
В презентации есть
быдлокод (с багами) грязные трюки
и
Код здесь: https://github.com/p1ne/jira-zephyr-plus-structure/
О чем будем говорить
• Что такое Zephyr и Structure
• Зачем дружить Zephyr и Structure
• Как влезть в JIRA скриптами
• Как влезть в БД JIRA
• Как влезть в форматирование страниц
• Как этим всем сделать всем хорошо
• Как этого не делать
• …и о муми-троллях…
Structure – как все красиво организовать
marketplace.atlassian.com/plugins/com.almworks.jira.structure
Zephyr - как выглядят тесты
marketplace.atlassian.com/plugins/com.thed.zephyr.je
Хотим вот такой вид тестов
Хотим вот такую отчетность
Проблема
• Тест и прогон теста – разные сущности
• Статусы тестов – поля прогона теста, а не теста
• Нужен механизм проброса статуса теста на уровень теста
• Статус теста может быть разным в разных версиях/прогонах
• Выход – поля
• Latest test status
• Latest test execution
Скриптовые поля: Adaptivist Script Runner
marketplace.atlassian.com/plugins/com.onresolve.jira.groovy.groovyrunner/
Вариант реализации: ZAPI
"http://jira/rest/zapi/latest/execution?issueId=" + issueID
URLConnection urlConnection = url.openConnection();
…
BufferedReader reader = new BufferedReader( new
InputStreamReader(urlConnection.getInputStream()));
StringBuffer response = new StringBuffer();
…
def slurper = new JsonSlurper()
def result = slurper.parseText(response.toString())
if (result.recordsCount.toInteger() > 0) return
result.executions[0].versionName;
marketplace.atlassian.com/plugins/com.thed.zephyr.zapi/
Как увидеть таблицы плагинов
Как попробовать извлечь данные
marketplace/plugins/info.renjithv.jira.plugins.sysadmin.homedirectorybrowser
Вариант реализации: из базы
def delegator =
ComponentAccessor.getComponent(DelegatorInterface)
String helperName = delegator.getGroupHelperName("default");
StringBuffer sb = new StringBuffer()
def sqlStmt = ”...";
Connection conn =
ConnectionFactory.getConnection(helperName);
Sql sql = new Sql(conn)
sql.eachRow(sqlStmt) {
sb << "${it.status}”
def statusName = status[sb.toString()][0]
}
Как выбрать данные в скрипте
sqlStmt = "SELECT issue_id FROM ao_7deabf_schedule
where project_id = " + projectId + " and
(date_created between '" + timestamp.format(10.minutes.ago) +
"' and '" + timestamp.format(0.minutes.from.now) + "'
or executed_on between '" + (unixTime -
10*60*1000).toString() + "' and '" + unixTime.toString() +
"')
order by date_created desc";
Почему данные неактуальны?
• У Zephyr нет событий, означающих обновление test run
• JIRA кеширует значения атрибутов
• Поиск JQL работает исходя из кэша
• Частичное обновление кэша работает на весь проект
• Решение – периодическая перестройка кэша
Реиндекс и поиск: правильно,
но не работает
• Проблема: При попытке искать по кастом полям ничего не
находится или находится не все или не сразу
• Решение: само пройдет.
• Не проходит
• Решение: enableCache = {-> false}
• Не дает искать в принципе
Реиндекс: правильно,
но ооооочень долго
Пинаем реиндекс:
почти работает
def issueIndexManager =
ComponentAccessor.getIssueIndexManager();
def events = ComponentAccessor.getIssueEventManager();
sql.eachRow(sqlStmt) {
def issue =
ComponentAccessor.getIssueManager().getIssueObject(it.issue_i
d.toLong());
issueIndexManager.reIndex(issue);
events.dispatchEvent(EventType.ISSUE_UPDATED_ID, issue,
user, false);
}
Запуск реиндекса
• com.onresolve.jira.groovy.GroovyService – не заработало
• NSSM и периодический запуск ScriptRunner через POST
curl "http://jira/rest/scriptrunner/latest/user/exec/" ^
-H "Host: jira" ^
-H "Accept: application/json, text/javascript, */*; q=0.01" ^
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" ^
-H "X-Atlassian-Token: nocheck" ^
-H "X-Requested-With: XMLHttpRequest" ^
-H "Referer:
http://jira/plugins/servlet/scriptrunner/console?section=script_console" ^
--data "scriptText=&scriptFile=reindex.groovy&htmlText=&jsText="
https://nssm.cc/ https://curl.haxx.se/
А еще хотим выполнять тесты…
SELECT s.status, v.vname, s.id
FROM ao_7deabf_schedule s, projectversion v
WHERE s.project_id=" + projectId +
" and s.issue_id=" + issueId +
" and s.version_id = v.id
order by s.date_created desc
limit 1";
А еще хотим выполнять тесты…
if (!versionName.equals("") &&
(statusName.equals("UNEXECUTED") ||
statusName.equals("IN PROGRESS")) ) …
<a href="/secure/enav/#/" + executionId + "">
<span
class="trigger-label">Continue exec
</span>
</a>
А еще хотим выполнять тесты…
if (versionName.equals("")
<a id="zephyr-je-add-execute"
title="Execute Test"
class="toolbar-trigger viewissue-add-execute”
href="/secure/AddExecute!AddExecute.jspa?id=" +
issueId + "">
<span class="trigger-label">Exec new
</span>
</a>
Что делать с форматированием и поиском
coloredStatus = ”
<div class="labels exec-status-container">
<dd style="background-color: " +
statusColor + "">” + statusName +
"</dd></div>";
status = statusName
А еще хотим быстро планировать
А еще хотим экспорт тест-плана в документ
• Поле Preview, которое начинается с </td>
retStr += "</td></tr><tr style="width: 100%;">
<td colspan="10" style="font-size: 10pt;">”
retStr += wikiRenderer.render(issue.getDescription(), null)
retStr += "<br/>"
А еще хотим экспорт тест-плана в документ
Вопросы?
Код здесь: https://github.com/p1ne/jira-zephyr-plus-structure/
1 of 27

Recommended

Визуализация покрытия автоматизированными UI тестами by
Визуализация покрытия автоматизированными UI тестамиВизуализация покрытия автоматизированными UI тестами
Визуализация покрытия автоматизированными UI тестамиSQALab
5.9K views48 slides
Грязная автоматизация by
Грязная автоматизацияГрязная автоматизация
Грязная автоматизацияSQALab
1.5K views38 slides
Postman by
PostmanPostman
PostmaniThink
430 views83 slides
Github Flow. Тестировщики против тестирования by
Github Flow. Тестировщики против тестированияGithub Flow. Тестировщики против тестирования
Github Flow. Тестировщики против тестированияSQALab
4.5K views60 slides
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg by
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
2K views19 slides
CodeFest 2014. Макаров Н. — Selenium Grid. OK Version by
CodeFest 2014. Макаров Н. — Selenium Grid. OK VersionCodeFest 2014. Макаров Н. — Selenium Grid. OK Version
CodeFest 2014. Макаров Н. — Selenium Grid. OK VersionCodeFest
1.5K views47 slides

More Related Content

What's hot

Selenium grid on-demand by
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demandSQALab
701 views146 slides
Типичные ошибки начинающих писать тесты на WebDriver by
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
55.4K views31 slides
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти by
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQAFest
575 views75 slides
Let's Talk About Junit 5 by
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5SQALab
1.4K views42 slides
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков by
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
235 views49 slides
Spring data jee conf by
Spring data jee confSpring data jee conf
Spring data jee confEvgeny Borisov
4.2K views40 slides

What's hot(20)

Selenium grid on-demand by SQALab
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demand
SQALab701 views
Типичные ошибки начинающих писать тесты на WebDriver by Igor Khrol
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol55.4K views
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти by QAFest
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QAFest575 views
Let's Talk About Junit 5 by SQALab
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5
SQALab1.4K views
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков by corehard_by
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by235 views
"Опыт создания системы управления сборкой и тестированием" (слайдкаст) by SPB SQA Group
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
SPB SQA Group654 views
Автоматизация функционального тестирования REST API by Pavel Asanov
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
Pavel Asanov485 views
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн... by Ontico
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ontico1.6K views
Формальная верификация кода на языке Си by Positive Hack Days
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
Positive Hack Days1.1K views
Оценка качества автотестов by SQALab
Оценка качества автотестовОценка качества автотестов
Оценка качества автотестов
SQALab34.8K views
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней by SkillFactory
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
SkillFactory11.3K views
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS... by Mail.ru Group
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Mail.ru Group4.7K views
Логгирование. Зачем? Когда? Сколько? by Ivan Fedorov
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?
Ivan Fedorov2K views
Selenium, а давай подождем? by SQALab
Selenium, а давай подождем?Selenium, а давай подождем?
Selenium, а давай подождем?
SQALab4.4K views
Архитектура автоматизированных тестов by SQALab
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестов
SQALab4.8K views
Akka: как я перестал бояться и полюбил асинхронный код by Roman Grebennikov
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
Roman Grebennikov2.4K views
Микросервисы для автоматизации тестирования - опыт "Одноклассников" by SQALab
Микросервисы для автоматизации тестирования - опыт "Одноклассников"Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
SQALab1.8K views
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ... by Badoo Development
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
Badoo Development7.8K views

Similar to От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внутренности JIRA

Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки by
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиGonchik Tsymzhitov
250 views48 slides
Automation Functional Testing in Agile Projects by
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
1K views41 slides
Java black box profiling by
Java black box profilingJava black box profiling
Java black box profilingaragozin
581 views23 slides
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн... by
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...Nikita Nalyutin
703 views31 slides
D2D Pizza JS Илья Беда "Куда мы все катимся?" by
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"Dev2Dev
121 views86 slides
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной by
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
396 views47 slides

Similar to От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внутренности JIRA(20)

Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки by Gonchik Tsymzhitov
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Gonchik Tsymzhitov250 views
Automation Functional Testing in Agile Projects by Andrey Rebrov
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
Andrey Rebrov1K views
Java black box profiling by aragozin
Java black box profilingJava black box profiling
Java black box profiling
aragozin581 views
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн... by Nikita Nalyutin
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Nikita Nalyutin703 views
D2D Pizza JS Илья Беда "Куда мы все катимся?" by Dev2Dev
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Dev2Dev121 views
View как чистая функция от состояния базы данных - Илья Беда, bro.agency by it-people
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people818 views
Python Meetup by iQSpace
Python Meetup Python Meetup
Python Meetup
iQSpace306 views
django-and-postgresql by Oleg Churkin
django-and-postgresqldjango-and-postgresql
django-and-postgresql
Oleg Churkin364 views
Grail: шаги для ваших Python-тестов by CodeFest
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
CodeFest3.7K views
Java Ahead-Of-Time compilation by Nikita Lipsky
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
Nikita Lipsky1.7K views
Grail - CodeFest'2015 by Igor Khrol
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015
Igor Khrol30.7K views
Организация процесса ручного тестирования by IT61
Организация процесса ручного тестированияОрганизация процесса ручного тестирования
Организация процесса ручного тестирования
IT611.4K views
Всеволод Поляков "История одного мониторинга" by Fwdays
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
Fwdays623 views
Система обработки бизнес-логики server-side приложения на Groovy by Regn
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
Regn525 views
Стабы для фронтенда - Никита Мостовой (HeadHunter) by AvitoTech
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)
AvitoTech197 views
ACC - конструируем тест-план методом Google by SQALab
ACC - конструируем тест-план методом GoogleACC - конструируем тест-план методом Google
ACC - конструируем тест-план методом Google
SQALab8.7K views
Человекопонятные отчёты by bearoff
Человекопонятные отчётыЧеловекопонятные отчёты
Человекопонятные отчёты
bearoff817 views
Сенцов Сергей "Приемы оптимизаций Desktop приложений" by Yulia Tsisyk
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Yulia Tsisyk665 views
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а... by QAFest
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QAFest46.8K views

More from SQALab

Готовим стажировку by
Готовим стажировкуГотовим стажировку
Готовим стажировкуSQALab
2.6K views18 slides
Куда приводят мечты? или Искусство развития тестировщика by
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаSQALab
1.7K views16 slides
Оптимизация Selenium тестов и ускорение их поддержки by
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиSQALab
1.2K views36 slides
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования by
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияSQALab
774 views21 slides
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J... by
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...SQALab
800 views18 slides
Continuous performance testing by
Continuous performance testingContinuous performance testing
Continuous performance testingSQALab
645 views23 slides

More from SQALab(20)

Готовим стажировку by SQALab
Готовим стажировкуГотовим стажировку
Готовим стажировку
SQALab2.6K views
Куда приводят мечты? или Искусство развития тестировщика by SQALab
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
SQALab1.7K views
Оптимизация Selenium тестов и ускорение их поддержки by SQALab
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
SQALab1.2K views
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования by SQALab
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
SQALab774 views
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J... by SQALab
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
SQALab800 views
Continuous performance testing by SQALab
Continuous performance testingContinuous performance testing
Continuous performance testing
SQALab645 views
Конфиги вместо костылей. Pytestconfig и зачем он нужен by SQALab
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
SQALab717 views
Команда чемпионов в ИТ стихии by SQALab
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
SQALab727 views
API. Серебряная пуля в магазине советов by SQALab
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
SQALab539 views
Добиваемся эффективности каждого из 9000+ UI-тестов by SQALab
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
SQALab580 views
Делаем автоматизацию проектных KPIs by SQALab
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
SQALab361 views
Вредные привычки в тест-менеджменте by SQALab
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
SQALab655 views
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации by SQALab
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
SQALab453 views
Как hh.ru дошли до 500 релизов в квартал без потери в качестве by SQALab
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
SQALab722 views
Стили лидерства и тестирование by SQALab
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
SQALab463 views
"Давайте не будем про качество" by SQALab
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
SQALab543 views
Apache.JMeter для .NET-проектов by SQALab
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
SQALab715 views
Тестирование геолокационных систем by SQALab
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
SQALab340 views
Лидер или босс? Вот в чем вопрос by SQALab
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
SQALab600 views
Истинная сила тестировщика - информация by SQALab
Истинная сила тестировщика - информацияИстинная сила тестировщика - информация
Истинная сила тестировщика - информация
SQALab1.7K views

От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внутренности JIRA

  • 1. От Зефира в коробке к Structure Zephyr или Как тест-менеджеру перекроить внутренности JIRA Никита Налютин Experian
  • 2. Предупреждение В презентации есть быдлокод (с багами) грязные трюки и Код здесь: https://github.com/p1ne/jira-zephyr-plus-structure/
  • 3. О чем будем говорить • Что такое Zephyr и Structure • Зачем дружить Zephyr и Structure • Как влезть в JIRA скриптами • Как влезть в БД JIRA • Как влезть в форматирование страниц • Как этим всем сделать всем хорошо • Как этого не делать • …и о муми-троллях…
  • 4. Structure – как все красиво организовать marketplace.atlassian.com/plugins/com.almworks.jira.structure
  • 5. Zephyr - как выглядят тесты marketplace.atlassian.com/plugins/com.thed.zephyr.je
  • 6. Хотим вот такой вид тестов
  • 7. Хотим вот такую отчетность
  • 8. Проблема • Тест и прогон теста – разные сущности • Статусы тестов – поля прогона теста, а не теста • Нужен механизм проброса статуса теста на уровень теста • Статус теста может быть разным в разных версиях/прогонах • Выход – поля • Latest test status • Latest test execution
  • 9. Скриптовые поля: Adaptivist Script Runner marketplace.atlassian.com/plugins/com.onresolve.jira.groovy.groovyrunner/
  • 10. Вариант реализации: ZAPI "http://jira/rest/zapi/latest/execution?issueId=" + issueID URLConnection urlConnection = url.openConnection(); … BufferedReader reader = new BufferedReader( new InputStreamReader(urlConnection.getInputStream())); StringBuffer response = new StringBuffer(); … def slurper = new JsonSlurper() def result = slurper.parseText(response.toString()) if (result.recordsCount.toInteger() > 0) return result.executions[0].versionName; marketplace.atlassian.com/plugins/com.thed.zephyr.zapi/
  • 12. Как попробовать извлечь данные marketplace/plugins/info.renjithv.jira.plugins.sysadmin.homedirectorybrowser
  • 13. Вариант реализации: из базы def delegator = ComponentAccessor.getComponent(DelegatorInterface) String helperName = delegator.getGroupHelperName("default"); StringBuffer sb = new StringBuffer() def sqlStmt = ”..."; Connection conn = ConnectionFactory.getConnection(helperName); Sql sql = new Sql(conn) sql.eachRow(sqlStmt) { sb << "${it.status}” def statusName = status[sb.toString()][0] }
  • 14. Как выбрать данные в скрипте sqlStmt = "SELECT issue_id FROM ao_7deabf_schedule where project_id = " + projectId + " and (date_created between '" + timestamp.format(10.minutes.ago) + "' and '" + timestamp.format(0.minutes.from.now) + "' or executed_on between '" + (unixTime - 10*60*1000).toString() + "' and '" + unixTime.toString() + "') order by date_created desc";
  • 15. Почему данные неактуальны? • У Zephyr нет событий, означающих обновление test run • JIRA кеширует значения атрибутов • Поиск JQL работает исходя из кэша • Частичное обновление кэша работает на весь проект • Решение – периодическая перестройка кэша
  • 16. Реиндекс и поиск: правильно, но не работает • Проблема: При попытке искать по кастом полям ничего не находится или находится не все или не сразу • Решение: само пройдет. • Не проходит • Решение: enableCache = {-> false} • Не дает искать в принципе
  • 18. Пинаем реиндекс: почти работает def issueIndexManager = ComponentAccessor.getIssueIndexManager(); def events = ComponentAccessor.getIssueEventManager(); sql.eachRow(sqlStmt) { def issue = ComponentAccessor.getIssueManager().getIssueObject(it.issue_i d.toLong()); issueIndexManager.reIndex(issue); events.dispatchEvent(EventType.ISSUE_UPDATED_ID, issue, user, false); }
  • 19. Запуск реиндекса • com.onresolve.jira.groovy.GroovyService – не заработало • NSSM и периодический запуск ScriptRunner через POST curl "http://jira/rest/scriptrunner/latest/user/exec/" ^ -H "Host: jira" ^ -H "Accept: application/json, text/javascript, */*; q=0.01" ^ -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" ^ -H "X-Atlassian-Token: nocheck" ^ -H "X-Requested-With: XMLHttpRequest" ^ -H "Referer: http://jira/plugins/servlet/scriptrunner/console?section=script_console" ^ --data "scriptText=&scriptFile=reindex.groovy&htmlText=&jsText=" https://nssm.cc/ https://curl.haxx.se/
  • 20. А еще хотим выполнять тесты… SELECT s.status, v.vname, s.id FROM ao_7deabf_schedule s, projectversion v WHERE s.project_id=" + projectId + " and s.issue_id=" + issueId + " and s.version_id = v.id order by s.date_created desc limit 1";
  • 21. А еще хотим выполнять тесты… if (!versionName.equals("") && (statusName.equals("UNEXECUTED") || statusName.equals("IN PROGRESS")) ) … <a href="/secure/enav/#/" + executionId + ""> <span class="trigger-label">Continue exec </span> </a>
  • 22. А еще хотим выполнять тесты… if (versionName.equals("") <a id="zephyr-je-add-execute" title="Execute Test" class="toolbar-trigger viewissue-add-execute” href="/secure/AddExecute!AddExecute.jspa?id=" + issueId + ""> <span class="trigger-label">Exec new </span> </a>
  • 23. Что делать с форматированием и поиском coloredStatus = ” <div class="labels exec-status-container"> <dd style="background-color: " + statusColor + "">” + statusName + "</dd></div>"; status = statusName
  • 24. А еще хотим быстро планировать
  • 25. А еще хотим экспорт тест-плана в документ • Поле Preview, которое начинается с </td> retStr += "</td></tr><tr style="width: 100%;"> <td colspan="10" style="font-size: 10pt;">” retStr += wikiRenderer.render(issue.getDescription(), null) retStr += "<br/>"
  • 26. А еще хотим экспорт тест-плана в документ