SlideShare una empresa de Scribd logo
1 de 27
От Зефира в коробке к
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/

Más contenido relacionado

La actualidad más candente

Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ontico
 
Архитектура автоматизированных тестов
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестов
SQALab
 
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
Badoo Development
 

La actualidad más candente (20)

Selenium grid on-demand
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demand
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненавистиQA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
QA Fest 2019. Андрей Солнцев. Десять причин моей ненависти
 
Let's Talk About Junit 5
Let's Talk About Junit 5Let's Talk About Junit 5
Let's Talk About Junit 5
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
"Опыт создания системы управления сборкой и тестированием" (слайдкаст)
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Оценка качества автотестов
Оценка качества автотестовОценка качества автотестов
Оценка качества автотестов
 
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 днейГотовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
Готовимся к Java SE 7 Programmer: от новичка до профессионала за 45 дней
 
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
Алексей Халайджи, Mail.Ru Group, «Как мы автоматизируем UI-тестирование в iOS...
 
Curse of spring boot test [VRN]
Curse of spring boot test [VRN]Curse of spring boot test [VRN]
Curse of spring boot test [VRN]
 
Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?Логгирование. Зачем? Когда? Сколько?
Логгирование. Зачем? Когда? Сколько?
 
Selenium, а давай подождем?
Selenium, а давай подождем?Selenium, а давай подождем?
Selenium, а давай подождем?
 
Архитектура автоматизированных тестов
Архитектура автоматизированных тестовАрхитектура автоматизированных тестов
Архитектура автоматизированных тестов
 
Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
 
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
 

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

Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Nikita Nalyutin
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
Oleg Churkin
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
Regn
 

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

Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлокиДоклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
Доклады с прошедшей JiraMania: про обновления, зависимости и дедлоки
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 
Java black box profiling
Java black box profilingJava black box profiling
Java black box profiling
 
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
Test Labs 2009. Налютин Никита. Тестирование, как средство противодействия вн...
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Python Meetup
Python Meetup Python Meetup
Python Meetup
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015
 
Организация процесса ручного тестирования
Организация процесса ручного тестированияОрганизация процесса ручного тестирования
Организация процесса ручного тестирования
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)
 
ACC - конструируем тест-план методом Google
ACC - конструируем тест-план методом GoogleACC - конструируем тест-план методом Google
ACC - конструируем тест-план методом Google
 
Человекопонятные отчёты
Человекопонятные отчётыЧеловекопонятные отчёты
Человекопонятные отчёты
 
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"Сенцов Сергей "Приемы оптимизаций Desktop приложений"
Сенцов Сергей "Приемы оптимизаций Desktop приложений"
 
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
 

Más de SQALab

Más de SQALab (20)

Готовим стажировку
Готовим стажировкуГотовим стажировку
Готовим стажировку
 
Куда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщикаКуда приводят мечты? или Искусство развития тестировщика
Куда приводят мечты? или Искусство развития тестировщика
 
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержкиОптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
 
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программированияАвтоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
 
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
 
Continuous performance testing
Continuous performance testingContinuous performance testing
Continuous performance testing
 
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нуженКонфиги вместо костылей. Pytestconfig и зачем он нужен
Конфиги вместо костылей. Pytestconfig и зачем он нужен
 
Команда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихииКоманда чемпионов в ИТ стихии
Команда чемпионов в ИТ стихии
 
API. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советовAPI. Серебряная пуля в магазине советов
API. Серебряная пуля в магазине советов
 
Добиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестовДобиваемся эффективности каждого из 9000+ UI-тестов
Добиваемся эффективности каждого из 9000+ UI-тестов
 
Делаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIsДелаем автоматизацию проектных KPIs
Делаем автоматизацию проектных KPIs
 
Вредные привычки в тест-менеджменте
Вредные привычки в тест-менеджментеВредные привычки в тест-менеджменте
Вредные привычки в тест-менеджменте
 
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизацииМощь переполняет с JDI 2.0 - новая эра UI автоматизации
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
 
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качествеКак hh.ru дошли до 500 релизов в квартал без потери в качестве
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
 
Стили лидерства и тестирование
Стили лидерства и тестированиеСтили лидерства и тестирование
Стили лидерства и тестирование
 
"Давайте не будем про качество"
"Давайте не будем про качество""Давайте не будем про качество"
"Давайте не будем про качество"
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
Тестирование геолокационных систем
Тестирование геолокационных системТестирование геолокационных систем
Тестирование геолокационных систем
 
Лидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопросЛидер или босс? Вот в чем вопрос
Лидер или босс? Вот в чем вопрос
 
Истинная сила тестировщика - информация
Истинная сила тестировщика - информацияИстинная сила тестировщика - информация
Истинная сила тестировщика - информация
 

От Зефира в коробке к 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. А еще хотим экспорт тест-плана в документ