Как мне спроектировать генератор планов тестирования искусственного интеллекта на основе Python с использованием API-интPython

Программы на Python
Ответить
Anonymous
 Как мне спроектировать генератор планов тестирования искусственного интеллекта на основе Python с использованием API-инт

Сообщение Anonymous »

Я создаю процессор шаблонов DOCX на основе Python для создания планов тестирования качества. Шаблон DOCX содержит заполнители, такие как:
Я использую 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")
def get_epic_details(self, epic_id: str):

Код: Выделить всё

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")
def ignore_content(self, Prompt: str):

Код: Выделить всё

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)
def replace_placeholder_in_paragraphs(self, document, заполнитель, значение):

Код: Выделить всё

for paragraph in document.paragraphs:

if placeholder in paragraph.text:

for run in paragraph.runs:

run.text = run.text.replace(placeholder, value)
def replace_placeholder_in_tables(self, document, заполнитель, значение):

Код: Выделить всё

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)
def replace_placeholder_everywhere(self, document, заполнитель, значение):

Код: Выделить всё

self.replace_placeholder_in_paragraphs(

document,

placeholder,

value

)

self.replace_placeholder_in_tables(

document,

placeholder,

value

)
def update_placeholders(self, document, replaces: dict):

Код: Выделить всё

for placeholder, value in replacements.items():

if value is None:

continue

self.replace_placeholder_everywhere(

document,

placeholder,

value

)
def save_document(self, document, выходной_путь):

Код: Выделить всё

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")
docx_service.update_placeholders(

Код: Выделить всё

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. Обработка производственных ошибок
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»