Я использую python-docx для динамической замены заполнителей.
Текущий код:
для абзаца в документе.paragraphs:if заполнитель в абзаце.text:для запуска в абзаце.runs:run.text = run.text.replace(placeholder, значение)
Пользователь может предоставить: — Номер Epic — ИЛИ URL-адрес Jira Epic
Дополнительные входные данные: — Начало SIT — Конец SIT — Начало UAT — Конец UAT — Заморозка кода — GoLive — Дата плана тестирования — Дата проверки плана тестирования
---
# Источник Jira
Детали Epic хранятся в Jira.
/>Агент должен получить: - Описание - Критерии приемки - Детали дизайна
с использованием API REST Jira.
Аутентификация: - Токен PAT через переменные среды.
---
# Поставщик искусственного интеллекта
Использовать: - Модели GitHub
Рекомендуемая модель: - anthropic/claude-3.7-sonnet
Цель: - создать раздел требований корпоративного качества - создать краткий раздел SQA Scope
---
# Обработка шаблонов DOCX
Будет предоставлен образец шаблона `.docx`.
Сгенерированный план тестирования должен: - сохранить форматирование - сохранить заголовки/нижние колонтитулы - сохранить стили - сохранить таблицы- сохранить выравнивание- сохранить шрифты/цвета
Исходный шаблон НИКОГДА не должен изменяться напрямую.
Рабочий процесс:1. Скопируйте шаблон2. Обновить заполнители3. Сохранить созданный вывод
---
# Поддерживаемые заполнители
Код: Выделить всё
---
# Правил заполнителей
## Сгенерировано ИИ
###
Сгенерировать: - краткую цель корпоративного проекта - максимум 4–5 утверждений - интеллектуальную профессиональную формулировку - краткую и ориентированную на бизнес
###
Сгенерировать: - область SQA высокого уровня - область функционального тестирования - область регрессии, если применимо - поток, на который влияет покрытие
---
# Правила временной шкалы
Если указаны значения временной шкалы: — замените заполнители.
Если значения временной шкалы НЕ указаны: — оставьте заполнители без изменений — отобразите предупреждающее сообщение:
Временные шкалы выпуска (SIT/UAT/GoLive) не были указаны во время создания плана тестирования. Перед рассмотрением и утверждением обновите раздел графика выпуска вручную.
---
# Технические требования
## Язык
Python
---
# Требуемые библиотеки
python-docxrequestspython-dotenvpyyamlopenai
---
# переменных среды
JIRA_BASE_URL=JIRA_EMAIL=JIRA_PAT=
GITHUB_TOKEN=GITHUB_MODEL=anthropic/claude-3.7-sonnet
---
# Рекомендуемый репозиторий Структура
testplan-agent/│├── .github/│ └── copilot-instructions.md│├── config/│ └── settings.yaml│├── шаблоны/│ └── master_testplan.docx│├── подсказки/│ ├── require_prompt.md│ └── sqa_scope_prompt.md│├── Services/│ ├── jira_service.py│ ├── ai_service.py│ ├── docx_service.py│ ├── Placeholder_service.py│ └── logger_service.py│├── модели/│ └── request_models.py│├── utils/│ ├── date_utils.py│ ├── file_utils.py│ └── команда_parser.py│├── вывод/│├── .env├── .gitignore├── main.py├── требования.txt└── README.md
---
# требования.txt
python-docx==1.1.2requests==2.32.3python-dotenv==1.0.1pyyaml==6.0.2openai==1.30.5
---
# .gitignore
_pycache_/*.pyc.envoutput/.idea/.vscode/
---
# .env
JIRA_BASE_URL=https://your-company.atlassian.netJIRA_EMAIL=your-email@company.comJIRA_PAT=your_pat_token
GITHUB_TOKEN=your_github_models_tokenGITHUB_MODEL=anthropic/claude-3.7-sonnet
---
# config/settings.yaml
jira:timeout: 30
docx:template_path: templates/master_testplan.docxoutput_directory: output/
ai:temperature: 0.3max_tokens: 1200
logging:level: INFO
---
# models/request_models.py
from dataclasses import dataclassfrom typing import Необязательно
@dataclassclass TestPlanRequest:epic_id: str
sit_start: Необязательно\[str\] = Нет
sit_end: Необязательный\[str\] = Нет
uat_start: Необязательный\[str\] = Нет
uat_end: Необязательный\[str\] = Нет
code_freeze: Необязательный\[str\] = Нет
go_live: Необязательный\[str\] = Нет
test_plan_date: Необязательный\[str\] = Нет
test_plan_review_date: Необязательный\[str\] = Нет
---
# Services/logger_service.py
импорт журнала
def get_logger(name: str):logging.basicConfig(level=logging.INFO,format="%(asctime)s [%(levelname)s] %(message)s")
return logging.getLogger(name)
---
# Services/placeholder_service.py
PLACEHOLDERS = {"requirements": "","sqa_scope": "","test_plan_date": "","test_plan_review_date": "","sit_start": "","sit_end": "","uat_start": "","uat_end": "","code_freeze": "","go_live": ""
---
# Services/jira_service.py
import osimport Requests from Services.logger_service import get_logger
logger = get_logger(_name_)
class JiraService:
def \__init_\_(self):
self.base_url = os.getenv("JIRA_BASE_URL")
self.email = os.getenv("JIRA_EMAIL")
self.pat = os.getenv("JIRA_PAT")
Код: Выделить всё
url = f"{self.base_url}/rest/api/3/issue/{epic_id}"
response = requests.get(
url,
auth=(self.email, self.pat),
headers={
"Accept": "application/json"
}
)
response.raise_for_status()
data = response.json()
fields = data.get("fields", {})
return {
"summary": fields.get("summary", ""),
"description": fields.get("description", ""),
"acceptance_criteria": fields.get("customfield_acceptancecriteria", ""),
"design_details": fields.get("customfield_designdetails", "")
}
# Services/ai_service.py
import os from openai import OpenAI
class AIService:
def \__init_\_(self):
Код: Выделить всё
self.client = OpenAI(
api_key=os.getenv("GITHUB_TOKEN"),
base_url="https://models.inference.ai.azure.com"
)
self.model = os.getenv("GITHUB_MODEL")
Код: Выделить всё
response = self.client.chat.completions.create(
model=self.model,
messages=\\\[
{
"role": "user",
"content": prompt
}
\\\],
temperature=0.3
)
return response.choices\\\[0\\\].message.content
# Services/docx_service.py
из docx import Documentfrom Services.logger_service import get_logger
logger = get_logger(_name_)
class DocxService:
def load_document(self, template_path: str):
Код: Выделить всё
return Document(template_path)
Код: Выделить всё
for paragraph in document.paragraphs:
if placeholder in paragraph.text:
for run in paragraph.runs:
run.text = run.text.replace(placeholder, value)
Код: Выделить всё
for table in document.tables:
for row in table.rows:
for cell in row.cells:
if placeholder in cell.text:
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.text = run.text.replace(placeholder, value)
Код: Выделить всё
self.replace_placeholder_in_paragraphs(
document,
placeholder,
value
)
self.replace_placeholder_in_tables(
document,
placeholder,
value
)
Код: Выделить всё
for placeholder, value in replacements.items():
if value is None:
continue
self.replace_placeholder_everywhere(
document,
placeholder,
value
)
Код: Выделить всё
document.save(output_path)
# Prompts/requirements_prompt.md
Создайте краткий раздел целей проекта на уровне предприятия.
Правила: – Максимум 5 утверждений – Профессиональные формулировки – Кратко и точно – Упомяните бизнес-цели – Упомяните затрагиваемую функциональность – Избегайте ненужной многословности
---
# Prompts/sqa_scope_prompt.md
Создайте краткий высокоуровневый раздел объема SQA.
Правила: – Упомяните область функционального тестирования — Упомяните область регрессии, если применимо — Упомяните затронутые потоки — Формулировка обеспечения качества предприятия – Будьте краткими
---
# main.py
из datetime import datetime
from Services.jira_service import JiraServicefrom Services.docx_service import DocxServicefrom Services.placeholder_service import PLACEHOLDERS
def main():
epic_id = "EPIC-12345"
jira_service = JiraService()
docx_service = DocxService()
epic = jira_service.get_epic_details(epic_id)
document = docx_service.load_document(
Код: Выделить всё
"templates/master_testplan.docx"
замены = {
Код: Выделить всё
PLACEHOLDERS\\\["requirements"\\\]: "AI generated requirements",
PLACEHOLDERS\\\["sqa_scope"\\\]: "AI generated sqa scope",
PLACEHOLDERS\\\["test_plan_date"\\\]: datetime.now().strftime("%d-%b-%Y")
Код: Выделить всё
document,
replacements
output_path = f"output/TP\_{epic_id}\_{datetime.now().strftime('%Y%m%d\_%H%M')}.docx"
docx_service.save_document(
Код: Выделить всё
document,
output_path
print(f"Generated: {output_path}")
if _name_ == "_main_":main()
---
# Команда чата GitHub Copilot
/generate-testplan EPIC-12345
Необязательно:
/generate-testplan EPIC-12345 --sitStart=10-May-2026 --sitEnd=20-May-2026
---
# Соглашение об именовании выходных данных
TP__.docx
Пример:
TP_EPIC-12345_20260510_1030.docx
---
# Принципы проектирования предприятия
Используйте: - модульные сервисы - детерминированная замена заполнителя – ИИ только для интеллектуальной генерации текста – архитектура, управляемая конфигурацией – учетные данные на основе переменных среды – неразрушающая обработка шаблонов
Избегайте: – жестко запрограммированных значений – изменения исходных шаблонов – тесно связанной логики AI + DOCX – гигантских подсказок – монолитной реализации
---
# Осталось незаконченной работы
1. Реальные идентификаторы настраиваемых полей Jira2. Безопасная замена DOCX корпоративного уровня3. Оперативная оркестровка AI4. Парсинг URL-адресов Jira5. Парсер команд6. Обработка предупреждений об отсутствии сроков7. Структурированное журналирование8. Руководство по настройке README9. Инструкции GitHub Copilot10. Обработка производственных ошибок
Мобильная версия