AI-система автоматичної генерації тестових сценаріїв

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
AI-система автоматичної генерації тестових сценаріїв
Середній
від 1 дня до 3 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

AI-автогенерація тест-сценаріїв

Тест-сценарій — це не тест. Це опис ситуації, яку потрібно протестувати: користувач, дія, умови, очікуваний результат. Написання тест-сценаріїв з вимог — монотонна робота, яка при дефіциті часу робиться наспіх або не робиться взагалі. AI-генератор створює тест-сценарії з user stories, специфікацій та ER-діаграм, охоплюючи позитивні шляхи, негативні кейси та граничні умови.

Генерація з user stories

from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from typing import Optional
import json

class TestScenario(BaseModel):
    id: str
    title: str
    type: str           # positive / negative / boundary / edge_case
    priority: str       # P1 / P2 / P3
    preconditions: list[str]
    steps: list[str]
    expected_result: str
    tags: list[str]
    related_requirement: str

class TestScenarioGenerator:
    GENERATION_PROMPT = """Ти — досвідчений QA-інженер. Створи тест-сценарії з вимоги.

Вимога: {requirement}
Acceptance Criteria:
{acceptance_criteria}

Створи тест-сценарії трьох типів:
1. **Позитивні** (happy path + основні варіанти)
2. **Негативні** (невалідні дані, заборонені операції)
3. **Граничні** (мінімальні/максимальні значення, порожні дані)

Для кожного сценарію:
- Заголовок (дія + умова)
- Предумови
- Кроки (конкретні, не "натисни кнопку", а "натисни кнопку 'Зберегти' у формі реєстрації")
- Очікуваний результат (вимірюваний)
- Пріоритет (P1 — критичний бізнес-флоу, P2 — важливий, P3 — другорядний)

Повернення JSON-масиву TestScenario."""

    def __init__(self):
        self.llm = ChatOpenAI(model="gpt-4o", temperature=0.2)

    def generate_from_user_story(
        self,
        user_story: str,
        acceptance_criteria: list[str],
        domain_context: str = ""
    ) -> list[TestScenario]:
        ac_text = "\n".join([f"- {ac}" for ac in acceptance_criteria])

        prompt = self.GENERATION_PROMPT.format(
            requirement=user_story + ("\n\nКонтекст домена: " + domain_context if domain_context else ""),
            acceptance_criteria=ac_text
        )

        response = self.llm.invoke(prompt)
        scenarios_data = json.loads(response.content)

        return [TestScenario(**s) for s in scenarios_data]

    def generate_from_api_spec(self, openapi_spec: dict) -> list[TestScenario]:
        """Генерує сценарії з OpenAPI специфікації"""
        scenarios = []
        for path, methods in openapi_spec.get("paths", {}).items():
            for method, spec in methods.items():
                endpoint_scenarios = self._generate_endpoint_scenarios(
                    path, method, spec
                )
                scenarios.extend(endpoint_scenarios)
        return scenarios

    def _generate_endpoint_scenarios(
        self,
        path: str,
        method: str,
        spec: dict
    ) -> list[TestScenario]:
        prompt = f"""Створи тест-сценарії для API endpoint.

Endpoint: {method.upper()} {path}
Опис: {spec.get('summary', '')}
Параметри: {json.dumps(spec.get('parameters', []), ensure_ascii=False, indent=2)}
Request body: {json.dumps(spec.get('requestBody', {}), ensure_ascii=False, indent=2)}
Responses: {json.dumps(spec.get('responses', {}), ensure_ascii=False, indent=2)}

Сценарії:
- 200 (success) з валідними даними
- 400 (bad request) — невалідні параметри
- 401/403 — авторизація
- 404 — ресурс не знайдено
- Граничні значення для числових параметрів
- Специфічні для цього endpoint (на основі опису)

Повернення JSON-масиву тест-сценаріїв."""

        response = self.llm.invoke(prompt)
        return json.loads(response.content)

Інтеграція з Jira + TestRail

from jira import JIRA
import testrail

class TestScenarioSync:
    def push_to_testrail(
        self,
        scenarios: list[TestScenario],
        project_id: int,
        suite_id: int
    ):
        """Публікує сценарії в TestRail"""
        client = testrail.APIClient(TESTRAIL_URL)
        client.user = TESTRAIL_USER
        client.password = TESTRAIL_KEY

        for scenario in scenarios:
            client.send_post(
                f'add_case/{suite_id}',
                {
                    'title': scenario.title,
                    'type_id': self._get_type_id(scenario.type),
                    'priority_id': self._get_priority_id(scenario.priority),
                    'custom_preconds': '\n'.join(scenario.preconditions),
                    'custom_steps': '\n'.join([
                        f"{i+1}. {step}"
                        for i, step in enumerate(scenario.steps)
                    ]),
                    'custom_expected': scenario.expected_result,
                    'refs': scenario.related_requirement
                }
            )

    def pull_from_jira_and_generate(
        self,
        jira_client: JIRA,
        sprint_id: str
    ) -> list[TestScenario]:
        """Отримує user stories зі спринту та генерує сценарії"""
        issues = jira_client.search_issues(
            f'sprint = {sprint_id} AND issuetype = Story AND status != Done'
        )
        all_scenarios = []
        for issue in issues:
            scenarios = self.generator.generate_from_user_story(
                user_story=issue.fields.summary,
                acceptance_criteria=self._extract_ac(issue.fields.description),
            )
            all_scenarios.extend(scenarios)
        return all_scenarios

Матриця покриття вимог

def build_coverage_matrix(
    requirements: list[dict],
    scenarios: list[TestScenario]
) -> dict:
    """Будує матрицю трасування вимог → сценарії"""
    matrix = {}
    for req in requirements:
        req_id = req["id"]
        covered_scenarios = [
            s for s in scenarios
            if s.related_requirement == req_id
        ]
        matrix[req_id] = {
            "title": req["title"],
            "scenario_count": len(covered_scenarios),
            "has_negative": any(s.type == "negative" for s in covered_scenarios),
            "has_boundary": any(s.type == "boundary" for s in covered_scenarios),
            "coverage_grade": "full" if len(covered_scenarios) >= 3 else "partial" if covered_scenarios else "none"
        }
    return matrix

Кейс: ERP-система, 200+ user stories на квартал. QA-команда (4 людини) не встигала писати сценарії до початку спринту — тест-планування йшло паралельно з розробкою. Після впровадження AI-генератора: 200 user stories → 1100 тест-сценаріїв за 2 години (включаючи перевірку). Час QA на написання сценаріїв: 3 дні → 4 години (ревю та корекція). P1-сценарії покриті на 100% перед стартом розробки.

Строки: генератор з user stories + інтеграція з Jira: 2–3 тижні; з TestRail/Xray та матрицею трасування: 4–5 тижнів.